1、說明 java
1. 本文檔以四臺機器爲例搭建hadoop集羣,各臺機器的職責以下: node
此集羣主要包括Namenode HA和RresourceManager HA,這是本文重點所在。 web
|
hadoop1 apache |
hadoop2 bootstrap |
hadoop3 瀏覽器 |
hadoop4 app |
NameNode dom |
Y ssh |
Y webapp |
N |
N |
DataNode |
N |
N |
Y |
Y |
JournalNode |
Y |
Y |
Y |
N |
Zookeeper |
Y |
Y |
Y |
N |
zkfc |
Y |
Y |
N |
N |
ResourceManager |
Y |
Y |
N |
N |
NodeManager |
N |
N |
Y |
Y |
HistoryServer |
N |
Y |
N |
N |
2. 系統準備
Linux版本Cent OS 6.5
因爲系統默認單個進程打開的句柄數太低,因此首先要修改如下參數
/etc/security/limits.conf
hadoop soft nofile 131072
hadoop hard nofile 131072
/etc/security/limits.d/90-nproc.conf
hadoop soft nproc unlimited
root soft nproc unlimited
hadoop hard nproc unlimited
注:
soft nproc: 可打開的文件描述符的最大數(軟限制)
hard nproc: 可打開的文件描述符的最大數(硬限制)
soft nofile:單個用戶可用的最大進程數量(軟限制)
hard nofile:單個用戶可用的最大進程數量(硬限制)
3. hadoop及zookeeper版本
hadoop版本:hadoop-2.3.0-cdh5.0.0.tar.gz
zookeeper版本:zookeeper-3.4.5-cdh5.0.0.tar.gz
4. 要提早配好ssh的無密碼鏈接(用hadoop用戶),在/etc/hosts中作好整個集羣的hostname和ip的映射,以及安裝JDK7,本文檔再也不詳述。
cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
132.35.227.72 DSSBACKUP06 hadoop1
132.35.227.74 JCYW-BACKUP02 hadoop2
132.35.224.248 dssbackup2 hadoop3
132.35.224.249 dssbackup1 hadoop4
2、部署步驟
1. Zookeeper的配置
1.1 新建目錄 /opt/beh-2.0.0, 之後整個hadoop生態的其餘組件都將安裝到此目錄下。
mkdir -p /opt/ beh-2.0.0
新建名字爲hadoop的用戶
useradd hadoop
將/opt/beh-2.0.0賦予hadoop用戶
chown -R hadoop:hadoop /opt/beh-2.0.0
1.2 將zookeeper-3.4.5-cdh5.0.0.tar.gz解壓縮到/opt/beh-2.0.0下,並重命名爲zookeeper。
1.3 修改zookeeper配置文件
/opt/beh-2.0.0/zookeeper/conf/zoo_sample.cfg 重名爲zoo.cfg
進入到conf目錄下,執行:
mv zoo_sample.cfg zoo.cfg
修改zoo.cfg
1.4 將整個zookeeper目錄分別複製hadoop1,hadoop2,hadoop3上。分別在hadoop1,hadoop2,hadoop3建立dataDir屬性指定的目錄,並在此目錄下建立myid文件。
cd /opt/beh-2.0.0/zookeeper/dataDir
vi myid
hadoop1上的myid裏面寫入值1
hadoop2上的myid裏面寫入值2
hadoop3上的myid裏面寫入值3
1.5 修改環境變量
vi /etc/profile
添加
$ZOOKEEPER_HOME=/opt/beh-2.0.0/zookeeper
PATH=$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile
1.6 在hadoop1,hadoop2,hadoop3上執行
chown -R hadoop /opt/beh-2.0.0/zookeeper
1.7 驗證是否成功
分別在hadoop1,hadoop2,hadoop3上執行zkServer.sh start
用jps命令查看進程QuorumPeerMain是否啓動
2. Namenode HA的配置
2.1 將hadoop-2.3.0-cdh5.0.0.tar.gz解壓到/opt/beh-2.0.0/下,並重命名爲hadoop,
tar -zxvf hadoop-2.3.0-cdh5.0.0.tar.gz ./
mv hadoop-2.3.0-cdh5.0.0 hadoop
修改etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://beh</value>
</property>
【beh是個邏輯名稱,能夠隨意制定,它來自於hdfs-site.xml中的配置】
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/beh-2.0.0/hadoop/tmp</value>
</property>
【這裏的路徑默認是NameNode、DataNode、JournalNode等存放數據的公共目錄。用戶也能夠本身單獨指定這三類節點的目錄。】
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
【這裏是ZooKeeper集羣的地址和端口。注意,數量必定是奇數,且很多於三個節點】
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
緩衝區大小:io.file.buffer.size默認是4KB,做爲hadoop緩衝區,用於hadoop讀hdfs的文件和寫hdfs的文件,還有map的輸出都用到了這個緩衝區容量,對於如今的硬件很保守,能夠設置爲128k(131072),甚至是1M(太大了map和reduce任務可能會內存溢出)。
2.2 修改hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>beh</value>
</property>
【這是此hdfs集羣的邏輯名稱】
<property>
<name>dfs.ha.namenodes.beh</name>
<value>nn1,nn2</value>
</property>
【這是兩個namenode的邏輯名稱,隨意起名,相互不重複便可】
<property>
<name>dfs.namenode.rpc-address.beh.nn1</name>
<value>hadoop1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.beh.nn1</name>
<value>hadoop1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.beh.nn2</name>
<value>hadoop2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.beh.nn2</name>
<value>hadoop2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/beh</value>
</property>
dfs.namenode.shared.edits.dir共享存儲目錄的位置
這是配置備份節點須要隨時保持同步活動節點所做更改的遠程共享目錄,你只能配置一個目錄,這個目錄掛載到兩個namenode上都必須是可讀寫的,且必須是絕對路徑。
<property>
<name>dfs.ha.automatic-failover.enabled.beh</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.beh</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/beh-2.0.0/hadoop/journal</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/hadoop_data/datafile/data</value>
</property>
<property>
<name>dfs.block.size</name>
<value> 134217728</value>
</property>
【block大小可根據實際狀況進行設置,此處爲128M】
<property>
<name>dfs.datanode.handler.count</name>
<value>3</value>
</property>
dfs.datanode.handler.count
datanode上用於處理RPC的線程數。默認爲3,較大集羣,可適當調大些,好比8。須要注意的是,每添加一個線程,須要的內存增長。
<property>
<name>dfs.namenode.handler.count</name>
<value>20</value>
</property>
<property>
<name>dfs.datanode.max.xcievers</name>
<value>131072</value>
</property>
<property>
<name>dfs.datanode.socket.write.timeout</name>
<value>0</value>
</property>
<property>
<name>dfs.socket.timeout</name>
<value>180000</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
2.3 編輯 /etc/hadoop/slaves
添加 hadoop3
hadoop4
2.4 編輯/etc/profile
添加 HADOOP_HOME=/opt/beh-2.0.0/hadoop
PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
將以上配置複製到全部節點
參考語句:
scp -r /opt/beh-2.0.0/hadoop/ hadoop@132.35.227.74:/opt/beh-2.0.0/
scp -r /opt/beh-2.0.0/hadoop/ hadoop@132.35.224.248:/opt/beh-2.0.0/
scp -r /opt/beh-2.0.0/hadoop/ hadoop@132.35.224.249:/opt/beh-2.0.0/
2.5 啓動各項服務
2.5.1 啓動journalnode
在hadoop1、hadoop2、hadoop3上執行hadoop-daemon.sh start journalnode
2.5.2 格式化zookeeper
在hadoop1上執行hdfs zkfc -formatZK
2.5.3 對hadoop1節點進行格式化和啓動
hdfs namenode -format
hadoop-daemon.sh start namenode
2.5.4 對hadoop2節點進行格式化和啓動
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
2.5.5 在hadoop1和hadoop2上啓動zkfc服務
hadoop-daemon.sh start zkfc
此時hadoop1和hadoop2就會有一個節點變爲active狀態。
2.5.6 啓動datanode
在hadoop1上執行命令hadoop-daemons.sh start datanode
2.5.7 驗證是否成功
打開瀏覽器,訪問 hadoop1:50070 以及 hadoop2:50070,你將會看到兩個namenode一個是active而另外一個是standby。
(參考網址http://132.35.227.72:50070)
而後kill掉其中active的namenode進程,另外一個standby的naemnode將會自動轉換爲active狀態。
kill -9 19856
測試過,上面的步驟徹底正確。
3. ResourceManager HA的配置
3.1 修改mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- configure historyserver -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop2:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop2:19888</value>
</property>
<!-- configure staging directory -->
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/user</value>
</property>
<!--optimize-->
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx2g</value>
</property>
<property>
<name>io.sort.mb</name>
<value>512</value>
</property>
<property>
<name>io.sort.factor</name>
<value>20</value>
</property>
<property>
<name>mapred.job.reuse.jvm.num.tasks</name>
<value>-1</value>
</property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>20</value>
</property>
</configuration>
3.2 修改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.nodemanager.local-dirs</name>
<value>/opt/beh-2.0.0/hadoop/nmdir</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/opt/beh-2.0.0/hadoop/logs</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<description>Where to aggregate logs</description>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>hdfs://beh/var/log/hadoop-yarn/apps</value>
</property>
<!-- Resource Manager Configs -->
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>beh</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.zk.state-store.address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<property>
<name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
<value>5000</value>
</property>
<!-- RM1 configs -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop1:23140</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop1:23130</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.https.address.rm1</name>
<value>hadoop1:23189</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop1:23188</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop1:23125</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>hadoop1:23141</value>
</property>
<!-- RM2 configs -->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop2:23140</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop2:23130</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.https.address.rm2</name>
<value>hadoop2:23189</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop2:23188</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop2:23125</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>hadoop2:23141</value>
</property>
<!-- Node Manager Configs -->
<property>
<description>Address where the localizer IPC is.</description>
<name>yarn.nodemanager.localizer.address</name>
<value>0.0.0.0:23344</value>
</property>
<property>
<description>NM Webapp address.</description>
<name>yarn.nodemanager.webapp.address</name>
<value>0.0.0.0:23999</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/opt/beh-2.0.0/hadoop/nodemanager/yarn/local</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/opt/beh-2.0.0/hadoop/nodemanager/yarn/log</value>
</property>
<property>
<name>mapreduce.shuffle.port</name>
<value>23080</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
3.3 將配置文件分發至各節點。
參考語句:
scp -r /opt/beh-2.0.0/hadoop/etc/hadoop/mapred-site.xml hadoop@132.35.227.74:/opt/beh-2.0.0/hadoop/etc/hadoop/
scp -r /opt/beh-2.0.0/hadoop/etc/hadoop/mapred-site.xml hadoop@132.35.224.248:/opt/beh-2.0.0/hadoop/etc/hadoop/
scp -r /opt/beh-2.0.0/hadoop/etc/hadoop/mapred-site.xml hadoop@132.35.224.249:/opt/beh-2.0.0/hadoop/etc/hadoop/
scp -r /opt/beh-2.0.0/hadoop/etc/hadoop/yarn-site.xml hadoop@132.35.227.74:/opt/beh-2.0.0/hadoop/etc/hadoop/
scp -r /opt/beh-2.0.0/hadoop/etc/hadoop/yarn-site.xml hadoop@132.35.224.248:/opt/beh-2.0.0/hadoop/etc/hadoop/
scp -r /opt/beh-2.0.0/hadoop/etc/hadoop/yarn-site.xml hadoop@132.35.224.249:/opt/beh-2.0.0/hadoop/etc/hadoop/
3.4 修改hadoop2上的yarn-site.xml
修改成下面的值:
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm2</value>
</property>
3.5 建立目錄並賦予權限
3.5.1在全部的nodemanager上建立本地目錄(hadoop3,hadoop4)
mkdir -p /opt/beh-2.0.0/hadoop/nmdir
mkdir -p /opt/beh-2.0.0/hadoop/logs
chown -R hadoop:hadoop /opt/beh-2.0.0/hadoop/nmdir
chown -R hadoop:hadoop /opt/beh-2.0.0/hadoop/logs
3.5.2 啓動hdfs後,執行下列命令
hadoop fs -mkdir -p /user/history
hadoop fs -chmod -R 777 /user/history
hadoop fs -chown hadoop:hadoop /user/history
建立log目錄
hadoop fs -mkdir -p /var/log/hadoop-yarn
hadoop fs -chown hadoop:hadoop /var/log/hadoop-yarn
建立hdfs下的/tmp
若是不建立/tmp按照指定的權限,那麼CDH的其餘組件將會有問題。尤爲是,若是不建立的話,其餘進程會以嚴格的權限自動建立這個目錄,這樣就會影響到其餘程序適用。
hadoop fs -mkdir /tmp
hadoop fs -chmod -R 777 /tmp
3.6 啓動yarn 和 jobhistory server
3.6.1 在hadoop1上啓動:
sbin/start-yarn.sh
此腳本將會啓動hadoop1上的resourcemanager及全部的nodemanager。
3.6.2 在hadoop2上啓動resourcemanager:
yarn-daemon.sh start resourcemanager
3.6.3 在hadoop2上啓動jobhistory server
sbin/mr-jobhistory-daemon.sh start historyserver
3.7 驗證是否配置成功。
打開瀏覽器,訪問hadoop1:23188或者hadoop2:23188,應該能看到相似以下界面。只有active的會打開以下界面,standby的那個不會看到頁面。
而後kill掉active的resourcemanager另外一個將會變爲active的,說明resourcemanager HA是成功的。
4. 關於從新格式化namenode
若是要從新格式化namenode,那麼首先要停掉全部相關的服務
1)刪掉$HADOOP_HOME/tmp 下的以前的格式化的信息
2)刪掉datanode上$HADOOP_HOME/current文件夾,若是有的話。
3)在hdfs-site.xml找着dfs.data.dir屬性,此屬性的value中配置的目錄都要清空,這是datanode存放數據的地方。
4)執行格式化