从零搭建Hadoop+Zookeeper+HBase完全分布式集群

前言

实验室项目需要部署一个hadoop集群,虽然自己之前用虚拟机也搭建过伪分布式的hadoop集群,但那个时候也是有问题就问度娘,没有系统整理,于是,对搭建过程也几乎是像小白一样懵逼~~~因此,这次记录下整个过程,尤其是踩过的坑,方便后来自己查阅,也希望能帮助到正在搭建集群的你。

先来介绍下集群的系统配置:

  • 系统环境:Ubuntu 16.04
  • Java Jdk:1.8.0_191
  • Hadoop:2.8.5
  • Zookeeper:3.4.12
  • HBase:2.1.0

为了方便介绍,这里我以3台服务器为例进行介绍,下面是主机的一些信息:

主机名 IP
master 10.100.200.220
slave1 10.100.200.221
slave2 10.100.200.222

为了清晰直观,本文针对每一部分都给出了每个主机的配置清单。其中标记了为需要配置,标记了X为不需要配置。

准备工作

由于是从零开始搭建集群,所以需要做好一些前期准备工作——配置用户和用户组、配置主机名、安装配置SSH、配置免密登录SSH、关闭防火墙等。这些配置是集群搭建的最最基础的部分,希望读者耐心配置。

配置清单

准备工作的配置清单如下:

配置项 master slave1 slave2
配置用户和用户组
配置主机名
安装配置SSH
配置免密登录SSH
关闭防火墙

配置用户和用户组

搭建hadoop集群环境要求所有主机的用户和用户组要完全一致。配置过程如下:

  1. 新建用户,建议用adduser命令。
    sudo adduser hadoop
    
    因为使用了sudo命令,所以要输入当前用户的密码才能进行下一步的操作。配置hadoop用户密码需要输入两次密码,然后一直按回车,最后输入Y确定。在无密码的情况下,应该紧接着使用passwd命令,为hadoop用户设置密码:
passwd hadoop
  1. 在创建hadoop用户的同时也创建了hadoop用户组,下面把hadoop用户加入到hadoop用户组。
    sudo usermod -a -G hadoop hadoop 
    
  2. 前面一个hadoop是组名,后面一个hadoop是用户名。完成后输入一下命令查询结果。
    cat  /etc/group
    
  3. 然后再把hadoop用户赋予root权限,让他可以使用sudo命令。
    sudo vi /etc/sudoers
    
    修改文件如下:
    # User privilege specification
    root ALL=(ALL) ALL
    hadoop ALL=(ALL) ALL  # 添加这一行配置
    
    保存退出,hadoop用户就拥有了root权限。

配置主机名

我们一开始就给出了3台主机的主机名(master、slave1、slave2),但是默认的主机名却是千奇百怪,因此要把原来的主机名改成我们设定的。

  1. 编辑 /etc/hostname ,把里面的内容更改为你所需要的设定的主机名。

    sudo vim /etc/hostname
    
  2. 更改hosts文件,修改(或增加)127.0.1.1后面的名称改为设定值。

    sudo vim /etc/hosts
    
  3. 重启服务器,更改生效。

    sudo reboot
    
  4. 验证。重新登录后,会发现主机名已经更改为设定值了。

    hostname
  5. 修改host文件,配置域名。编辑hosts文件:

    sudo vi /etc/hosts
    

    添加下面内容:

    10.100.200.220 master
    10.100.200.221 slave1
    10.100.200.222 slave2
    

踩坑记录:主机名和hosts文件中设置的名称应当保持一致,否则会产生意外的错误。另外,建议把/etc/hosts文件中的127.0.0.1 localhost给注释掉。为避免表述不清,让大家产生疑惑,直接贴出hosts文件的截图。

hosts

安装配置SSH

在Hadoop运行过程中,主从机之间是通过SSH进行通信的,所以需要对所有主机进行SSH的安装和配置工作。

  1. 先更新一下apt。
    sudo apt-get update
    
  2. 接下来,安装SSH。
    sudo apt-get install openssh-server
    
  3. 安装完成之后,使用下面的命令来查看SSH是否安装成功。
    ps -e | grep ssh
    
    如果有输出就表示SSH安装成功了。也可以使用SSH登陆本地机器来测试一下。
    ssh localhost
    

    温馨提示:安装好SSH之后,大家就可以使用SSH进行远程操作了。如果是虚拟机的话,大家可能对此没有什么感觉;但如果是物理机的话,这就十分方便了。集群中所有主机的配置只需要一台MAC就搞定了。

