高可用,徹底分佈式Hadoop集羣HDFS和MapReduce安裝配置指南

(WJW)高可用,徹底分佈式Hadoop集羣HDFS和MapReduce安裝配置指南

爲了部署HA集羣,應該準備如下事情:java

  • namenode服務器: 運行namenode的服務器應該有相同的硬件配置.
  • journalnode服務器:運行的journalnode進程很是輕量,能夠部署在其餘的服務器上.注意:必須容許至少3個節點.固然能夠運行更多,可是必須是奇數個,如3,5,7,9個等等.當運行N個節點時,系統能夠容忍至少(N-1)/2個節點失敗而不影響正常運行.
    在HA集羣中,standby狀態的namenode能夠完成checkpoint操做,所以不必配置Secondary namenode,CheckpointNode,BackupNode.若是真的配置了,還會報錯.

[X] 安裝環境:

  • 系統版本:CentOS 6.3 x86_64
  • JAVA版本:JDK-1.7.0_25
  • hadoop-2.2.0-src.tar.gz
  • 服務器列表:

192.168.1.84 hadoop84 #namenode1,resourcemanagernode

192.168.1.85 hadoop85 #namenode2,journalnode1,datanode1,nodemanager1linux

192.168.1.86 hadoop86 #journalnode2,datanode2,nodemanager2shell

192.168.1.87 hadoop87 #journalnode3,datanode3,nodemanager3apache

  • JDK

建議安裝Sun的JDK1.7版本! 安裝完畢並配置java環境變量,在/etc/profile末尾添加以下代碼:
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
保存退出便可,而後執行source /etc/profile生效.在命令行執行java -version 以下表明JAVA安裝成功.bootstrap

  • ssh

須要配置各個節點的免密碼登陸!
首先在本身機器上使用ssh-keygen -t rsa
會要求輸入密碼(必須爲空),回車幾回,而後會在HOME目錄下生成.ssh文件夾,
裏面有私鑰和公鑰,公鑰爲id_rsa.pub,(如今你須要將你的公鑰拷貝到服務器上,若是你的系統有ssh-copy-id命令,拷貝會很簡單:$ ssh-copy-id 用戶名@服務器名)
不然,你須要手動將你的私鑰拷貝的服務器上的~/.ssh/authorized_keys文件中!瀏覽器

  • NTP

集羣的時鐘要保證基本的一致.稍有不一致是能夠容忍的,可是很大的不一致會 形成奇怪的行爲. 運行 NTP 或者其餘什麼東西來同步你的時間.
若是你查詢的時候或者是遇到奇怪的故障,能夠檢查一下系統時間是否正確!bash

echo "server 192.168.0.2" >> /etc/ntp.conf  
chkconfig ntpd on  
service ntpd restart  
ntpq -p
  • ulimit和nproc

Hdaoop會在同一時間使用不少的文件句柄.大多數linux系統使用的默認值1024是不能知足的,修改/etc/security/limits.conf文件爲:服務器

*               soft    nproc   16384
      *               hard    nproc   16384  
      *               soft    nofile  65536  
      *               hard    nofile  65536

  • 修改 192.168.1.84,192.168.1.85,192.168.1.86,192.168.1.87etc/hosts文件 在文件最後添加:
192.168.1.84 hadoop84
192.168.1.85 hadoop85
192.168.1.86 hadoop86
192.168.1.87 hadoop87

[X] 編譯hadoop

在hadoop84上操做ssh

[1] 拷貝hadoop-2.2.0-src.tar.gz到hadoop84的/opt目錄下,而後執行:

cd /opt
tar zxvf ./hadoop-2.2.0-src.tar.gz

[2] YUM安裝依賴庫:

yum install autoconfautomake libtool cmake zlib-devel
yum install ncurses-devel
yum install openssl-devel
yum install gcc*

[3] 下載並安裝配置:protobuf

cd /tmp
wget http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
tar -zxvf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure
make
make install 
ldconfig
rm -rf /tmp/protobuf-2.5.0/

[4] 下載並配置:findbugs

http://sourceforge.net/projects/findbugs/files/findbugs/2.0.2/findbugs-2.0.2.tar.gz/download
解壓:tar -zxvf ./findbugs-2.0.2.tar.gz
配置環境變量FINDBUGS_HOME: export FINDBUGS_HOME=/path to your extract directory  #例如: export FINDBUGS_HOME=/opt/findbugs-2.0.2

[5] 構建二進制版Hadoop

