這兩天正在為公司配置一個Hadoop叢集(以及HBase),作為儲存及計算海量資料的平台。現在將安裝的過程貼出來,僅供參考。
Hadoop的配置
叢集IP: 172.16.38.213 ~ 172.16.38.218
(hostname分別為master、slave0、slave1、slave2、slave3、slave4)
使用者名稱/密碼:root/123456
其中,master作為jobtracker和namenode,其餘節點作為tasktracker和datanode
修改每個節點的 /etc/hosts檔案,追加如下內容
172.16.38.213 master
172.16.38.214 slave0
172.16.38.215 slave1
172.16.38.216 slave2
172.16.38.217 slave3
172.16.38.218 slave4
再修改每個節點自己的hostname,如對於master,將其/etc/sysconfig/network檔案改為
NETWORKING=yes
HOSTNAME=master
然後,運行
hostname master
退出,再進入輸入env | grep hostname發現修改生效
1、 在master節點上運行
ssh-keygen –t rsa
2、 在master節點上,首先
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
然後
chmod 644 ~/.ssh/authorized_keys
3、將master節點上的~/.ssh/id_rsa.pub檔案分別scp到每個slave節點上,如
scp ~/.ssh/id_rsa.pub root@slave0:/home
4、 登入每個slave節點,運行(以slave0為例)
cat /home/id_rsa.pub >> ~/.ssh/authorized_keys
5、 修改檔案許可權
chmod 600 ~/.ssh/authorized_keys
6、從第3步開始迴圈,直至配置好每個slave節點
下載hadoop-1.1.2,放在/home/LTE目錄下,用命令 tar zxvf hadoop-1.1.2.tar.gz解壓,在/home/LTE下組建目錄hadoop-1.1.2
修改conf/core-site.xml檔案
<configuration> <property> <name>fs.default.name</name> <value>hdfs://master:54310</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/LTE/hadoop/tmp</value> </property> </configuration> |
在conf/hadoop-env.xml檔案裡增加
export JAVA_HOME=/usr/local/java/jdk1.6.0_32
修改conf/hdfs-site.xml檔案:
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.data.dir</name> <value>/home/LTE/hadoop/data</value> </property> <property> <name>dfs.name.dir</name> <value>/home/LTE/hadoop/name</value> </property> </configuration> |
修改conf/mapred-site.xml檔案:
<configuration> <property> <name>mapred.job.tracker</name> <value>master:9001</value> </property> <property> <name>mapred.local.dir</name> <value>/home/LTE/hadoop/temp</value> </property> </configuration>
|
conf/masters檔案
conf/slaves檔案
slave0 slave1 slave2 slave3 slave4 |
從master節點上,將/home/LTE目錄依次拷貝到每個slave節點的/home目錄下
在master節點的/home/LTE/hadoop-1.1.2目錄下進行HDFS的格式化
bin/hadoop namenode –format
格式化後,HDFS中的內容會全部丟失
然後,開啟Hadoop叢集
bin/start-all.sh
此時,Hadoop叢集已經啟動,可以提交運算的作業了。
HBase的配置
安裝HBase時,不僅需要HBase本身,還需要ZooKeeper來提供、管理和協調分布式服務。在運行HBase之前,也需要先啟動ZooKeeper服務。
另外,有些版本的HBase只能支援特定版本的Hadoop,如下表:
在本文中,採用了Hadoop-1.1.2,HBase-0.94.8,以及ZooKeeper-3.4.5
由於ZooKeeper採用了Paxos演算法來進行選舉,因此實際能夠有效參與選舉的節點數量是奇數。所以,我們在安裝HBase和ZooKeeper時,只採用奇數個節點(本文採用5個節點,分別為master、slave0、slave1、slave2、slave3)。
安裝ZooKeeper
將zookeeper-3.4.5.tar.gz在/home/LTE下解壓,產生zookeeper-3.4.5目錄。在/home/LTE/zookeeper-3.4.5/conf中,有zoo_sample.cfg檔案,使用命令 cp zoo_sample.cfg zoo.cfg 命令產生 zoo.cfg設定檔。編輯zoo.cfg的內容,如下:
# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=10# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.# do not use /tmp for storage, /tmp here is just # example sakes.dataDir=/home/LTE/zookeeper# the port at which the clients will connectclientPort=2181server.1=master:2888:3888server.2=slave0:2888:3888server.3=slave1:2888:3888server.4=slave2:2888:3888server.5=slave3:2888:3888## 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
為了讓系統能夠識別zoo.cfg中的server.id=host:port:port中的server.id,在master節點的/home/LTE/zookeeper中建立一個檔案myid,裡面只有一個數字1;同理,在slave0節點的/home/LTE/zookeeper中建立一個檔案myid,裡面只有一個數字2;以此類推…. 直至slave3節點。注意,這裡id的範圍是1~255 。以上配置(zookeeper以及zookeeper-3.4.5)要複製到叢集中的每一個節點上去。
在/etc/profile的最後添加:
export HBASE_HOME=/home/LTE/hbase-0.94.8export HADOOP_HOME=/home/LTE/hadoop-1.1.2export ZK_HOME=/home/LTE/zookeeper-3.4.5export JAVA_HOME=/usr/local/java/jdk1.6.0_32export CLASSPATH=$CLASSPATH:$HBASE_HOME/lib:$JAVA_HOME/libexport PATH=$JAVA_HOME/bin:$HBASE_HOME/bin:$ANT_HOME/bin:$HADOOP_HOME/bin:$ZK_HOME/bin:$PATH
然後,source /etc/profile
這個操作要在叢集的每一個節點上進行
啟動ZooKeeper
在每一個節點的/home/LTE/zookeeper-3.4.5/bin中執行命令: ./zkServer.sh start
這樣就啟動了zookeeper叢集中的各個節點。
輸入命令./zkServer.sh status
可以查看當前節點在zookeeper叢集中的角色是leader還是follower
安裝HBase
將/home/LTE/hbase-0.94.8.tar.gz解壓,產生/home/LTE/hbase-0.94.8。在hbase-0.94.8/lib中,原來有一個hadoop-core-1.0.4.jar檔案,但是我們用的Hadoop的版本是hadoop-1.1.2,所以需要將hbase-0.94.8/lib/hadoop-core-1.0.4.jar替換成hadoop-1.1.2/hadoop-core-1.1.2.jar,否則會有衝突。
開啟conf/hbase-env.sh檔案,將其中最後一行改為:
export HBASE_MANAGES_ZK=false
這表示我們不使用hbase-0.94.8內建的zookeeper,而是使用我們剛才自己安裝的zookeeper-2.3.4(具體指定使用哪個zookeeper是通過/etc/profile中的ZK_HOME變數來指定的)。
下面,開啟conf/hbase-site.xml檔案,添加以下內容:
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://master:54310/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master,slave0,slave1,slave2,slave3</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/LTE/zookeeper/dataDir</value> </property></configuration>
其中,我們需要通過hbase.rootdir指定HDFS的一個namenode節點,並讓HBase將資料寫入HDFS中的一個目錄(本例中就是hdfs://master:54310/hbase);hbase.zookeeper.quorum指定了哪些節點運行Quorum Peer(即QuorumPeerMain進程),個數需為奇數。
下面,開啟檔案conf/regionservers,添加以下內容:
slave0slave1slave2slave3
該檔案指定了HRegionServer進程將在哪些節點上運行。
以上配置需要在HBase的每一個節點中生效。
啟動HBase
OK,現在HBase叢集配置好了。我們來啟動HBase。
進入$HBASE_HOME/bin目錄下,輸入命令
./start-hbase.sh
在HBase叢集啟動之後,鍵入命令
./hbase shell
啟動HBase的控制台介面
我們可以在瀏覽器中查看HBase系統的運行狀態,地址為http://172.16.38.213:60010/master-status,其中172.16.38.213是master所在節點的IP.
常見問題HBase中的某個節點無法啟動
這很可能是因為叢集中各個節點的系統時間不一致(時間差超出了某個閾值),這是我們需要將幾台機器間的時間調整一致。
我們可以將master作為時間伺服器,讓其他機器與master進行對時。
首先,在master上鍵入命令 service ntpd start 來開啟master上的時間伺服器。
等待幾分鐘後,在其他每一台機器上鍵入命令 ntpdate master 來與master進行對時