前言
實驗室項目需要部署一個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集群環境要求所有主機的用戶和用戶組要完全一致。配置過程如下:
- 新建用戶,建議用adduser命令。
因為使用了sudo命令,所以要輸入當前用戶的密碼才能進行下一步的操作。配置hadoop用戶密碼需要輸入兩次密碼,然后一直按回車,最后輸入Y確定。在無密碼的情況下,應該緊接著使用passwd命令,為hadoop用戶設置密碼:sudo adduser hadoop
passwd hadoop
- 在創建hadoop用戶的同時也創建了hadoop用戶組,下面把hadoop用戶加入到hadoop用戶組。
sudo usermod -a -G hadoop hadoop
- 前面一個hadoop是組名,后面一個hadoop是用戶名。完成后輸入一下命令查詢結果。
cat /etc/group
- 然后再把hadoop用戶賦予root權限,讓他可以使用sudo命令。
修改文件如下:sudo vi /etc/sudoers
保存退出,hadoop用戶就擁有了root權限。# User privilege specification root ALL=(ALL) ALL hadoop ALL=(ALL) ALL # 添加這一行配置
配置主機名
我們一開始就給出了3臺主機的主機名(master、slave1、slave2),但是默認的主機名卻是千奇百怪,因此要把原來的主機名改成我們設定的。
-
編輯 /etc/hostname ,把里面的內容更改為你所需要的設定的主機名。
sudo vim /etc/hostname
-
更改hosts文件,修改(或增加)127.0.1.1后面的名稱改為設定值。
sudo vim /etc/hosts
-
重啟服務器,更改生效。
sudo reboot
-
驗證。重新登錄后,會發現主機名已經更改為設定值了。
hostname -
修改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文件的截圖。
安裝配置SSH
在Hadoop運行過程中,主從機之間是通過SSH進行通信的,所以需要對所有主機進行SSH的安裝和配置工作。
- 先更新一下apt。
sudo apt-get update
- 接下來,安裝SSH。
sudo apt-get install openssh-server
- 安裝完成之后,使用下面的命令來查看SSH是否安裝成功。
如果有輸出就表示SSH安裝成功了。也可以使用SSH登陸本地機器來測試一下。ps -e | grep ssh
ssh localhost
溫馨提示:安裝好SSH之后,大家就可以使用SSH進行遠程操作了。如果是虛擬機的話,大家可能對此沒有什么感覺;但如果是物理機的話,這就十分方便了。集群中所有主機的配置只需要一臺MAC就搞定了。
配置免密登錄SSH
主機間免密登錄才能實現主機間的順暢通信,因此該環節非常重要!
-
在master主機上生成密鑰對。
ssh-keygen -t rsa
輸入后一直回車選擇默認即可。
keygen
-
將公鑰(~/.ssh/id_rsa.pub中的內容)復制到文件authorized_keys中去。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
分別在從機slave1,slave2上都進行同樣的操作,同時將兩個從機的公玥都復制到主機master的~/.ssh/authorized_keys中去。
即將slave1和slave2~/.ssh/authorized_keys
里面的內容添加到master上的~/.ssh/authorized_keys
里面。-
將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密碼。
-
驗證一下免密登錄是否成功。在master上登錄slave1、slave2(其他主機上驗證方法也是一樣的)。
ssh slave1
如果是第一次登錄,則會要求輸入密碼,但之后登錄都不再需要密碼。那么,恭喜你,這一步配置已經完美結束了!
ssh
關閉防火墻
集群需要開放很多端口,因此,為了避免出現端口未開放的問題,我索性關閉了防火墻。我使用ufw命令關閉防火墻。
- 關閉防火墻
sudo ufw disable
- 查看防火墻狀態
sudo ufw status
ufw status
正式搭建
如果你已經配置到了這一步,那么恭喜你,因為你已經完成了集群搭建工作的一大半任務了,下面,讓我們繼續剩下一小半的任務吧~
接下來的任務全部通過SSH遠程配置。
同樣,給出這一部分的配置清單:
配置項 | master | slave1 | slave2 |
---|---|---|---|
Java JDK | √ | √ | √ |
Zookeeper | √ | √ | √ |
Hadoop | √ | √ | √ |
HBase | √ | √ | √ |
Java JDK
Hadoop的有些計算是通過jar包進行分布式計算的。因此,安裝Hadoop前需要安裝JDK。
java JDK下載傳送門。
-
將JDK下載到本地后,通過scp命令將安裝包發送到每個主機上。
scp jdk-8u191-linux-x64.tar.gz hadoop@10.100.200.220:~/
-
登錄master主機。
ssh hadoop@10.100.200.220
-
在 /usr/local/ 中建 cluster文件夾。
mkdir /usr/local/cluster
-
進入服務器根目錄下,將jdk-8u191-linux-x64.tar.gz解壓至 /usr/local/cluster中。
tar -zxvf ~/jdk-8u191-linux-x64.tar.gz -C /usr/local/cluster/
-
進入 /usr/local/cluster 中,為了方便日后版本的更新,這里使用軟鏈接的方法。
cd /usr/local/cluster ln -s jdk1.8.0_191 java
-
進行環境變量的配置。
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
-
使環境變量立刻生效。
source ~/.bashrc
-
驗證環境變量是否配置成功。
java -version
如果輸出如下圖所示,即代表JDK環境變量配置好了。
java version
Zookeeper
Zookeeper下載傳送門。
-
將Zookeeper下載到本地后,通過scp命令將安裝包發送到master主機上。下面以master為例介紹安裝配置,其他的主機安裝和配置是完全一樣的。
scp zookeeper-3.4.12.tar.gz hadoop@10.100.200.220:~/
-
進入服務器根目錄下,將zookeeper-3.4.12.tar.gz解壓至 /usr/local/cluster中。
tar -zxvf ~/zookeeper-3.4.12.tar.gz -C /usr/local/cluster/
-
進入 /usr/local/cluster 中,為了方便日后版本的更新,這里使用軟鏈接的方法。
cd /usr/local/cluster ln -s zookeeper-3.4.12 zookeeper
-
設置環境變量,在 ~/.bashrc 添加如下內容。
#zookeeper export ZOOKEEPER=/usr/local/cluster/zookeeper export PATH=$PATH:$ZOOKEEPER/bin
-
使環境變量立刻生效。
source ~/.bashrc
-
配置zookeeper
- 建立數據和日志文件
mkdir /usr/local/cluster/zookeeper/data mkdir /usr/local/cluster/zookeeper/logs
- 進入conf目錄創建并修改zoo.cfg文件
修改后的內容為:cp zoo_sample.cfg zoo.cfg
這里還需要在數據目錄 /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時所使用的端口。# 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
- 建立數據和日志文件
-
使用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要改成對應的值!!!
重要的事情說三遍!!!
-
啟動zookeeper。
在各個節點執行以下命令:.zkServer.sh start
輸入jps進行驗證。
jps_zookeeper
- 查看各個主機的狀態。
zkServer.sh status
zookeeper status
Hadoop
Hadoop下載傳送門。
-
將Hadoop下載到本地后,通過scp命令將安裝包發送到master上。
scp hadoop-2.8.5.tar.gz hadoop@10.100.200.220:~/
-
進入服務器根目錄下,將hadoop-2.8.5.tar.gz解壓至 /usr/local/cluster中。
tar -zxvf ~/hadoop-2.8.5.tar.gz -C /usr/local/cluster/
-
進入 /usr/local/cluster 中,為了方便日后版本的更新,這里使用軟鏈接的方法。
cd /usr/local/cluster ln -s hadoop-2.8.5 hadoop
-
設置環境變量,在 ~/.bashrc 添加如下內容。
#hadoop export HADOOP_HOME=/usr/local/cluster/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
-
使環境變量立刻生效。
source ~/.bashrc
-
驗證Hadoop是否安裝成功。
hadoop version
如果輸出hadoop版本信息即安裝成功。
-
配置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/
-
-
運行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 - 啟動namenode,如果是第一次啟動namenode,需要對namenode進行格式化。命令如下:
HBase
HBase下載傳送門。
-
將HBase下載到本地后,通過scp命令將安裝包發送到master主機上。
scp hbase-2.1.0-bin.tar.gz hadoop@10.100.200.220:~/
-
進入服務器根目錄下,將hbase-2.1.0-bin.tar.gz解壓至 /usr/local/cluster中。
tar -zxvf ~/hbase-2.1.0-bin.tar.gz -C /usr/local/cluster/
-
進入 /usr/local/cluster 中,為了方便日后版本的更新,這里使用軟鏈接的方法。
cd /usr/local/cluster ln -s hbase-2.1.0 hbase
-
設置環境變量,在 ~/.bashrc 添加如下內容。
#hbase export HBASE_HOME=/usr/local/cluster/hbase export PATH=$PATH:$HBASE_HOME/bin
-
使環境變量立刻生效。
source ~/.bashrc
-
驗證Hbase是否安裝成功。
hbase version
如果輸出hadoop版本信息即安裝成功。
-
配置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
-
啟動hbase
/usr/local/cluster/hbase/bin/start-hbase.sh
-
驗證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代碼,目前還不知道這樣改動會有什么問題。"
總結
以上,就完成了整個集群環境的搭建。希望沒有坑到你。如果不幸坑到了你,歡迎留言吐槽!
寫在最后
歡迎大家關注我的個人博客復旦猿。