配置免密登录SSH

主机间免密登录才能实现主机间的顺畅通信,因此该环节非常重要!

  1. 在master主机上生成密钥对。

    ssh-keygen -t rsa
    

    输入后一直回车选择默认即可。

    keygen
  1. 将公钥(~/.ssh/id_rsa.pub中的内容)复制到文件authorized_keys中去。

    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    
  2. 分别在从机slave1,slave2上都进行同样的操作,同时将两个从机的公玥都复制到主机master的~/.ssh/authorized_keys中去。
    即将slave1和slave2 ~/.ssh/authorized_keys里面的内容添加到master上的~/.ssh/authorized_keys里面。

  3. 将master上的~/.ssh/authorized_keys通过scp命令复制到从机slave1,slave2中去。

    scp -r ~/.ssh/authorized_keys slave1:~/.ssh/ 
    scp -r ~/.ssh/authorized_keys slave2:~/.ssh/
    

或者,使用ssh-copy-id \$IPs #$IPs为所有节点地址包括自身,按照提示输入yes 和root密码。

  1. 验证一下免密登录是否成功。在master上登录slave1、slave2(其他主机上验证方法也是一样的)。

    ssh slave1
    

    如果是第一次登录,则会要求输入密码,但之后登录都不再需要密码。那么,恭喜你,这一步配置已经完美结束了!

    ssh

关闭防火墙

集群需要开放很多端口,因此,为了避免出现端口未开放的问题,我索性关闭了防火墙。我使用ufw命令关闭防火墙。

  1. 关闭防火墙
    sudo ufw disable
    
  2. 查看防火墙状态
    sudo ufw status
    
    ufw status

正式搭建

如果你已经配置到了这一步,那么恭喜你,因为你已经完成了集群搭建工作的一大半任务了,下面,让我们继续剩下一小半的任务吧~

接下来的任务全部通过SSH远程配置。

同样,给出这一部分的配置清单:

配置项 master slave1 slave2
Java JDK
Zookeeper
Hadoop
HBase

Java JDK

Hadoop的有些计算是通过jar包进行分布式计算的。因此,安装Hadoop前需要安装JDK。

  1. java JDK下载传送门

  2. 将JDK下载到本地后,通过scp命令将安装包发送到每个主机上。

    scp jdk-8u191-linux-x64.tar.gz hadoop@10.100.200.220:~/
    
  3. 登录master主机。

    ssh hadoop@10.100.200.220
    
  4. /usr/local/ 中建 cluster文件夹。

    mkdir /usr/local/cluster
    
  5. 进入服务器根目录下,将jdk-8u191-linux-x64.tar.gz解压至 /usr/local/cluster中。

    tar -zxvf ~/jdk-8u191-linux-x64.tar.gz -C /usr/local/cluster/
    
  6. 进入 /usr/local/cluster 中,为了方便日后版本的更新,这里使用软链接的方法。

    cd /usr/local/cluster
    ln -s jdk1.8.0_191 java
    
  7. 进行环境变量的配置。

    sudo vi ~/.bashrc
    

    添加如下内容:

    #java
    export JAVA_HOME=/usr/local/cluster/java
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    
  8. 使环境变量立刻生效。

    source ~/.bashrc
    
  9. 验证环境变量是否配置成功。

    java -version
    

    如果输出如下图所示,即代表JDK环境变量配置好了。

    java version

