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;
- Hbase的兼容性信息可参考http://hbase.apache.org/book.html#basic.prerequisites中的4.1Hadoop一节,本文选择Hadoop 2.7.6以适配上文选取的Hbase 1.3.1;
- 注,本文演示所用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 hhje -s /bin/bash
passwd hhje
为了后续的操作便利,为其添加权限
在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=/home/hhje/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
参es官方文档
可使用curl命令测试es服务是否成功启动
curl ‘http://localhost:9200/?pretty’
正常情况下返回应如下例:
{
"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
(分享作者的一些爬坑经验,待更新)
参考链接
Hadoop安装教程_单机/伪分布式配置_CentOS6.4/Hadoop2.6.0
——很详细且新手友好的hadoop安装教程,本文也多有参考,在此向作者“给力星”致谢