1. 系統環境
1.1. 軟件版本
下表為本系統環境所安裝的軟件的版本信息:
軟件類別 |
版本 |
下載地址 |
Hadoop |
|
官網 |
zookeeper |
|
官網 |
hbase |
|
官網 |
hive |
|
官網 |
|
|
|
|
|
|
1.2. 網絡配置
總共7台服務器和一個VIP,詳細信息如下:(主機名看下是否合法和能ping通,如果未配置dns強烈建議用IP,或者在每台機器hosts文件寫上所有IP的主機名)
主機名 |
IP地址 |
備注 |
hadoop001 |
192.168.63.201 |
|
hadoop002 |
192.168.63.202 |
|
hadoop003 |
192.168.63.203 |
|
hadoop004 |
192.168.63.204 |
|
hadoop005 |
192.168.63.205 |
|
hadoop006 |
192.168.63.206 |
|
hadoop007 |
192.168.63.207 |
|
hadoop |
192.168.63.200 |
設置Hadoop的VIP |
2. 目的
掌握hadoop的安裝和部署HDFS,Hbase,Hive等組件。
3. Hadoop簡介
Hadoopt是一個分布式系統基礎架構,由Apache基金會開發。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力高速運算和存儲。Hadoop實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有着高容錯性的特點,並且設計用來部署在低廉的硬件上。而且它提供高傳輸率來訪問應用程序的數據,適合那些有着超大數據集的應用程序。HDFS放寬了POSIX的要求,這樣可以流的形式訪問文件系統中的數據。詳細介紹請參見:
http://zh.wikipedia.org/wiki/Hadoop
http://baike.baidu.com/view/908354.htm
http://www.blogjava.net/killme2008/archive/2008/06/05/206043.html
4. HDFS安裝部署。
4.1. 安裝准備
4.1.1. 機器准備
本例stage2環境如下:
IP地址 |
HDFS |
Zookeeper |
Hbase |
Hive |
192.168.63.201 |
Namenode |
- |
Hmaster |
hive |
192.168.63.202 |
Namenode(second) |
- |
Hmaster |
hive |
192.168.63.203 |
Datanode1 |
zookeeper |
HRegionServer |
hive |
192.168.63.204 |
Datanode2 |
zookeeper |
HRegionServer |
hive |
192.168.63.205 |
Datanode3 |
zookeeper |
HRegionServer |
hive |
192.168.63.206 |
Datanode4 |
- |
HRegionServer |
hive |
192.168.63.207 |
Datanode5 |
- |
HRegionServer |
hive |
NameNode:是Master節點,是大領導。管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;
SecondaryNameNode:是一個小弟,分擔大哥namenode的工作量;是NameNode的冷備份;合並fsimage和fsedits然后再發給namenode。
DataNode:Slave節點,奴隸,干活的。負責存儲client發來的數據塊block;執行數據塊的讀寫操作。
熱備份:b是a的熱備份,如果a壞掉。那么b馬上運行代替a的工作。
冷備份:b是a的冷備份,如果a壞掉。那么b不能馬上代替a工作。但是b上存儲a的一些信息,減少a壞掉之后的損失。
另請根據需要配置hostname或dns。另外,zookeeper最好使用獨立server。
4.1.2. Disable IPV6
cat /proc/sys/net/ipv6/conf/all/disable_ipv6 為0 則啟動 IPV6
如果你的環境是啟動IPV6的,請走以下3步:
n 在各節點上修改/etc/sysctl.conf
在文件末尾添加:
# add for hadoop net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 |
n 修改/etc/modprobe.conf (可略)
確保文件中包括以下兩條:
alias net-pf-10 off alias ipv6 off |
n 修改/etc/ sysconfig/network
確保NETWORKING_IPV6=no。
n 修改完后需要重啟機器
重啟后,通過命令:
# cat /proc/sys/net/ipv6/conf/all/disable_ipv6
查看是否已經disable。如果已經disable,結果是1。
4.1.3. Jdk安裝
略
4.1.4. 創建用戶
Hadoop需要統一用戶,這使用的是oracle賬號。
4.2. 介質下載
我們需要安裝的組件是cloudera hadoop,下載網址:
官網
我們需要的組件是hadoop,zookeeper,hbase和hive。
4.3. 安裝HDFS Cluster
4.3.1. 復制解壓
復制下載好的壓縮包到需要安裝的所有服務器指定目錄,並解壓修改目錄名。我們的環境下的hadoop及相關組件解析后如下:
[oracle@hadoop001 oracle]$ pwd /opt/oracle [oracle@hadoop001 oracle]$ ls hadoop hbase hive zookeeper |
4.3.2. SSH設置
設置從兩台namenode無密碼登錄到其它5台datanode。
n 生成密鑰
執行生成rsa密鑰的命令:
[oracle@hadoop001]$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter fi le in which to save the key (/home/oracle/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identifi cation has been saved in /home/oracle/.ssh/id_rsa. Your public key has been saved in /home/oracle/.ssh/id_rsa.pub. |
這樣就生成了一對公鑰和私鑰,私鑰保留在NameNode上,公鑰需要分發給其他各datanode節點。注意,不要輸入密碼,否則NameNode啟動的時候連接每個節點都需要你輸入密碼,當DataNode很多時,這是個災難。
n 分發公鑰
由於兩個NameNode節點都需要訪問各datanode節點,因此我們這里上傳到datanode的認證文件分別命名為authorized_keys和authorized_keys2。
Hadoop001上執行:
scp .ssh/id_rsa.pub hadoop003:/home/oracle/.ssh/authorized_keys scp .ssh/id_rsa.pub hadoop004:/home/oracle/.ssh/authorized_keys scp .ssh/id_rsa.pub hadoop005:/home/oracle/.ssh/authorized_keys scp .ssh/id_rsa.pub hadoop006:/home/oracle/.ssh/authorized_keys scp .ssh/id_rsa.pub hadoop007:/home/oracle/.ssh/authorized_keys |
Hadoop002上執行:
scp .ssh/id_rsa.pub hadoop003:/home/oracle/.ssh/authorized2_keys scp .ssh/id_rsa.pub hadoop004:/home/oracle/.ssh/authorized2_keys scp .ssh/id_rsa.pub hadoop005:/home/oracle/.ssh/authorized2_keys scp .ssh/id_rsa.pub hadoop006:/home/oracle/.ssh/authorized2_keys scp .ssh/id_rsa.pub hadoop007:/home/oracle/.ssh/authorized2_keys |
此時,可以從兩台namenode上使用oracle賬號無密碼登錄到各datanode服務器。
4.3.3. 環境變量設置:
修改~/.bashrc增加如下內容:
export HADOOP_HOME=/opt/oracle/hadoop export PATH=$PATH:$HADOOP_HOME/bin |
4.3.4. HDFS配置
HDFS可以在單機上部署進行模擬,本文不做該配置的介紹
本文僅做cluster的配置介紹。
HDFS的配置文件均放在$hadoop/conf目錄下。(新版本可能在$hadoop/etc/hadoop/以下配置7台服務器都相同。
n hadoop-env.sh
定義hadoop環境變量增加下面2行
export HADOOP_HEAPSIZE=6000 export JAVA_HOME=/opt/j2sdk1.6.29 export HADOOP_DATANODE_OPTS="-server -XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+HeapDumpOnOutOfMemoryError" |
core-site.xml
定義HDFS的NameNode地址和端口。
<?xml version=”1.0”?> <?xml-stylesheet type=”text/xsl” href=”confi guration.xsl”?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://hadoop:9000</value> 指定namenode 主機名跟端口 </property> <property> <name>io.file.buffer.size</name> <value>16384</value> </property> </configuration> |
n mapred-site.xml
定義MapReduce的JobTracker的地址和端口。
<?xml version=”1.0”?> <?xml-stylesheet type=”text/xsl” href=”confi guration.xsl”?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>mapred.job.tracker</name> <value>hadoop:9001</value> </property> </configuration> |
Map-reduce的參數配置,推薦值為(本部分暫時沒有優化,這部分請略過):
mapred.map.tasks = number of datanodes x 2 |
n hdfs-site.xml
定義文件復制份數。
<?xml version=”1.0”?> <?xml-stylesheet type=”text/xsl” href=”confi guration.xsl”?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> </property <property> <property> <name>dfs.data.dir</name> <value>/opt/hadoop/data/dfs</value> </property> <property> <name>dfs.name.dir</name> <value>/opt/hadoop/name</value> </property> <property> <name>dfs.datanode.handler.count</name> <value>300</value> </property> <property> <name>dfs.block.size</name> <value>33554432</value> </property> </configuration> |
|
<property>
<name>dfs.http.address</name>
<value>192.168.63.200:50000</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>192.168.63.202:51000</value>
</property>
- dfs.http.address:web管理監控端口,采用默認端口(namenode:50070,secondary:50090)時可以省略該配置
注意:
1) 在兩台namenode上建立以下目錄
/opt/hadoop/name
2) 在兩台datanode上建立以下目錄
/opt/hadoop/data/dfs
n masters
定義Secondary NameNode的地址
注:masters文件用於指定secondary的主機而不是namenode,slaves用於指定datanode和tasktracker,
namenode由core-site.xml fs.default.name指定,jobtracker由mapred-site.xml mapred.job.tracker指定
hadoop002 |
n slaves
定義DataNode的地址,可以是主機名或者IP。
hadoop003 hadoop004 hadoop005 hadoop006 hadoop007 |
n 配置同步
將以上修改過的5個配置文件,復制到其它6台機器。
4.3.5. 啟動HDFS
在NameNode的$hadoop安裝目錄下,執行如下命令:
[oracle@hadoop001 hadoop]$ bin/hadoop namenode -format 格式化 [oracle@hadoop001 hadoop]$ sbin/start-all.sh |
可以在各個節點上運行jps命令查看是否啟動成功:
[oracle@hadoop003 ~]$ jps 6160 TaskTracker 6039 DataNode 6879 Jps 6357 HRegionServer |
同時可訪問HDFS監控頁面:http://192.168.63.200:50070/dfshealth.jsp查看各節點狀況。
5. 安裝ZooKeeper
在Hadoop的復制解壓部分已經完成安裝。這部分介紹zookeeper的配置。
5.1. 配置ZooKeeper
n 修改zookeepr/conf/zoo.cfg
配置里面的server是zookeeper服務器的主機名。
# The number of milliseconds of each tick tickTime=2000 maxClientCnxns=0 # The number of ticks that the initial # synchronization phase can take initLimit=50 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. dataDir=/opt/hadoop/zookeeperdata # the port at which the clients will connect clientPort=2181 server.1=hadoop003:2888:3888 server.2=hadoop004:2888:3888 server.3=hadoop005:2888:3888 |
n 將zookeeper目錄復制到各個zookeeper節點上
我們的環境共3台zookeeper,復制到這3台即可。
n 新建目錄
在各zookeeper服務器上新建dataDir中配置的目錄,並添加myid文件,里面內容是該節點對應的server號,如上例hadoop003對應的myid文件內容就是:
1 |
echo "1" > /opt/hadoop/zookeeperdata/myid
5.2. 啟動zookeeper
在各zookeeper節點上運行zkServer.sh start。
cd /opt/oracle/zookeeper ./bin/zkServer.sh start tail zookeeper.out |
6. Hbase的安裝
6.1. 安裝Hbase
安裝Hbase需要先安裝好hadoop和ZooKeeper。
Hadoop的復制解壓部分已經完成安裝。這部分介紹Hbase的配置。
6.2. 配置Hbase
n 修改hbase/conf/hbase-site.xml
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop:9000/hbase</value> <description>The directory shared by region servers.</description> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.master.port</name> <value>60000</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop003,hadoop004,hadoop005</value> </property> <property> <name>hbase.regionserver.handler.count</name> <value>300</value> </property> <property> <name>hbase.hstore.blockingStoreFiles</name> <value>70</value> </property> <property> <name>zookeeper.session.timeout</name> <value>60000</value> </property>
<property> <name>hbase.regionserver.restart.on.zk.expire</name> <value>true</value> <description> Zookeeper session expired will force regionserver exit. Enable this will make the regionserver restart. </description> </property>
<property> <name>hbase.replication</name> <value>false</value> </property>
<property> <name>hfile.block.cache.size</name> <value>0.4</value> </property>
<property> <name>hbase.regionserver.global.memstore.upperLimit</name> <value>0.35</value> </property>
<property> <name>hbase.hregion.memstore.block.multiplier</name> <value>8</value> </property>
<property> <name>hbase.server.thread.wakefrequency</name> <value>100</value> </property>
<property> <name>hbase.master.distributed.log.splitting</name> <value>false</value> </property>
<property> <name>hbase.regionserver.hlog.splitlog.writer.threads</name> <value>3</value> </property> <property> <name>hbase.hstore.blockingStoreFiles</name> <value>20</value> </property> <property> <name>hbase.hregion.memstore.flush.size</name> <value>134217728</value> </property> <property> <name>hbase.hregion.memstore.mslab.enabled</name> <value>true</value> </property> </configuration> |
紅色部分是可能需要修改的,更多配置項請參考:
http://hbase.apache.org/book.html#configuration
n 修改hbase/conf/hbase-env.sh
添加如下4行內容:
export HBASE_HEAPSIZE=4000 export JAVA_HOME=/opt/j2sdk1.6.29 export HBASE_OPTS="-Xmx8g -Xms8g -Xmn128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log" export HBASE_MANAGES_ZK=false export HBASE_CLASSPATH=/opt/oracle/hadoop/conf hadoop配置文件位置 |
n 修改hbase/conf/log4j.properties
修改如下內容
hbase.root.logger=WARN,console log4j.logger.org.apache.hadoop.hbase=WARN |
n 在conf/regionservers中添加所有datanode的節點
添加以下內容:
hadooop003 hadooop004 hadooop005 hadooop006 hadooop007 |
6.3. 啟動Hbase
通過Hbase的安裝目錄執行bin/start-hbase.sh和bin/stop-hbase.sh 腳本啟動和停止HBase服務。
啟動方法:
[oracle@hadoop003 ~]$ cd /opt/oracle/hbase [oracle@hadoop003 hbase]$ bin/start-hbase.sh |
報錯
如果jdk沒問題可能你下載的包不對 需要 -bin-tar.gz 而不是src
7. Hive的安裝
7.1. 安裝Hive
Hadoop的復制解壓部分已經完成安裝。這部分介紹Hive的配置。
7.2. 創建hive的hdfs目錄
在namenode的hadoop安裝目錄下的bin目錄下執行創建操作:
[oracle@hadoop001 ~]$ cd /opt/oracle/hadoop/bin/ [oracle@hadoop001 ~]$ ./hadoop fs -mkdir -p /user/hive/warehouse |
7.3. 配置conf下的hive-default.xml
找到hive.zookeeper.quorum,配置為如下所示:
# modify|以下修改紅色部分 <property> <name>hive.zookeeper.quorum</name> <value> hadoop003,hadoop004,hadoop005</value> <description></description> </property> # add|以下添加紅色部分 <property> <name>hbase.zookeeper.quorum</name> <value>hadoop003,hadoop004,hadoop005</value> <description> </description> </property> # default|以下默認即可 <property> <name>hive.zookeeper.client.port</name> <value>2181</value> <description></description> </property> |
7.4. 復制jar包到Hadoop的lib下
第一台服務器都要執行:
cd /opt/oracle/hive/lib cp -a hbase-0.90.1-cdh3u0.jar zookeeper-3.3.1.jar hive-hbase-handler-0.7.0-cdh3u0.jar /opt/oracle/hadoop/lib |
創建hive表:
cd /opt/oracle/hive/bin hive -auxpath ../lib/hive-hbase-handler-0.7.0-cdh3u0.jar,../lib/hbase-0.90.1-cdh3u0.jar,../lib/zookeeper-3.3.1.jar -hiveconf hbase.zookeeper.quorum=hadoop003 |
在hive提示符下輸入:
CREATE TABLE app_log_rule(id STRING,app_code STRING,merchant_id STRING,order_type STRING,log_level STRING,log_location STRING,disabled STRING,param_map STRING) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping" = ":key,cf1:app_code,cf1:merchant_id,cf1:order_type,cf1:log_level,cf1:log_location,cf1:disabled,cf1:param_map") TBLPROPERTIES ( "hbase.table.name" = "hbase_app_log_rule" );
CREATE TABLE app_log_queue(id STRING,queue_name STRING,biz_line STRING,app_code STRING) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping" = ":key,cf1:queue_name,cf1:biz_line,cf1:app_code") TBLPROPERTIES ( "hbase.table.name" = "hbase_app_log_queue" ); |
7.5. 啟動Hive JDBC server
到Hive的安裝目錄,啟動Hive服務。
cd /opt/oracle/hive/ bin/hive --service hiveserver & |
8. Hadoop環境啟動順序
8.1. 啟動HDFS
在NameNode的$hadoop安裝目錄下,執行如下命令:
[oracle@hadoop001 hadoop]$ bin/hadoop namenode -format [oracle@hadoop001 hadoop]$ bin/start-all.sh |
可以在各個節點上運行jps命令查看是否啟動成功:
[oracle@hadoop003 ~]$ jps 6160 TaskTracker 6039 DataNode 6879 Jps |
同時可訪問HDFS監控頁面:http://hadoop001:50070/dfshealth.jsp查看各節點狀況。
8.2. 啟動zookeeper
在各zookeeper節點上運行zkServer.sh start。
cd /opt/oracle/zookeeper ./bin/zkServer.sh start tail zookeeper.out |
8.3. 啟動Hbase
通過Hbase的安裝目錄執行bin/start-hbase.sh和bin/stop-hbase.sh 腳本啟動和停止HBase服務。
啟動方法:
[oracle@hadoop003 ~]$ cd /opt/oracle/hbase [oracle@hadoop003 hbase]$ bin/start-hbase.sh |
可以在各個節點上運行jps命令查看是否啟動成功,hadoop003~hadoop007上是否有HRegionServer,hadoop001上是否有HMaster:
同時可訪問HDFS監控頁面:http://hadoop001:60010/ 查看是否所有的datanode和zookeeper都活着。
8.4. 啟動Hive JDBC server
到Hive的安裝目錄,啟動Hive服務。
cd /opt/oracle/hive/ bin/hive --service hiveserver & |
9. Hadoop環境關閉順序
9.1. 關閉Hive JDBC Server
用jps命令找到RunJar進程kill掉
9.2. 關閉Hbase
通過Hbase的安裝目錄執行bin/stop-hbase.sh停止HBase服務,會出現等待的提示符,等待結束才可以執行下一步
9.3. 關閉zookeeper
在各zookeeper節點上運行zkServer.sh stop
cd /opt/oracle/zookeeper ./bin/zkServer.sh stop tail zookeeper.out |
9.4. 關閉HDFS
在NameNode的$hadoop安裝目錄下,執行如下命令:
[oracle@hadoop001 hadoop]$ bin/stop-all.sh |
可以在各個節點上運行jps命令查看是否關閉成功
10. 常見問題
10.1. Namenode非正常關閉
在所有的hadoop環境機器上用jps命令,把所有的進程列出,然后kill掉,再按照啟動順序啟動
10.2. Datanode非正常關閉
l 在namenode上啟動HDFS
運行hadoop/bin/start-all.sh
l 如果Datanode同時是zookeeper,還需要啟動zookeeper
在該datanode上運行zookeeper/bin/zkServer.sh start。
l 在namenode上啟動Hbase
運行hbase/bin/start-hbase.sh
10.3. 停止一台非master的服務器
l 在該台服務器上運行:
hadoop/bin/hadoop-daemon.sh stop datanode
hadoop/bin/hadoop-daemon.sh stop tasktracker
hbase/bin/hbase-daemon.sh stop regionserver
l 在http://hadoop001:50070/dfshealth.jsp 查看該節點是否已經變成dead nodes,變成dead nodes之后,就可以停止該台服務器
在剛停止服務的時候,看到的截圖如下:
當停止服務成功,看到的截圖如下:
l 重啟服務器以后,在hadoop001上運行,啟動服務:
hadoop/bin/start-all.sh
hbase/bin/start-hbase.sh
11. 監控端口
11.1. Namenode監控端口(hadoop001):
60010,60000,50070,50030,9000,9001,10000
11.2. zookeeper監控端口(hadoop003,hadoop004,hadoop005)
2181
11.3. Datanode監控端口(hadoop003,hadoop004,hadoop005,hadoop006,hadoop007)
60030,50075