Zookeeper

  1. Zookeeper下载传送门

  2. 将Zookeeper下载到本地后,通过scp命令将安装包发送到master主机上。下面以master为例介绍安装配置,其他的主机安装和配置是完全一样的。

    scp zookeeper-3.4.12.tar.gz hadoop@10.100.200.220:~/
    
  3. 进入服务器根目录下,将zookeeper-3.4.12.tar.gz解压至 /usr/local/cluster中。

    tar -zxvf ~/zookeeper-3.4.12.tar.gz -C /usr/local/cluster/
    
  4. 进入 /usr/local/cluster 中,为了方便日后版本的更新,这里使用软链接的方法。

    cd /usr/local/cluster
    ln -s zookeeper-3.4.12 zookeeper
    
  5. 设置环境变量,在 ~/.bashrc 添加如下内容。

    #zookeeper
    export ZOOKEEPER=/usr/local/cluster/zookeeper
    export PATH=$PATH:$ZOOKEEPER/bin
    
  6. 使环境变量立刻生效。

    source ~/.bashrc
    
  7. 配置zookeeper

    • 建立数据和日志文件
      mkdir /usr/local/cluster/zookeeper/data
      mkdir /usr/local/cluster/zookeeper/logs
      
    • 进入conf目录创建并修改zoo.cfg文件
      cp zoo_sample.cfg zoo.cfg
      
      修改后的内容为:
      # The number of milliseconds of each tick
      tickTime=2000
      # The number of ticks that the initial 
      # synchronization phase can take
      initLimit=10
      # The number of ticks that can pass between 
      # sending a request and getting an acknowledgement
      syncLimit=5
      # the directory where the snapshot is stored.
      # do not use /tmp for storage, /tmp here is just 
      # example sakes.
      dataDir=/usr/local/cluster/zookeeper/data
      dataLogDir=/usr/local/cluster/zookeeper/logs
      # the port at which the clients will connect
      clientPort=2181
      # the maximum number of client connections.
      # increase this if you need to handle more clients
      #maxClientCnxns=60
      #
      # Be sure to read the maintenance section of the 
      # administrator guide before turning on autopurge.
      #
      # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
      #
      # The number of snapshots to retain in dataDir
      #autopurge.snapRetainCount=3
      # Purge task interval in hours
      # Set to "0" to disable auto purge feature
      #autopurge.purgeInterval=1
      server.0=10.100.200.220:2888:3888
      server.1=10.100.200.221:2888:3888
      server.2=10.100.200.222:2888:3888
      
      这里还需要在数据目录 /usr/local/cluster/zookeeper/data下新建名为myid的文件,各个主机对应的内容是不同的,master的内容是0,slave1的内容是1,slave2的内容是2,分别对应server.x中的x。server.A=B:C:D,其中A是一个数字, 表示这是第几号server。B是该server所在的IP地址。C配置该server和集群中的leader交换消息所使用的端口。D配置选举leader时所使用的端口。
  8. 使用scp命令,将配置好的Zookeeper发送到其他从节点上去。

    scp -r /usr/local/cluster/zookeeper/ slave1:/usr/local/cluster/
    scp -r /usr/local/cluster/zookeeper/ slave2:/usr/local/cluster/
    

    !!!别忘了从节点上的myid要改成对应的值!!!

    !!!别忘了从节点上的myid要改成对应的值!!!

    !!!别忘了从节点上的myid要改成对应的值!!!

    重要的事情说三遍!!!

  9. 启动zookeeper。
    在各个节点执行以下命令:

    .zkServer.sh start
    

    输入jps进行验证。

    jps_zookeeper
  1. 查看各个主机的状态。
    zkServer.sh status
    
    zookeeper status