編輯`/opt/hadoop-2.2.0-src/hadoop-common-project/hadoop-auth/pom.xml`文件,
在
    <dependency>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>jetty</artifactId>
      <scope>test</scope>
    </dependency>
後面,添加上
    <dependency>
       <groupId>org.mortbay.jetty</groupId>
      <artifactId>jetty-util</artifactId>
      <scope>test</scope>
    </dependency>
在<artifactId>maven-site-plugin</artifactId>
後面,添加一行:<version>3.3</version>

編輯`/opt/hadoop-2.2.0-src/pom.xml`文件,把<artifactId>maven-site-plugin</artifactId>後面的:<version>3.0</version>改爲:<version>3.3</version>

mvn package -Pdist,native,docs -DskipTests -Dtar
生成好的文件是:/opt/hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0.tar.gz

注意: 不要使用最新的Maven3.1.x和Maven3.2.x,與Maven3.0.x存在兼容性問題,因此總是出現java.lang.NoClassDefFoundError: org/sonatype/aether/graph/DependencyFilter之類的錯誤.


[X] 安裝Hadoop

[1] 解壓

cp /opt/hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.2.0.tar.gz /opt
cd /opt
tar -zxvf ./hadoop-2.2.0.tar.gz
mv hadoop-2.2.0  /opt/hadoop

注意: 先在namenode服務器上都安裝hadoop版本便可,datanode先不用安裝,待會修改完配置後統一安裝datanode!

[2] 配置環境變量

修改/opt/hadoop/libexec/hadoop-config.sh,在最前面添加:

#->@wjw_add
export JAVA_HOME=/usr/java/default
export HADOOP_HOME=/opt/hadoop
export PATH=${PATH}:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
export JAVA_LIBRARY_PATH=${HADOOP_HOME}/lib/native
export HADOOP_LOG_DIR=/opt/hadoop_data/logs
export YARN_LOG_DIR=${HADOOP_LOG_DIR}
#<-@wjw_add

hadoop-config.sh會被其餘全部的腳原本調用,能夠把環境變量,JVM參數等都配置在這裏!

[X] 配置Hadoop

先在hdaoop84上配置,咱們須要修改以下幾個地方:

[1] 修改/opt/hadoop/etc/hadoop/core-site.xml,內容爲以下:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://hadoop84:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/hadoop_data/tmp</value>
  </property>
</configuration>

fs.default.name 由於咱們會啓動2個namenode,每一個namenode的位置不同,那麼切換後,用戶也要修改代碼,很麻煩,
所以fs.default.name使用一個邏輯路徑,用戶就能夠沒必要擔憂namenode切換帶來的路徑不一致問題了.
hadoop.tmp.dir 是hadoop文件系統依賴的基礎配置,不少路徑都依賴它.若是hdfs-site.xml中不配 置namenode和datanode的存放位置,默認就放在這個路徑中.

[2] 修改/opt/hadoop/etc/hadoop/hdfs-site.xml,內容以下:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/opt/hadoop_data/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/opt/hadoop_data/datanode</value>
  </property>  
  <property>
    <name>dfs.nameservices</name>
    <value>cluster1</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.cluster1</name>
    <value>hadoop84,hadoop85</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.cluster1.hadoop84</name>
    <value>hadoop84:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.cluster1.hadoop85</name>
    <value>hadoop85:9000</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.cluster1.hadoop84</name>
    <value>hadoop84:50070</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.cluster1.hadoop85</name>
    <value>hadoop85:50070</value>
  </property>
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop85:8485;hadoop86:8485;hadoop87:8485/cluster1</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.cluster1</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/hadoop_data/journal</value>
  </property>
</configuration>

dfs.replication HDFS文件的副本數.若是你只有3個datanode,可是你卻指定副本數爲4,是不會生效的,由於每一個datanode上只能存放一個副本.
dfs.namenode.name.dir namenode的數據的存放位置
dfs.datanode.data.dir namenode的數據的存放位置
dfs.nameservices 命名空間的邏輯名稱.若是使用HDFS Federation,能夠配置多個命名空間的名稱,使用逗號分開便可.
dfs.ha.namenodes.[nameservice ID] 命名空間中全部namenode的惟一標示名稱.能夠配置多個,使用逗號分隔.該名稱是可讓datanode知道每一個集羣的全部namenode.當前,每一個集羣最多隻能配置兩個namenode.
dfs.namenode.rpc-address.[nameservice ID].[namenode ID] 每一個namenode監聽的RPC地址
dfs.namenode.http-address.[nameservice ID].[namenode ID] 每一個namenode監聽的http地址
dfs.namenode.shared.edits.dir 這是namenode讀寫JNS組的uri.經過這個uri,namenodes能夠讀寫edit log內容.URI的格式"qjournal://host1:port1;host2:port2;host3:port3/journalId".
這裏的host1,host2,host3指的是Journal Node的地址,這裏必須是奇數個,至少3個;其中journalId是集羣的惟一標識符,對於多個聯邦命名空間,也使用同一個journalId.
dfs.client.failover.proxy.provider.[nameservice ID] 這裏配置HDFS客戶端鏈接到Active namenode的一個java類.
dfs.ha.fencing.methods 配置active namenode出錯時的處理類.當active namenode出錯時,通常須要關閉該進程.處理方式能夠是ssh也能夠是shell.推薦使用ssh!
fs.journalnode.edits.dir 這是journalnode進程保持邏輯狀態的路徑.這是在linux服務器文件的絕對路徑.

