本文用到的东西
- Ubuntu 16.04.1
- Java Jdk 1.8.0_191
- zookeeper 3.4.14
- hadoop 2.6.0
- hbase 2.2.4
- janusgraph 0.3.2
1.准备
准备三台主机,主机信息如下:
主机名 | IP |
---|---|
cldev-701-37 | 192.168.2.77 |
cldev-701-38 | 192.168.2.78 |
cldev-701-39 | 192.168.2.79 |
- 在此之前需要先安装JDK,每台主机都需要安装,本文不再赘述JDK安装过程;
- 在这三台主机中每台主机都需要进行如下的准备工作配置;
- 在本文中使用主机名为
cldev-701-37
的主机作为master
节点; - 在每台主机准备好所需要的安装包。
1.1配置主机名
1.更改当前主机主机名,每一台主机都要修改为自己本机对应的主机名。
sudo vim /etc/hostname
2.vim /etc/hosts
编辑hosts文件,添加以下内容。
需要清除
127.0.01
到主机名的映射关系。
192.168.2.79 cldev-701-39
192.168.2.78 cldev-701-38
192.168.2.77 cldev-701-37
3.输入sudo reboot
重启服务器,使配置生效。
1.2配置用户和用户组
搭建hadoop集群环境要求所有主机的用户和用户组要完全一致。
1.新建用户和用户组.
可有可无的一步操作,只要保证三节点是同一个用户即可。
# 新建用户
sudo adduser hadoop
# 把hadoop用户加入到hadoop用户组
sudo usermod -a -G hadoop hadoop
2.查询配置结果,有一条 hadoop:x:XXX:hadoop
的记录表示配置成功,前面一个hadoop是组名,后面一个hadoop是用户名。
cat /etc/group
3.赋予hadoop用户root权限,让他可以使用sudo命令。
sudo vi /etc/sudoers
添加如下内容:
# User privilege specification
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL # 添加这一行配置
1.3配置免密登录SSH
集群时主机间需要互相通信,需要配置免密通信。
1.输入如下命令安装SSH:
# 更新apt
sudo apt-get update
# 安装SSH
sudo apt-get install openssh-server
# 查看SSH是否安装成功,有输出就证明安装成功
ps -e | grep ssh
# 测试能否登陆本机
ssh localhost
2.配置免密登陆,每一台主机都需要配置,这里以cldev-701-37主机为例。
# 生成密钥对
ssh-keygen -t rsa
# 将公钥复制到authorized_keys里
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 将秘钥拷贝到另外两台主机,按照提示输入yes 和root密码
ssh-copy-id cldev-701-38
ssh-copy-id cldev-701-39
# 验证能否免密登陆另外两台主机
ssh cldev-701-38
ssh cldev-701-39
1.4关闭防火墙
集群需要开放很多端口,为了出席端口未开放问题,需要开放端口,或者关闭防火墙。本文直接关闭了防火墙。
# 关闭防火墙
sudo ufw disable
# 查看防火墙状态,Status:inactive表示已关闭
sudo ufw status
2.搭建Zookeeper集群
1.解压Zookeeper安装包,并设置环境变量
# 解压Zookeeper安装包
tar -zxvf zookeeper-3.4.14.tar.gz
# 添加环境变量
export ZOOKEEPER=/data6/linsongwang/janus/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER/bin
2.进入zookeeper安装目录,新建数据文件夹data
和日志文件夹logs
。
mkdir data
mkdir logs
3.进入Zookeeper安装目录下的conf目录,拷贝zoo.cfg文件,并修改内容:
# 拷贝zoo.cfg文件
cp zoo_sample.cfg zoo.cfg
# 修改zoo.cfg文件以下内容
dataDir=/data6/linsongwang/janus/zookeeper-3.4.14/data
# 添加以下内容
dataLogDir=/data6/linsongwang/janus/zookeeper-3.4.14/logs
server.0=192.168.2.77:2888:3888
server.1=192.168.2.78:2888:3888
server.2=192.168.2.79:2888:3888
server.A=B:C:D,其中A是一个数字, 表示这是第几号server。B是该server所在的IP地址。C配置该server和集群中的leader交换消息所使用的端口。D配置选举leader时所使用的端口。
4.进入刚刚新建的数据目录data
,新建名为myid的文件,每个主机的内容不一样,myid内容对应刚刚配置的server.x中的x。
这里以cldev-701-37
为例,192.168.2.77
对应的是server.0
,所以新建的myid
文件内容为0
。
# 创建myid文件
touch myid
# 修改myid文件,添加内容:0
vim myid
5.启动Zookeeper,在每台主机上都执行如下命令
bin/zkServer.sh start
6.测试,每台主机输入jps
应该包含QuorumPeerMain
项,表示成功。
3.搭建Hadoop集群
需要清除
127.0.01
到主机名的映射关系。
1.解压Hadoop安装包,并配置环境变量。
# 解压Hadoop安装包
tar -zxvf hadoop-2.6.0.tar.gz
# 配置环境变量
export HADOOP_HOME=/data6/linsongwang/janus/hadoop-2.6.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 验证配置是否成功,输出hadoop信息即安装成功
hadoop version
2.进入hadoop安装目录,使用命令新建如下几个文件夹:
mkdir tmp
mkdir hdfs
mkdir hdfs/name
mkdir hdfs/data
3.进入hadoop安装路径下的etc/hadoop/
路径,需要修改该目录以下的配置文件。
不同主机修改配置文件内容相同。
不同主机修改配置文件内容相同。
不同主机修改配置文件内容相同。
- hadoop-env.sh
- yarn-env.sh
- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- mapred-site.xml
- slaves
4.修改hadoop-env.sh
和yarn-env.sh
文件,添加java安装路径。
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
5.修改core-site.xml
内容如下
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cldev-701-37:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data6/linsongwang/janus/hadoop-2.6.0/tmp</value>
</property>
</configuration>
6.修改hdfs-site.xml
内容如下
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data6/linsongwang/janus/hadoop-2.6.0/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data6/linsongwang/janus/hadoop-2.6.0/hdfs/data</value>
</property>
<property>
<name>dfs.http.address</name>
<value>cldev-701-37:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>cldev-701-37:50090</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
7.修改yarn-site.xml
内容如下
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>cldev-701-37</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>cldev-701-37:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>cldev-701-37:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>cldev-701-37:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>cldev-701-37:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>cldev-701-37:8088</value>
</property>
</configuration>
8.使用cp
命令拷贝mapred-site.xml
文件。
cp mapred-site.xml.template mapred-site.xml
9.修改mapred-site.xml
内容如下
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>cldev-701-37:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>cldev-701-37:19888</value>
</property>
</configuration>
10.修改slaves
内容如下
cldev-701-38
cldev-701-39
11.启动hadoop,启动Hadoop的命令都只在master
节点上执行。
- 启动namenode,第一次启动对namenode进行格式化。
bin/hdfs namenode -format
- 启动hdfs:
sbin/start-dfs.sh
-
使用jps命令验证hdfs是否启动成功
在
master
节点输入jps应该存在NameNode
和SecondaryNamenode
;在
slave
节点输入jps应该存在DataNode
。则表示安装成功
访问:http://cldev-701-37:50070/dfshealth.html#tab-overview 可以成功进入
-
启动yarn
sbin/start-yarn.sh
-
使用jps命令验证yarn是否启动成功
在
master
节点输入jps应该存在ResourceManager
;在
slave
节点输入jps应该存在NodeManager
。则表示安装成功
访问:http://cldev-701-37:8088/cluster/nodes 可以成功进入
4.搭建HBase
1.解压HBase安装包,并配置环境变量
# 解压HBase安装包
tar -zxvf hbase-2.2.4-bin.tar.gz
# 配置环境变量
export HBASE_HOME=/data6/linsongwang/janus/hbase-2.2.4
export PATH=$PATH:$HBASE_HOME/bin
# 验证安装是否成功,输出Hadoop信息即安装成功
hbase version
2.在hbase文件下,新建data
和logs
两个文件夹.
mkdir data
mkdir logs
3.配置HBase,需要修改hbase安装目录的conf目录下的如下文件:
不同主机修改配置文件内容相同。
不同主机修改配置文件内容相同。
不同主机修改配置文件内容相同。
- hbase-env.sh
- hbase-site.xml
- regionservers
4.修改hbase-env.sh
文件内容如下:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HBASE_CLASSPATH=/data6/linsongwang/janus/hbase-2.2.4/lib
export HBASE_PID_DIR=/data6/linsongwang/janus/hbase-2.2.4/data
export HBASE_LOG_DIR=/data6/linsongwang/janus/hbase-2.2.4/logs
export HBASE_MANAGES_ZK=false
5.修改hbase-site.xml
文件内容如下:
<configuration>
<property>
<name>hbase.tmp.dir</name>
<value>/data6/linsongwang/janus/hbase-2.2.4/data</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://cldev-701-37:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>cldev-701-37,cldev-701-38,cldev-701-39</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/data6/linsongwang/janus/zookeeper-3.4.14/data</value>
<description>property from zoo.cfg,the directory where the snapshot is stored</description>
</property>
</configuration>
6.修改regionservers
文件内容如下:
cldev-701-37
cldev-701-38
cldev-701-39
7.在master
节点启动hbase,slave节点无须启动
bin/start-hbase.sh
8.验证hbase启动是否成功
在master
节点输入 jps,应当存在HMaster
和HRegionServer
;
在slave
节点输入jps,应当存在HRegionServer
。
访问:http://192.168.2.77:16010/master-status 可以成功进入
5.安装JanusGraph
1.解压JanusGraph安装包,并配置环境变量
# 解压JanusGraph安装包
unzip janusgraph-0.3.2-hadoop2.zip
# 配置环境变量
export JANUSGRAPH_HOME=/data6/linsongwang/janus/janusgraph-0.3.2-hadoop2
export PATH=$PATH:$JANUSGRAPH_HOME/bin
2.配置 JanusGraph,进入JanusGraph安装目录,使用cp拷贝需要修改的配置文件:
cp conf/janusgraph-hbase-es.properties conf/gremlin-server/janusgraph-hbase-es-server.properties
cp conf/gremlin-server/gremlin-server.yaml conf/gremlin-server/gremlin-hbase-es-server.yaml
3.进入conf/gremlin-server/
目录,修改janusgraph-hbase-es-server.properties
文件
# 文件首加上如下内容,不然会报初始化图异常
gremlin.graph=org.janusgraph.core.JanusGraphFactory
# 修改如下内容
storage.hostname=cldev-701-37,cldev-701-38,cldev-701-39
4.修改gremlin-hbase-es-server.yaml
文件
# channelizer是关系访问gremlin-server的方式,它提供了
# WebSocket和Http两种方式,默认只配置了WebSocket
# 这里可以改为同时支持两种方式,如下:
channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
# graph: conf/gremlin-server/janusgraph-cql-es-server.properties,如下改为如下:
graphs: {
graph: conf/gremlin-server/janusgraph-hbase-es-server.properties
}
5.进入JanusGraph安装目录下的elasticsearch
目录,启动ElasticSearch
cd elasticsearch/
nohup bin/elasticsearch &
6.启动JanusGraph服务
# 进入JanusGraph安装目录的bin目录,输入如下内容
cd janusgraph-0.3.2-hadoop2/bin/
nohup bash gremlin-server.sh conf/gremlin-server/gremlin-hbase-es-server.yaml &
7.验证JanusGraph Server测试
- [1] WebSocket接口验证
# 进入janusgraph-0.3.2-hadoop2/bin目录下
$ ./gremlin.sh
# 返回
\,,,/
(o o)
-----oOOo-(3)-oOOo-----
# 输入
gremlin> :remote connect tinkerpop.server conf/remote.yaml
# 返回
==>Configured localhost/127.0.0.1:8182
# 输入 (无法成功)
# gremlin> g.V().count()
# 返回
==>0
gremlin> graph = JanusGraphFactory.open('conf/gremlin-server/janusgraph-hbase-es-server.properties')
==>standardjanusgraph[hbase:[127.0.0.1]]
gremlin>
gremlin> g = graph.traversal()
==>graphtraversalsource[standardjanusgraph[hbase:[127.0.0.1]], standard]
gremlin> g.V().count()
==>0
- [2] HTTP接口验证
# Get请求访问测试
http://192.168.2.20:8182/?gremlin=g.V().count()
# 返回
{
"requestId": "5b85bc73-8958-4d95-97d3-680b2e3a2b5e",
"status": {
"message": "",
"code": 200,
"attributes": {
"@type": "g:Map",
"@value": []
}
},
"result": {
"data": {
"@type": "g:List",
"@value": [
{
"@type": "g:Int64",
"@value": 0
}
]
},
"meta": {
"@type": "g:Map",
"@value": []
}
}
}
8.输入./gremlin.sh
进入命令行,可直接使用,无须启动。
6.问题解决
6.1 Hbase Shell无法进入
hbase shell
无法进入,抛出异常RuntimeError: Can't load hbase shell command: trace. Error: cannot link Java class org.apache.hadoop.hbase.trace.SpanReceiverHost (java.lang.NoClassDefFoundError: org/apache/htrace/core/HTraceConfiguration)
。
RuntimeError: Can't load hbase shell command: trace. Error: cannot link Java class org.apache.hadoop.hbase.trace.SpanReceiverHost (java.lang.NoClassDefFoundError: org/apache/htrace/core/HTraceConfiguration)
org/jruby/javasupport/JavaPackage.java:259:in `method_missing'
/data6/linsongwang/hugegraph/hbase-2.2.4/lib/ruby/shell/commands/trace.rb:20:in `<main>'
org/jruby/RubyKernel.java:955:in `require'
uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:59:in `require'
/data6/linsongwang/hugegraph/hbase-2.2.4/lib/ruby/shell.rb:41:in `load_command'
/data6/linsongwang/hugegraph/hbase-2.2.4/lib/ruby/shell.rb:66:in `block in load_command_group'
org/jruby/RubyArray.java:1734:in `each'
/data6/linsongwang/hugegraph/hbase-2.2.4/lib/ruby/shell.rb:1:in `(root)'
/data6/linsongwang/hugegraph/hbase-2.2.4/lib/ruby/shell.rb:64:in `<main>'
org/jruby/RubyKernel.java:955:in `require'
uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:59:in `require'
/data6/linsongwang/hugegraph/hbase-2.2.4/bin/hirb.rb:134:in `<main>'
load_command at /data6/linsongwang/hugegraph/hbase-2.2.4/lib/ruby/shell.rb:48
block in load_command_group at /data6/linsongwang/hugegraph/hbase-2.2.4/lib/ruby/shell.rb:66
each at org/jruby/RubyArray.java:1734
load_command_group at /data6/linsongwang/hugegraph/hbase-2.2.4/lib/ruby/shell.rb:64
<main> at /data6/linsongwang/hugegraph/hbase-2.2.4/lib/ruby/shell.rb:323
require at org/jruby/RubyKernel.java:955
require at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:59
<main> at /data6/linsongwang/hugegraph/hbase-2.2.4/bin/hirb.rb:134
解决方法:
将$HBASE_HOME/lib/client-facing-thirdparty/
下的htrace-core-3.1.0-incubating.jar
复制到$HBASE_HOME/lib/
下。
cp $HBASE_HOME/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar $HBASE_HOME/lib/