Hadoop

  1. Hadoop下载传送门

  2. 将Hadoop下载到本地后,通过scp命令将安装包发送到master上。

    scp hadoop-2.8.5.tar.gz hadoop@10.100.200.220:~/
    
  3. 进入服务器根目录下,将hadoop-2.8.5.tar.gz解压至 /usr/local/cluster中。

    tar -zxvf ~/hadoop-2.8.5.tar.gz -C /usr/local/cluster/
    
  4. 进入 /usr/local/cluster 中,为了方便日后版本的更新,这里使用软链接的方法。

    cd /usr/local/cluster
    ln -s hadoop-2.8.5 hadoop
    
  5. 设置环境变量,在 ~/.bashrc 添加如下内容。

    #hadoop
    export HADOOP_HOME=/usr/local/cluster/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    
  6. 使环境变量立刻生效。

    source ~/.bashrc
    
  7. 验证Hadoop是否安装成功。

    hadoop version
    

    如果输出hadoop版本信息即安装成功。

  8. 配置hadoop。

    • 进入hadoop的配置目录。

      cd /usr/local/cluster/hadoop/etc/hadoop/
      
    • 新建几个文件夹,配置文件中需要用到。

      mkdir tmp
      mkdir hdfs
      mkdir hdfs/name
      mkdir hdfs/data
      
    • 需要修改的配置文件为:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、slaves、hadoop-env.sh、yarn-env.sh。将如下configuration的内容复制到对应的配置文件中即可。

    • hadoop-env.sh 和 yarn-env.sh增加下面一行命令,即配置java环境。

      export JAVA_HOME=/usr/local/cluster/java
      
    • core-site.xml

      <configuration>
        <property>
          <name>fs.defaultFS</name>
          <value>hdfs://master:9000</value>
        </property>
      
        <property>
          <name>io.file.buffer.size</name>
          <value>4096</value>
        </property>
      
        <property>
          <name>hadoop.tmp.dir</name>
          <value>/usr/local/cluster/hadoop/tmp</value>
        </property>
      </configuration>
      
    • hdfs-site.xml

      <configuration>
        <property>
          <name>dfs.replication</name>
          <value>3</value>
        </property> 
        
        <property>
          <name>dfs.namenode.name.dir</name>
          <value>/usr/local/cluster/hadoop/hdfs/name</value>
        </property>
      
        <property>
          <name>dfs.datanode.data.dir</name>
          <value>/usr/local/cluster/hadoop/hdfs/data</value>
        </property>
      
        <property>
          <name>dfs.http.address</name>
          <value>master:50070</value>
        </property>
      
        <property>
          <name>dfs.secondary.http.address</name>
          <value>master:50090</value>
        </property>
      
        <property>
          <name>dfs.webhdfs.enabled</name>
          <value>true</value>
        </property>
      
        <property>
          <name>dfs.permissions</name>
          <value>false</value>
        </property>
      </configuration>
      
    • yarn-site.xml

      <configuration>
          <property>
              <name>yarn.resourcemanager.hostname</name>
              <value>master</value>
          </property>
          <property>
              <name>yarn.nodemanager.aux-services</name>
              <value>mapreduce_shuffle</value>
          </property>
          <property>
              <name>yarn.resourcemanager.address</name>
              <value>master:8032</value>
          </property>
          <property>
              <name>yarn.resourcemanager.scheduler.address</name>
              <value>master:8030</value>
          </property>
          <property>
              <name>yarn.resourcemanager.resource-tracker.address</name>
              <value>master:8031</value>
          </property>
          <property>
              <name>yarn.resourcemanager.admin.address</name>
              <value>master:8033</value>
          </property>
          <property>
              <name>yarn.resourcemanager.webapp.address</name>
              <value>master:8088</value>
          </property>
      </configuration>
      
    • mapred-site.xml

      通过cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml创建etc/hadoop/mapred-site.xml,内容改为如下:

      <configuration>
        <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
        </property>
      
        <property>
          <name>mapreduce.jobhistory.address</name>
          <value>master:10020</value>
        </property>
      
        <property>
          <name>mapreduce.jobhistory.webapp.address</name>
          <value>master:19888</value>
        </property>
      </configuration>
      
    • slaves

      slave1
      slave2
      
    • 配置文件修改完以后,将master下hadoop文件夹复制到slave1和slave2中。

      scp -r /usr/local/cluster/hadoop/ slave1:/usr/local/cluster/
      scp -r /usr/local/cluster/hadoop/ slave2:/usr/local/cluster/
      
  9. 运行Hadoop。注意:启动hadoop的命令都只在master上执行。

    • 启动namenode,如果是第一次启动namenode,需要对namenode进行格式化。命令如下:
      /usr/local/cluster/hadoop/bin/hdfs namenode -format
      
    • 启动hdfs:
      /usr/local/cluster/hadoop/sbin/start-dfs.sh
      
    • 验证hdfs是否启动成功。

    在master输入 jps,应当存在NameNode和SecondaryNamenode。

    jps_hdfs

    在slave1和slave2输入jps,应当存在DataNode。

    web_datanode

    进一步验证,访问:http://master:50070/dfshealth.html#tab-overview,如图:

    web_dfs

    • 启动yarn

      /usr/local/cluster/hadoop/sbin/start-yarn.sh
      
    • 验证yarn是否启动成功。

      在master输入 jps,应当存在ResourceManager。

    jps_resourcemanager

    在slave1和slave2输入jps,应当存在NodeManager

    jps_nodemanager

    进一步验证,访问:http://master:8088/cluster,如图:

    web_cluster