[3] 修改/opt/hadoop/etc/hadoop/yarn-site.xml,內容以下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop84</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>

yarn.resourcemanager.hostname 指的是運行ResourceManager機器所在的節點.
yarn.nodemanager.aux-services 在hadoop2.2.0版本中是mapreduce_shuffle,必定要看清楚.

[4] 修改/opt/hadoop/etc/hadoop/mapred-site.xml.template,內容以下:

先執行:cp /opt/hadoop/etc/hadoop/mapred-site.xml.template /opt/hadoop/etc/hadoop/mapred-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

mapreduce.framework.name 指的是使用yarn運行mapreduce程序.

[5] 修改/opt/hadoop/etc/hadoop/slaves,內容以下:

hadoop85
hadoop86
hadoop87

表示以上三個節點做爲datanode和nodemanager節點.

[6] 把配置好的hadoop複製到其餘節點:

執行以下操做便可

ssh hadoop84
ssh hadoop85
ssh hadoop86
ssh hadoop87
scp -r /opt/hadoop/ root@hadoop85:/opt/
scp -r /opt/hadoop/ root@hadoop86:/opt/
scp -r /opt/hadoop/ root@hadoop87:/opt/

自此整個集羣基本搭建完畢,接下來就是啓動hadoop集羣了.

[X] 執行命令啓動HDFS和MapReduce集羣:

如下命令嚴格注意執行順序,不能顛倒!

[1] 建立目錄:

在hadoop84執行命令:

ssh hadoop84 'mkdir -p /opt/hadoop_data/tmp /opt/hadoop_data/namenode /opt/hadoop_data/datanode /opt/hadoop_data/journal'
ssh hadoop85 'mkdir -p /opt/hadoop_data/tmp /opt/hadoop_data/namenode /opt/hadoop_data/datanode /opt/hadoop_data/journal'
ssh hadoop86 'mkdir -p /opt/hadoop_data/tmp /opt/hadoop_data/namenode /opt/hadoop_data/datanode /opt/hadoop_data/journal'
ssh hadoop87 'mkdir -p /opt/hadoop_data/tmp /opt/hadoop_data/namenode /opt/hadoop_data/datanode /opt/hadoop_data/journal'

[2] 啓動JournalNode集羣:

在hadoop84執行命令:

ssh hadoop85 '/opt/hadoop/sbin/hadoop-daemon.sh start journalnode'
ssh hadoop86 '/opt/hadoop/sbin/hadoop-daemon.sh start journalnode'
ssh hadoop87 '/opt/hadoop/sbin/hadoop-daemon.sh start journalnode'

[3] 格式化第1個NameNode:

在hadoop84執行命令:

ssh hadoop84 '/opt/hadoop/bin/hdfs namenode -format -clusterId cluster1'

[4] 啓動第1個NameNode:

在hadoop84執行命令:

ssh hadoop84 '/opt/hadoop/sbin/hadoop-daemon.sh start namenode'

[5] 格式化第2個NameNode:

在hadoop84執行命令:

ssh hadoop85 '/opt/hadoop/bin/hdfs namenode -bootstrapStandby'

[6] 啓動第2個NameNode:

在hadoop84執行命令:

ssh hadoop85 '/opt/hadoop/sbin/hadoop-daemon.sh start namenode'

這時候,使用瀏覽器訪問 http://hadoop84:50070http://hadoop85:50070
若是可以看到兩個頁面,證實NameNode啓動成功了.這時,兩個NameNode的狀態都是standby.

[7] 轉換active:

在hadoop84執行命令:

ssh hadoop84 '/opt/hadoop/bin/hdfs haadmin -failover --forceactive hadoop85 hadoop84'

