本文用到的东西

  1. Ubuntu 16.04.1
  2. Java Jdk 1.8.0_191
  3. zookeeper 3.4.14
  4. hadoop 2.6.0
  5. hbase 2.2.4
  6. janusgraph 0.3.2

1.准备

准备三台主机,主机信息如下:

主机名IP
cldev-701-37192.168.2.77
cldev-701-38192.168.2.78
cldev-701-39192.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.shyarn-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应该存在NameNodeSecondaryNamenode

    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文件下,新建datalogs两个文件夹.

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,应当存在HMasterHRegionServer;

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/