HBase

  1. HBase下载传送门

  2. 将HBase下载到本地后,通过scp命令将安装包发送到master主机上。

    scp hbase-2.1.0-bin.tar.gz hadoop@10.100.200.220:~/
    
  3. 进入服务器根目录下,将hbase-2.1.0-bin.tar.gz解压至 /usr/local/cluster中。

    tar -zxvf ~/hbase-2.1.0-bin.tar.gz -C /usr/local/cluster/
    
  4. 进入 /usr/local/cluster 中,为了方便日后版本的更新,这里使用软链接的方法。

    cd /usr/local/cluster
    ln -s hbase-2.1.0 hbase
    
  5. 设置环境变量,在 ~/.bashrc 添加如下内容。

    #hbase
    export HBASE_HOME=/usr/local/cluster/hbase
    export PATH=$PATH:$HBASE_HOME/bin
    
  6. 使环境变量立刻生效。

    source ~/.bashrc
    
  7. 验证Hbase是否安装成功。

    hbase version
    

    如果输出hadoop版本信息即安装成功。

  8. 配置HBase

    主要修改conf目录下的三个文件:hbase-env.sh、hbase-site.xml、regionservers。

    • hbase-env.sh
    export JAVA_HOME=/usr/local/cluster/java
    export HBASE_CLASSPATH=/usr/local/cluster/hbase/lib
    export HBASE_PID_DIR=/usr/local/cluster/hbase/data
    export HBASE_LOG_DIR=/usr/local/cluster/hbase/logs
    export HBASE_MANAGES_ZK=false
    

    注意:要在hbase文件下,新建data和logs两个文件夹

    mkdir /usr/local/cluster/hbase/data
    mkdir /usr/local/cluster/hbase/logs
    
    • hbase-site.xml
    <configuration>
        <property>
          <name>hbase.tmp.dir</name>
          <value>/usr/local/cluster/hbase/data</value>
        </property>
        <property>
          <name>hbase.rootdir</name>
          <value>hdfs://master:9000/hbase</value>
        </property>
        <property>
          <name>hbase.cluster.distributed</name>
          <value>true</value>
        </property>
        <property>
          <name>hbase.zookeeper.quorum</name>
          <value>master,slave1,slave2</value>
        </property>
        <property>
          <name>hbase.zookeeper.property.clientPort</name>
          <value>2181</value>
        </property>
        <property>
          <name>hbase.zookeeper.property.dataDir</name>
          <value>/usr/local/cluster/zookeeper/data</value>
          <description>property from zoo.cfg,the directory where the snapshot is stored</description>
        </property>
    </configuration>
    
    • regionservers
      master
      slave1
      slave2
      
  9. 启动hbase

     /usr/local/cluster/hbase/bin/start-hbase.sh
    
  10. 验证hbase是否启动成功。
    在master输入 jps,应当存在HMaster和HRegionServer。

    jps_hbase_master_region

    在slave1和slave2输入jps,应当存在HRegionServer。

    jps_hbase_region

    进一步验证,访问:http://master:16010/master-status,如图。

    web_hbase

踩坑记录:HBase装完之后,发现HREgionServer可以启动,但是HMaster却始终无法启动,通过日志文件发现报的错误如下:
java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:635) at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:619) at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295) at org.apache.hadoop.hbase.util.CommonFSUtils.getRootDir(CommonFSUtils.java:358) at org.apache.hadoop.hbase.util.CommonFSUtils.isValidWALRootDir(CommonFSUtils.java:407) at org.apache.hadoop.hbase.util.CommonFSUtils.getWALRootDir(CommonFSUtils.java:383) at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:691) at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:600) at org.apache.hadoop.hbase.master.HMaster.<init>(HMaster.java:484) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.apache.hadoop.hbase.master.HMaster.constructMaster(HMaster.java:2965) at org.apache.hadoop.hbase.master.HMasterCommandLine.startMaster(HMasterCommandLine.java:236) at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:140) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149) at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:2983) Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 25 more 2018-08-01 23:30:33,794 ERROR [main] master.HMasterCommandLine: Master exiting java.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster. at org.apache.hadoop.hbase.master.HMaster.constructMaster(HMaster.java:2972) at org.apache.hadoop.hbase.master.HMasterCommandLine.startMaster(HMasterCommandLine.java:236) at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:140) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149) at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:2983) Caused by: java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:635) at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:619) at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295) at org.apache.hadoop.hbase.util.CommonFSUtils.getRootDir(CommonFSUtils.java:358) at org.apache.hadoop.hbase.util.CommonFSUtils.isValidWALRootDir(CommonFSUtils.java:407) at org.apache.hadoop.hbase.util.CommonFSUtils.getWALRootDir(CommonFSUtils.java:383) at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:691) at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:600) at org.apache.hadoop.hbase.master.HMaster.<init>(HMaster.java:484) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.apache.hadoop.hbase.master.HMaster.constructMaster(HMaster.java:2965) ... 5 more Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 25 more
这个问题耗费了很长时间都没找到错误原因,最终在这里找到了解决方法。

cp $HBASE_HOME/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar $HBASE_HOME/lib/

"个人感觉hbase-2.1.0编译的问题,建议以后还是自己编译一下hbase代码,目前还不知道这样改动会有什么问题。"

总结

以上,就完成了整个集群环境的搭建。希望没有坑到你。如果不幸坑到了你,欢迎留言吐槽!

写在最后

欢迎大家关注我的个人博客复旦猿

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容