再使用瀏覽器訪問 http://hadoop84:50070http://hadoop85:50070
會發現hadoop84節點變爲active,hadoop85仍是standby.

[8] 啓動DataNodes:

在hadoop84執行命令:

ssh hadoop84 '/opt/hadoop/sbin/hadoop-daemons.sh start datanode'

會啓動3個DataNode節點.
這時候HA集羣就啓動了.

備註:

你若是想實驗一下NameNode切換,執行命令hdfs haadmin -failover --forceactive hadoop84 hadoop85 這時候觀察hadoop84和hadoop85的狀態,就會發現,已經改變了.
若是向上傳數據,還須要修改core-site.xml中的fs.default.name的值,改成hdfs://hadoop85:9000 才行.

[9] 啓動MapReduce:

在hadoop84執行命令

ssh hadoop84 '/opt/hadoop/sbin/start-yarn.sh'

用瀏覽器訪問 http://hbase84:8088


[X] 附錄:

[X] HA的問題:

你們都知道在hadoop2中對HDFS的改進很大,實現了NameNode的HA;
也增長了ResourceManager.可是ResourceManager也能夠實現HA.
你沒看錯,確實是ResourceManager的HA.注意是在Apache Hadoop 2.4.1版本中開始加入的,可不是任意一個版本.

[X] hadoop2的HA配置一鍵運行腳本startall.sh

#!/bin/sh

#synchronize all config files
ssh hadoop84 'scp /opt/hadoop/etc/hadoop/*  hadoop85:/opt/hadoop/etc/hadoop'
ssh hadoop84 'scp /opt/hadoop/etc/hadoop/*  hadoop86:/opt/hadoop/etc/hadoop'
ssh hadoop84 'scp /opt/hadoop/etc/hadoop/*  hadoop87:/opt/hadoop/etc/hadoop'
ssh hadoop84 'scp /opt/hadoop/libexec/*  hadoop85:/opt/hadoop/libexec'
ssh hadoop84 'scp /opt/hadoop/libexec/*  hadoop86:/opt/hadoop/libexec'
ssh hadoop84 'scp /opt/hadoop/libexec/*  hadoop87:/opt/hadoop/libexec'

#stop all daemons
ssh hadoop84 '/opt/hadoop/sbin/stop-all.sh'

#remove all files
ssh hadoop84 'rm -rf /opt/hadoop_data/'
ssh hadoop85 'rm -rf /opt/hadoop_data/'
ssh hadoop86 'rm -rf /opt/hadoop_data/'
ssh hadoop87 'rm -rf /opt/hadoop_data/'

ssh hadoop84 'mkdir -p /opt/hadoop_data/tmp /opt/hadoop_data/namenode /opt/hadoop_data/datanode /opt/hadoop_data/journal'
ssh hadoop85 'mkdir -p /opt/hadoop_data/tmp /opt/hadoop_data/namenode /opt/hadoop_data/datanode /opt/hadoop_data/journal'
ssh hadoop86 'mkdir -p /opt/hadoop_data/tmp /opt/hadoop_data/namenode /opt/hadoop_data/datanode /opt/hadoop_data/journal'
ssh hadoop87 'mkdir -p /opt/hadoop_data/tmp /opt/hadoop_data/namenode /opt/hadoop_data/datanode /opt/hadoop_data/journal'

#start journalnodes cluster
ssh hadoop85 '/opt/hadoop/sbin/hadoop-daemon.sh start journalnode'
ssh hadoop86 '/opt/hadoop/sbin/hadoop-daemon.sh start journalnode'
ssh hadoop87 '/opt/hadoop/sbin/hadoop-daemon.sh start journalnode'

#format one namenode
ssh hadoop84 '/opt/hadoop/bin/hdfs namenode -format -clusterId cluster1'
ssh hadoop84 '/opt/hadoop/sbin/hadoop-daemon.sh start namenode'

#format another namenode
ssh hadoop85 '/opt/hadoop/bin/hdfs namenode -bootstrapStandby'
sleep 10
ssh hadoop85 '/opt/hadoop/sbin/hadoop-daemon.sh start namenode'
sleep 10

#trigger hadoop84 active
ssh hadoop84 '/opt/hadoop/bin/hdfs haadmin -failover --forceactive hadoop85 hadoop84'

#start all datanodes
ssh hadoop84 '/opt/hadoop/sbin/hadoop-daemons.sh start datanode'

#start MapReduce
sleep 10
ssh hadoop84 '/opt/hadoop/sbin/start-yarn.sh'
相關文章
相關標籤/搜索