1 基本信息
1.1 軟件信息
hadoop-2.6.0
zookeeper-3.4.6
hbase-0.98.9-hadoop2
(以下示例中使用的操作系統是Centos 6.5,請將下載的3個tar包分別解壓並放置在/usr/local/目錄下)
(Hbase包中lib裏可以看到zookeeper的jar包,從文件名可以確定使用的zookeeper版本)
1.2 集羣組成:
Server Name | Hadoop Cluster | Zookeeper Ensemble | HBase Cluster |
hadoopnamenode | Name node & Resource manager | √ | Master |
hadoop2ndnamenode | Secondary name node | √ | |
hadoopdatanode1 | Data node & Node manager | √ | Region server |
hadoopdatanode2 | Data node & Node manager | Region server | |
hadoopdatanode3 | Data node & Node manager | Region server |
2 Hadoop集羣
2.1 配置
2.1.1 core-site.xml
<configuration><property><name>fs.defaultFS</name><value>hdfs://hadoopnamenode:9000</value></property></configuration>
2.1.2 hdfs-site.xml
<configuration><property><name>dfs.namenode.name.dir</name><value>file:/root/hadoopdata/namenode</value></property><property><name>dfs.datanode.data.dir</name><value>file:/root/hadoopdata/datanode</value></property><property><name>dfs.namenode.secondary.http-address</name><value>hadoop2ndnamenode:9001</value></property></configuration>
2.1.3 mapred-site.xml
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property></configuration>
2.1.4 yarn-site.xml
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name><value>org.apache.hadoop.mapred.ShuffleHandler</value></property><property><name>yarn.resourcemanager.resource-tracker.address</name><value>hadoopnamenode:8025</value></property><property><name>yarn.resourcemanager.scheduler.address</name><value>hadoopnamenode:8030</value></property><property><name>yarn.resourcemanager.address</name><value>hadoopnamenode:8040</value></property></configuration>
2.1.5 slaves
hadoopdatanode1 hadoopdatanode2 hadoopdatanode3
2.1.6 /etc/hosts
153.65.170.45 hadoopnamenode.mh.com hadoopnamenode 153.65.171.174 hadoop2ndnamenode.mh.com hadoop2ndnamenode 153.65.171.20 hadoopdatanode1.mh.com hadoopdatanode1 153.65.170.204 hadoopdatanode2.mh.com hadoopdatanode2 153.65.170.85 hadoopdatanode3.mh.com hadoopdatanode3
2.1.7 ~/.bashrc
與上一篇博客介紹的Hadoop 1類似,爲了方便起見,修改.bashrc設置環境變量,注意sbin最好也要加到path中:
export HADOOP_PREFIX=/usr/local/hadoop-2.6.0 export HADOOP_MAPRED_PREFIX=$HADOOP_PREFIX export HADOOP_HDFS_PREFIX=$HADOOP_PREFIX export HADOOP_YARN_PREFIX=$HADOOP_PREFIX export PATH=$PATH:$HADOOP_PREFIX/bin export PATH=$PATH:$HADOOP_PREFIX/sbin
2.1.8 分發到集羣的其它機器
把hadoop-2.6.0文件夾連同修改後的配置文件以及hosts文件,通過scp拷貝到其它四臺機器上。
(並沒有要求說所有的機器上都使用一樣的配置文件,比如namenode的hdfs-site.xml應該是不需要dfs.datanode.data.dir配置,而datanode的hdfs-site.xml應該不需要dfs.namenode.name.dir配置。而也只有namenode上需要配置slaves文件。這裏是爲了簡單起見,我們讓所有機器上都保持一樣的配置)
2.1.9 設置ssh免密碼訪問
參見上一篇博客。
2.1.10 一些配置參數的解釋
Hadoop 2中沒有mapred.job.tracker了,新框架中已改爲yarn-site.xml 中的 resouceManager 及 nodeManager具體配置項,新框架中歷史 job 的查詢已從Job tracker剝離,歸入單獨的mapreduce.jobtracker.jobhistory 相關配置。
yarn.resourcemanager.address---NodeManager 與 RM 通信的接口地址
yarn.resourcemanager.scheduler.address---NodeManger 需要知道 RM 主機的 scheduler 調度服務接口地址
yarn.resourcemanager.resource-tracker.address---NodeManager 需要向 RM 報告任務運行狀態供 Resouce 跟蹤,因此 NodeManager 節點主機需要知道 RM 主機的 tracker 接口地址
yarn.resourcemanager.webapp.address---各個 task 的資源調度及運行狀況通過通過該 web 界面訪問
2.2 創建目錄
在namenode上創建: /root/hadoopdata/namenode
在3臺datanode上創建: /root/hadoopdata/datanode
(也可以讓hadoop自動創建)
2.3 啓動/關閉
start-dfs.sh,執行之後,使用jps命令查看java進程情況:
hadoopnamenode上有namenode進程,
hadoop2ndnamenode上有secondarynamenode進程,
hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode進程
start-yarn.sh,執行之後的java進程情況:
hadoopnamenode上有namenode, resourcemanager進程,
hadoop2ndnamenode上有secondarynamenode進程,
hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode, nodemanager進程
關閉的命令對應的是stop-dfs.sh, stop-yarn.sh
2.4 測試
hdfs dfsadmin -report //查看hdfs的一些基本信息
yarn node –list //查看yarn的一些基本信息
可以使用hadoop的share目錄下的一些mapreduce示例程序進行測試,比如wordcount:
先使用copyFromLocal命令(後續有介紹用法)把一個本地文本文件放到hdfs的/book目錄下,然後執行:
hadoop jar /usr/local/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /book /out2
即對/book目錄下的書進行單詞統計,然後輸出到/out2目錄。
可以登錄web界面檢查hadoop是否運行正常:
hdfs管理界面同hadoop 1: http://hadoopnamenode:50070/
yarn的管理界面不再是原來的50030端口,而是http://hadoopnamenode:8088/
2.5 注意事項
若namenode上的core-site.xml中的fs.defaultFS缺失,則啓動時會報錯。
若各機器上的yarn-site.xml中的yarn.resourcemanager.resource-tracker.address缺失,雖然resourcemanager與nodemanager進程能夠正常啓動,但是在執行yarn node -list會出現node數量爲0的情況。
若各機器上的yarn-site.xml中的yarn.resourcemanager.scheduler.address或yarn.resourcemanager.address缺失,則在運行job時,會卡在INFO mapreduce.Job: Job job_1422695884569_0001 running in uber mode : false
2.6 幾個Hadoop fs shell命令
hadoop fs -ls / ---列出hdfs根目錄下的文件、目錄
hadoop fs -ls /out2 ---列出out2目錄下的文件、目錄
hadoop fs -lsr / ---遞歸顯示文件
hadoop fs -cat /out2/part-r-00000 ---打出文件內容
hadoop dfs -copyFromLocal <local_FS_filename> <target_on_HDFS>
hadoop fs -du hdfs://namenodehost/user/hadoop ---查看目錄大小
hadoop fs -rm /user/hadoop/file ---刪除文件或空目錄
hadoop fs -rmr /user/hadoop/dir ---刪除文件或目錄,遞歸之意
hafoop fs -tail /user/hadoop/sales.dat ---查看文件內容
注1:
dfs was deprecated in favor of "fs" command.
所以原來的hadoop dfs -copyFromLocal <local_FS_filename> <target_on_HDFS>,現在的寫法是
hadoop fs -copyFromLocal <local_FS_filename> <target_on_HDFS>
注2:
hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test 這樣生成的test是文件,而不是文件夾
所以一般hadoop fs -copyFromLocal /root/Downloads/small /test,這樣small下的文件會被copy到test文件夾下
又或者hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test4/,注意最後的/,前提是要用hadoop fs -mkdir先創建出test4目錄
3 Zookeeper集羣
3.1 配置
3.1.1 zoo.cfg
tickTime=2000 dataDir=/root/zookeeperdata clientPort=2181 initLimit=5 syncLimit=2 server.1=hadoopnamenode:2888:3888 server.2=hadoop2ndnamenode:2888:3888 server.3=hadoopdatanode1:2888:3888
3.1.2 分發到集羣的其它機器
把zookeeper文件夾連同修改後的配置文件通過scp拷貝到另外兩臺機器(hadoop2ndnamenode, hadoopdatanode)上。
3.1.3 設置myid
hadoopnameonde上echo”1” > /root/zookeeperdata/myid
hadoop2ndnamenode上echo “2” > /root/zookeeperdata/myid
hadoopdatanode上echo”3” > /root/zookeeperdata/myid
3.1.4 一些配置參數的解釋
tickTime :心跳時間,單位毫秒。同時tickTime又是zookeeper中的基本單位,比如後面的initLimit=5就是指5個tickTime時間,在這裏是10秒。
dataDir :存儲數據信息的本地目錄。
3.2 創建目錄
在hadoopnamenode, hadoop2ndnamenode, hadoopdatanode1上創建dataDir中配置的目錄/root/zookeeperdata。
3.3 啓動/關閉
{ZOOKEEPER_HOME} /bin/zkServer.sh start
啓動和關閉命令必須到zookeeper集羣的每個機器上,沒有像start-dfs.sh那樣的命令可以一下子把整個集羣啓動。
關閉:{ZOOKEEPER_HOME} /bin/zkServer.sh stop
3.4 測試
{ZOOKEEPER_HOME} /bin/zkServer.sh status
以下是結果示例,可以看到各機器的角色是follower還是leader。
[root@hadoopnamenode zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[root@hadoop2ndnamenode zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
[root@hadoopdatanode1 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
3.5 注意事項
對於一個包含3臺server的Zookeeper集羣,最多容許關閉一臺(如果被關閉的是leader,則會重新選舉出一個)。如果關閉兩臺,則剩下那臺雖然進程QuorumPeerMain還在,但zkServer.sh status查看狀態則顯示Error contacting service. It is probably not running。
對於一個包含5臺server的Zookeeper集羣,最多容許關閉兩臺。關閉三臺,則剩下兩臺雖然進程QuorumPeerMain還在,但也顯示同樣的錯誤。
(如果這個時候用Java程序去連接Hbase,則會提示:org.apache.hadoop.hbase.ZooKeeperConnectionException: Can't connect to ZooKeeper)
這裏面有兩個常見的疑問:
1) 當3臺server關閉一臺時,只剩下兩臺時,無法形成majority,那麼它是如何選舉出leader的?
2) 當5臺server關閉三臺時,剩下兩臺,爲什麼不能像1)中一樣仍然正常工作?
這兩個問題的答案是同一個,Zookeeper中的所謂majority voting機制,其majority是針對原始的server數量,不是指變化後的數量,這個原始的數量即你配置在zoo.cfg中的server個數。
還有一個常見的問題是爲什麼推薦使用奇數個Zookeeper server,那是因爲3個server與4個server能夠提供的可靠性是一樣的,3臺server的集羣允許其中一臺server宕機,而4臺server的集羣也只能容許其中一臺server宕機,因爲如果兩臺server宕機,那麼剩下兩臺,對比於原來的4臺,2/4不夠成大多數。
4 Hbase集羣
4.1 配置
4.1.1 hbase-env.sh
其它不變,export HBASE_MANAGES_ZK=false,這表示不使用hbase自帶的zookeeper,而使用外部的zookeeper(這裏指我們在上面建的zookeeper)
4.1.2 hbase-site.xml
<configuration><property> <name>hbase.rootdir</name> <value>hdfs://hadoopnamenode:9000/hbase</value> <description>The directory shared by region servers.</description></property><property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> <description>Property from ZooKeeper's config zoo.cfg. The port at which the clients will connect. </description></property><property> <name>zookeeper.session.timeout</name> <value>120000</value></property><property> <name>hbase.zookeeper.quorum</name> <value>hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1</value></property><property> <name>hbase.tmp.dir</name> <value>/root/hbasedata</value></property><property> <name>hbase.cluster.distributed</name> <value>true</value></property></configuration>
4.1.3 regionservers
hadoopdatanode1 hadoopdatanode2 hadoopdatanode3
4.1.4 一些配置參數的解釋
hbase.zookeeper.property.clientPort:指定zk的連接端口
zookeeper.session.timeout:RegionServer與Zookeeper間的連接超時時間。當超時時間到後,ReigonServer會被Zookeeper從RS集羣清單中移除,HMaster收到移除通知後,會對這臺server負責的regions重新balance,讓其他存活的RegionServer接管.
hbase.zookeeper.quorum:默認值是 localhost,列出zookeepr ensemble中的servers
4.2 啓動/關閉
bin/start-hbase.sh
bin/stop-hbase.sh
4.3 測試
在hadoopnamenode上執行
{HBASE_HOME}/bin/hbase shell
進入shell命令行,通過創建表等操作來檢查不是不工作正常。
或者通過一個簡單的Java程序來測試:
Configuration config = HBaseConfiguration.create(); config.set( "hbase.zookeeper.quorum", "hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1" ); config.set( "hbase.zookeeper.property.clientport", "2181" );//config.set("zookeeper.znode.parent", "/hbase-unsecure"); // this is what most people miss :) HBaseAdmin.checkHBaseAvailable( config ); HTable t = new HTable( config, "test" ); Scan s = new Scan();//s.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("name")); ResultScanner rs = t.getScanner( s );try{ for ( Result r : rs ) { for ( Cell cell : r.rawCells() ) { System.out.println( "RowName:" + new String( CellUtil.cloneRow( cell ) ) + " " ); System.out.println( "Timetamp:" + cell.getTimestamp() + " " ); System.out.println( "column Family:" + new String( CellUtil.cloneFamily( cell ) ) + " " ); System.out.println( "row Name:" + new String( CellUtil.cloneQualifier( cell ) ) + " " ); System.out.println( "value:" + new String( CellUtil.cloneValue( cell ) ) + " " ); } } } finally { t.close(); } System.out.println( "Done!" );
注意,java測試程序所在機器的hosts文件,注意必須有全FDQN(fully qualified domain name, 參見上面linux中的hosts文件),否則有java訪問時會提示找不到hadoopnamenode.mh.com
4.4 注意事項
HBase集羣需要依賴於一個Zookeeper ensemble。HBase集羣中的所有節點以及要訪問HBase的客戶端都需要能夠訪問到該Zookeeper ensemble。HBase自帶了Zookeeper,但爲了方便其他應用程序使用Zookeeper,最好使用單獨安裝的Zookeeper ensemble。
此外,Zookeeper ensemble一般配置爲奇數個節點,並且Hadoop集羣、Zookeeper ensemble、HBase集羣是三個互相獨立的集羣,並不需要部署在相同的物理節點上,他們之間是通過網絡通信的。
需要注意的是,如果要禁止啓動hbase自帶的zookeeper,那麼,不僅僅需要剛纔的export HBASE_MANAGES_ZK=false配置,還需要hdfs-site.xml中的hbase.cluster.distributed爲true,否則你在啓動時會遇到Could not start ZK at requested port of 2181 錯誤,這是因爲hbase嘗試啓動自帶的zookeeper,而我們已經啓動了自己安裝的那個zookeeper,默認都使用2181端口,所以出錯。
還有,有時候會遇到stop-hbase.sh執行很長時間未結束,很可能的原因是你之前把zookeeper關閉了.
最後,Hbase不需要mapreduce,所以只要start-dfs.sh啓動hdfs,然後到zookeeper各節點上啓動zookeeper,最後再hbase-start.sh啓動hbase即可.