高可用,完全分布式Hadoop集群HDFS和MapReduce安裝配置指南

jopen 9年前發布 | 56K 次閱讀 Hadoop MapReduce 分布式/云計算/大數據

(WJW)高可用,完全分布式Hadoop集群HDFS和MapReduce安裝配置指南

為了部署HA集群,應該準備以下事情:

  • 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,resourcemanager

    192.168.1.85 hadoop85#namenode2,journalnode1,datanode1,nodemanager1

    192.168.1.86 hadoop86#journalnode2,datanode2,nodemanager2

    192.168.1.87 hadoop87#journalnode3,datanode3,nodemanager3

  • 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安裝成功.

  • ssh

    需要配置各個節點的免密碼登錄!
    首先在自己機器上使用ssh-keygen -t rsa
    會要求輸入密碼(必須為空),回車幾次,然后會在HOME目錄下生成.ssh文件夾,
    里面有私鑰和公鑰,公鑰為id_rsa.pub,(現在你需要將你的公鑰拷貝到服務器上,如果你的系統有ssh-copy-id命令,拷貝會很簡單:$ ssh-copy-id 用戶名@服務器名)
    否則,你需要手動將你的私鑰拷貝的服務器上的~/.ssh/authorized_keys文件中!

  • NTP

    集群的時鐘要保證基本的一致.稍有不一致是可以容忍的,但是很大的不一致會 造成奇怪的行為. 運行 NTP 或者其他什么東西來同步你的時間.
    如果你查詢的時候或者是遇到奇怪的故障,可以檢查一下系統時間是否正確!

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

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

    *               soft    nproc   16384

    • hard nproc 16384
    • soft nofile 65536
    • hard nofile 65536</pre> </blockquote> </li> </ul>
      • 修改 192.168.1.84,192.168.1.85,192.168.1.86,192.168.1.87 的etc/hosts文件
        在文件最后添加:
        ```
        192.168.1.84 hadoop84
        192.168.1.85 hadoop85
        192.168.1.86 hadoop86
        192.168.1.87 hadoop87

      [X] 編譯hadoop

      在hadoop84上操作

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

      cd /opt
      tar zxvf ./hadoop-2.2.0.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-util</artifactId>
      <scope>test</scope>
      </dependency>
      編輯/opt/hadoop-2.2.0-src/hadoop-common-project/hadoop-auth/pom.xml文件,在<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</pre>


    [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</pre>

    <p>
        hadoop-config.sh會被其他所有的腳本來調用,可以把環境變量,JVM參數等都配置在這里!
    </p>
    

    </blockquote>

    [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.replicationHDFS文件的副本數.如果你只有3個datanode,但是你卻指定副本數為4,是不會生效的,因為每個datanode上只能存放一個副本.
    dfs.namenode.name.dirnamenode的數據的存放位置
    dfs.datanode.data.dirnamenode的數據的存放位置
    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:50070 和 http://hadoop85:50070
    如果能夠看到兩個頁面,證明NameNode啟動成功了.這時,兩個NameNode的狀態都是standby.

    [7] 轉換active:

    在hadoop84執行命令:

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

    再使用瀏覽器訪問 http://hadoop84:50070 和 http://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'</pre> 來自:http://my.oschina.net/wstone/blog/365010

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!