Hadoop-Hbase-ElasticSearch(ES)-Janusgraph環境搭建
Hadoop-Hbase-ElasticSearch(ES)-Janusgraph偽分散式環境搭建
版本選型
- janusgraph與開發環境的相容性資訊可參考https://github.com/JanusGraph/janusgraph/releases/中的Tested Compatibility一節,本文選擇janusgraph的儲存後端為Hbase 1.3.1,索引後端為janusgraph包下自帶的ElasticSearch,Java取1.8.0_171;
- 注,本文演示所用OS為新安裝得到的centos 7 64bit(安裝檔名如CentOS-7-x86_64-DVD-1804.iso)
前置準備(vim、lrzsz、unzip、useradd、ssh、java)
vim
為了後續的操作便利,安裝vim文字編輯器(引數y代表用yes回答安裝過程中的所有問題)
yum -y install vim*
對vim做一些基本的配置,開啟vim的配置檔案(ubuntu下路徑可能為/etc/vim/vimrc)
sudo vim /etc/vimrc
在配置檔案末新增如下內容並儲存
set nu "在左側顯示行號
set tabstop=4 "tab 長度設定為 4
set nobackup "覆蓋檔案時不備份
set ruler "在右下角顯示游標位置的狀態行
set autoindent "自動縮排
lrzsz
為了後續通過rz上傳sz下載檔案,安裝lrzsz
yum -y install lrzsz
unzip
為了後續的安裝包解壓,安裝unzip
yum install -y unzip
useradd
新增使用者hhje並設定密碼(來自hadoop、hbase、janusgraph、elasticsearch的首字母)
useradd -m hhjs -s /bin/bash
passwd hhj
為了後續的操作便利,為其新增許可權
在root使用者下,開啟/etc/sudoers檔案
vim /etc/sudoers
並在“root ALL=(ALL) ALL”一行後新增如下內容並儲存
hhje ALL=(ALL) ALL
ssh
centos自帶ssh相關元件,這裡為了後續的操作便利,配置ssh的本地免密登入
首先,通過ssh本地登入並退出(以生成~/.ssh目錄)
ssh localhost
exit
然後,進入相應目錄,生成金鑰,新增金鑰到授權檔案,修改授權檔案許可權
cd ~/.ssh/
ssh-keygen -t rsa # 不斷回車即可
cat id_rsa.pub >> authorized_keys
$chmod 600 ./authorized_keys
到此就算配置完成了,不過在centos下本地免密登入可能仍不成功,可嘗試執行如下命令(注意其中路徑應與實際所建使用者名稱保持對應):
chmod g-w /home/hhje
chmod 700 /home/hhje/.ssh
chmod 600 /home/hhje/.ssh/authorized_keys
java
上傳java安裝包至/home/hhje目錄下
解壓到當前目錄
在/etc/profile末行處新增如下java環境變數
export JAVA_HOME=/home/hhje/java/jdk1.8.0_171
export JRE_HOME=/home/hhje/java/jdk1.8.0_171/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
使變數配置立即生效
source /etc/profile
考慮到後續的hadoop啟動,額外在~/.bashrc中首行處新增如下環境變數
export JAVA_HOME=/opt/java/jdk1.8.0_171
立即生效
source ~/.bashrc
測試java安裝配置是否成功
java -version
Hadoop安裝配置及使用
安裝
上傳hadoop安裝包至/home/hhje目錄下
解壓縮即可完成安裝
sudo tar -zxf ~/hadoop-2.7.6.tar.gz
重新命名解壓所得資料夾為hadoop
sudo mv ./hadoop-2.7.6/ ./hadoop
修改資料夾許可權(注意命令應與實際使用者名稱對應)
sudo chown -R hhje:hhje ./hadoop
進入/home/hhje/hadoop目錄並測試是否安裝成功
./bin/hadoop version
偽分散式配置
首先配置hadoop的環境變數
vim ~/.bashrc
向其中新增如下變數(注意HADOOP_HOME路徑應與實際使用者名稱對應)
export HADOOP_HOME=/home/hhje/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
立即生效
source ~/.bashrc
偽分散式模式有兩個配置檔案需要修改,即/home/hhje/hadoop/etc/hadoop/目錄下的core-site.xml和hdfs-site.xml
對於core-site.xml,向如下configuration塊
<configuration>
</configuration>
中新增如下內容
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hhje/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
同理,對於hdfs-site.xml,向configuration塊中新增如下內容
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hhje/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hhje/hadoop/tmp/dfs/data</value>
</property>
到此配置就完成了
使用
首次啟動前,需先執行NameNode的格式化,在/home/hhje/hadoop/目錄下執行
./bin/hdfs namenode -format
若執行正常,應能看到“successfully formatted” 和 “Exitting with status 0”的字串被列印
然後啟動NaneNode 和 DataNode 守護程序,在/home/hhje/hadoop/目錄下執行
./sbin/start-dfs.sh
若啟動正常,則執行
jps
命令應該可以看到NaneNode、DataNode、SecondaryNameNode三個程序,到此hadoop就算成功啟動了。
更詳細的hadoop安裝配置參考教程見文末處。
Hbase安裝配置及使用
準備工作
下載Hbase 1.3.1安裝包
需要注意的是,Hbase 1.3.1安裝包lib目錄下的hadoop相關jar包的版本號都是2.5.1,不處理的話hbase跑在hadoop2.7.6上可能會報錯,因此需要用hadoop 2.7.6中的相應jar包替換掉它們。
注,在hadoop 2.7.6中能找到除了hadoop-client-2.5.1.jar以外的其餘hadoop相關jar包的2.7.6版,而對於hadoop-client-2.5.1.jar,其實其中並沒有Class檔案,實測不替換或者從安裝包中刪去都可。
安裝
向~/目錄(即上文的/home/hhje/)上傳經上述操作後與hadoop版本對齊了的Hbase 1.3.1安裝包
解壓縮
重新命名
類似配置java的環境變數,向/etc/profile行末新增如下變數
export HBASE_HOME=/home/hhje/hbase
立即生效
source /etc/profile
修改檔案許可權,進入{HBASE_HOME}目錄
chown -R hhje:hhje ./
chmod -R 755 ./
編輯{HBASE_HOME}/conf/hbase-env.sh檔案,取消下述變數的註釋並配置之
export JAVA_HOME=/home/hhje/java/jdk1.8.0_171 (自己的JAVA_HOME主目錄)
export HBASE_LOG_DIR=${HBASE_HOME}/logs(hbase日誌目錄)
export HBASE_MANAGES_ZK=true(啟用hbase自帶的zookeeper)
編輯{HBASE_HOME}/conf/hbase-site.xml檔案,新增如下內容
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
<!--注意上述路徑需要與hadoop中core-site.xml中配置的fs.default.name路徑相同-->
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<!--zookeeper的法定人數也即機器數-->
<value>localhost</value>
</property>
<property>
<name>zookeeper.znode.parent</name>
<!--指定zookeeper的相對目錄-->
<value>/hbase</value>
</property>
使用
應先啟動hadoop再啟動hbase,關閉時則先關hbase
進入{HBASE_HOME},執行
bin/start-hbase.sh #啟動hbase
若正常啟動,則可用jps命令觀察到新增了HRegionServer、HMaster、HQuorumPeer三個程序
關閉hbase可執行
bin/stop-hbase.sh #停止hbase
可進入hbase shell模式並列出所有的表
bin/hbase shell #進入shell模式(使用jps可以觀察到多出了一個Main程序)
hbase(main):002:0> list #列出所有表
Janusgraph安裝配置與使用
上傳janusgraph安裝包並解壓,重新命名解壓所得資料夾為janusgraph
進入janusgraph目錄
Server端
從一個janusgraph的fresh環境(如剛解壓出來的)開始,若要janusgraph server按自定配置啟動(主要是為了啟用ConfiguredGraphFactory類),步驟如下:
cp conf/gremlin-server/gremlin-server.yaml conf/gremlin-server/socket-gremlin-server.yaml
在socket-gremlin-server.yaml中:
- host的0.0.0.0不用改,可能需要修改port號——指定一個未佔用的port(如50050)供server監聽,視情況可能需要使用iptables -I INPUT -p tcp –dport 50050 -j ACCEPT命令允許外部對該埠的訪問,並/usr/sbin/iptables-save儲存該配置
新增graphManager:
graphManager: org.janusgraph.graphdb.management.JanusGraphManager
並在graphs項中新增ConfigurationManagementGraph鍵及其值,如:
graphs: { blablabla, ConfigurationManagementGraph: conf/gremlin-server/socket-jg-hbase_fyk-server-configraph.properties }
注意,若graphs裡有多個圖的話,若在相應配置檔案中指定不同表名,則storage backend會建立對應的多個表。
修改scriptEvaluationTimeout值為原值的十倍即300000,以避免啟動過程因超時而斷開連線
準備好上述ConfigurationManagementGraph的properties檔案(可以按後端環境複製conf目錄下的類似檔案並修改,如conf下的janusgraph-cassandra-configurationgraph.properties),檔案內容如下:
gremlin.graph=org.janusgraph.core.ConfiguredGraphFactory graph.graphname=ConfigurationManagementGraph storage.backend=hbase storage.hostname=127.0.0.1 cache.db-cache = true cache.db-cache-clean-wait = 20 cache.db-cache-time = 180000 cache.db-cache-size = 0.5
希望在server啟動時便載入的janusgraph圖例項如graph1的配置檔案模板可以用conf目錄下的janusgraph-hbase.properties或janusgraph-hbase-es.properties,graph1的配置檔案內容如下例:
gremlin.graph=org.janusgraph.core.JanusGraphFactory graph.graphname=graph1 storage.backend=hbase storage.hostname=127.0.0.1 cache.db-cache = true cache.db-cache-clean-wait = 20 cache.db-cache-time = 180000 cache.db-cache-size = 0.5
這時就可以執行如下命令以啟動janusgraph server了
nohup bin/gremlin-server.sh ./conf/gremlin-server/socket-gremlin-server.yaml &
- 關閉server的命令為./bin/janusgraph.sh stop,注意該命令會關閉所有名為GremlinServer的程序。
Client端
遠端訪問janusgraph server的客戶端啟動步驟如下:
- 進入janusgraph目錄
cp ./conf/remote.yaml ./conf/remote-local.yaml
- 編輯remote-local.yaml中的host和port引數(置為janusgraph server所在機器的ip和server監聽的埠即可,如10.10.18.143和50050)
- (參janusgraph文件7.1.1.1. Connecting to Gremlin Server一節),執行
./bin/gremlin.sh
- 如下例,載入剛剛編輯的配置檔案以連線janusgraph server
gremlin> :remote connect tinkerpop.server conf/remote-local.yaml session
==>Configured 10.10.18.143/10.10.18.143:50050
gremlin> :remote console
==>All scripts will now be sent to Gremlin Server - [localhost/127.0.0.1:50050]-[bace1161-f5d8-4a06-aa49-5ff6051befb6] - type ':remote console' to return to local mode
常用的tinkerpop3命令
清空圖例項graph1中的頂點與邊
graph1.traversal().V().drop() graph1.traversal().E().drop() graph1.tx().commit()
清空圖例項graph1中的所有資料(包括schema)
graph1.close() JanusGraphFactory.drop(graph1)
ElasticSearch安裝配置與使用
Tinkerpop本身並不支援正則表示式。若要在janusgraph圖例項上建立混合索引(mixed index)來為圖上的查詢操作提供對模糊匹配,正則表示式匹配等特性的支援,則需要配置並啟動elasticsearch的服務,具體見下述。
janusgraph包自帶與其相容的完整的ElasticSearch包,偽分散式環境下無需另行下載安裝es。
janusgraph server端關於es的配置
與配置圖例項的儲存後端為hbase類似,這裡配置圖例項的索引後端為es,仍以janusgraph圖例項graph1為例,其.properties配置檔案內容應如下例:
gremlin.graph=org.janusgraph.core.JanusGraphFactory
graph.graphname=graph1
storage.backend=hbase
storage.hostname=127.0.0.1
index.search.backend=elasticsearch
index.search.hostname=127.0.0.1
cache.db-cache = true
cache.db-cache-clean-wait = 20
cache.db-cache-time = 180000
cache.db-cache-size = 0.5
到此圖例項中關於es的配置就算完成了
要注意的是,上例中index.search.backend和index.search.hostname裡的“search”是使用者為該索引後端指定的代稱(因為有時專案所用的索引後端不止一個),在新增混合索引(mixed index)時需要將希望使用的索引後端的自定義代稱傳遞給JanusGraph的ManagementSystem系列API,例如
mgmt = graph1.openManagement()
idCard = mgmt.getPropertyKey('idCard')
mgmt.buildIndex('byIdCardMixed', Vertex.class).addKey(idCard, Mapping.STRING.asParameter()).buildMixedIndex("search")
description = mgmt.getPropertyKey('description')
mgmt.buildIndex('byDescriptionMixed', Vertex.class).addKey(description, Mapping.STRING.asParameter()).buildMixedIndex("search")
mgmt.commit()
graph1.tx().commit()
//Wait for the index to become available
mgmt = wgraph.openManagement()
mgmt.awaitGraphIndexStatus(wgraph, 'byIdCardMixed').call()
mgmt.awaitGraphIndexStatus(wgraph, 'byDescriptionMixed').call()
mgmt.commit()
wgraph.tx().commit()
es的啟動與檢驗
直接進入janusgraph自帶的elasticsearch目錄並執行如下命令即可啟動es。要注意的是,既然已經配置了janusgraph server的索引後端為es,則啟動時應先啟動es服務再啟動janusgraph server服務,此理同樣適用於儲存後端hbase。
./bin/elasticsearch
{
"name" : "Tom Foster",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.1.0",
"build_hash" : "72cd1f1a3eee09505e036106146dc1949dc5dc87",
"build_timestamp" : "2015-11-18T22:40:03Z",
"build_snapshot" : false,
"lucene_version" : "5.3.1"
},
"tagline" : "You Know, for Search"
}
到此es便啟動成功,可以啟動janusgraph server並嘗試mixed index了
Troubleshooting–不踩坑tips
(分享作者的一些爬坑經驗,待更新)