搭建分佈式Hadoop的填坑紀錄

1 每一個節點ssh免密鏈接本機

cd ~/.ssh/                     # 若沒有該目錄,請先執行一次ssh localhost
    ssh-keygen -t rsa              # 會有提示,都按回車就能夠
    cat id_rsa.pub >> authorized_keys  # 加入受權
    chmod 600 ./authorized_keys    # 修改文件權限

排錯:java

若是ssh連接服務器是出現:node

Agent admitted failure to sign using the key

解決方式 使用 ssh-add 指令將私鑰 加進來 (根據我的的密匙命名不一樣更改 id_rsa)web

$ ssh-add   ~/.ssh/id_rsa

再經過ssh 主機名 就能夠實現無密碼登陸了。vim

2 每一個節點配置hostname和hosts

$sudo vim /etc/hostname

主節點僅留一行Master,從節點僅留一行Slaver$centos

$sudo vim /etc/hosts

形式是:ip(空格)節點名稱(Master\Slaver1\Slaver2...)。就像
127.0.0.1 localhost localhost4 localhost4.localdomain4
::1 localhost localhost6 localhost6.localdomain6bash

192.168.1.2  Master
    192.168.1.3  Slaver1

3 設置ssh能免密登陸全部Slavers

注意:執行這一步前,要刪除節點中原有的id_rsa和id_rsa.pub,再從新生成密鑰對。服務器

4 刪除操做系統中預裝的jdk

$ rpm -qa | grep java #列出已經安裝的jdk


    $ rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111-2.6.7.2.el7_2.x86_64 #刪除所有,noarch文件能夠不用刪除

若是尚未刪除,則用yum -y remove去刪除他們。app

5 安裝準備好的jdk

5.1 配置環境變量(順便把後續要裝的軟件的路徑也一塊兒搞定了)

vim ~/.bashrcdom

export JAVA_HOME=/home/hadoop/opt/jdk1.8.0_101
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export HADOOP_HOME=/home/hadoop/opt/hadoop
    export HADOOP_INSTALL=$HADOOP_HOME
    export HADOOP_MAPRED_HOME=$HADOOP_HOME
    export HADOOP_COMMON_HOME=$HADOOP_HOME
    export HADOOP_HDFS_HOME=$HADOOP_HOME
    export YARN_HOME=$HADOOP_HOME
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export ZOOKEEPER_HOME=/home/hadoop/opt/zookeeper
    export HBASE_HOME=/home/hadoop/opt/hbase
    export ROCKETMQ_HOME=/home/hadoop/opt/RocketMQ/devenv
    export ROCKETMQ_CLASSPATH=$ROCKETMQ_HOME/lib
    export NAMESRV_ADDR='10.61.2.118:9876;10.61.2.119:9876'
    export MAVEN_HOME=/home/hadoop/opt/maven
    export SCALA_HOME=/home/hadoop/opt/scala
    export SPARK_HOME=/home/hadoop/opt/spark
    export PATH=$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$ROCKETMQ_HOME/bin:$MAVEN_HOME/bin:$SCALA_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH

使變量設置生效ssh

$source ~/.bashrc

5.2 測試

java -version
    $JAVA_HOME/bin/java -version  # 與直接執行 java -version 同樣
    Shell 命令

若是設置正確的話,$JAVA_HOME/bin/java -version 會輸出 java 的版本信息,且和 java -version 的輸出結果同樣。

6 在Master上安裝Hadoop

6.1 環境變量

6.2 配置

修改/hadoop/etc/hadoop/中的配置文件。
注意,Master是隻做爲NameNode仍是即做爲NameNode又做爲DataNode,須要考量。

集羣/分佈式模式須要修改 /home/hadoop/opt/hadoop/etc/hadoop 中的5個配置文件,更多設置項可點擊查看官方說明,這裏僅設置了正常啓動所必須的設置項: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。

1, 文件 slaves,將做爲 DataNode 的主機名寫入該文件,每行一個,默認爲 localhost,因此在僞分佈式配置時,節點即做爲 NameNode 也做爲 DataNode。分佈式配置能夠保留 localhost,也能夠刪掉,讓 Master 節點僅做爲 NameNode 使用。

本教程讓 Master 節點僅做爲 NameNode 使用,所以將文件中原來的 localhost 刪除,只添加一行內容:Slave1。

2, 文件 core-site.xml 改成下面的配置:

<configuration>
            <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://Master:9000</value>
            </property>
            <property>
                    <name>hadoop.tmp.dir</name>
                    <value>file:/home/hadoop/opt/hadoop/tmp</value>
                    <description>Abase for other temporary directories.</description>
            </property>
    </configuration>

3, 文件 hdfs-site.xml,dfs.replication 通常設爲 3,但咱們只有一個 Slave 節點,因此 dfs.replication 的值仍是設爲 1:

<configuration>
            <property>
                    <name>dfs.namenode.secondary.http-address</name>
                    <value>Master:50090</value>
            </property>
            <property>
                    <name>dfs.replication</name>
                    <value>1</value>
            </property>
            <property>
                    <name>dfs.namenode.name.dir</name>
                    <value>file:/home/hadoop/opt/hadoop/tmp/dfs/name</value>
            </property>
            <property>
                    <name>dfs.datanode.data.dir</name>
                    <value>file:/home/hadoop/opt/hadoop/tmp/dfs/data</value>
            </property>
    </configuration>

4, 文件 mapred-site.xml (可能須要先重命名,默認文件名爲 mapred-site.xml.template),而後配置修改以下:

<configuration>
            <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.address</name>
                    <value>Master:10020</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.webapp.address</name>
                    <value>Master:19888</value>
            </property>
    </configuration>

5, 文件 yarn-site.xml:

<configuration>
            <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>Master</value>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>
    </configuration>

6.3 刪除/hadoop/tmp/(若是有的話)和logs/

7 複製Master上的hadoop到全部Slavers的/home/hadoop/opt/

8 在Master上格式化NameNode

$hdfs namenode -format       # 首次運行須要執行初始化,以後不須要

成功的話,會看到 "successfully formatted" 和 "Exitting with status 0" 的提示,若爲 "Exitting with status 1" 則是出錯。

9 關閉全部節點的防火牆

$systemctl stop firewalld.service    # 關閉firewall
    $systemctl disable firewalld.service # 禁止firewall開機啓動

10 在Master上啓動hadoop

10.1 啓動進程

$start-dfs.sh
    $start-yarn.sh
    $mr-jobhistory-daemon.sh start historyserver

10.2 驗證

經過命令 jps 能夠查看各個節點所啓動的進程。正確的話,在 Master 節點上能夠看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 進程。

缺乏任一進程都表示出錯。另外還須要在 Master 節點上經過命令 hdfs dfsadmin -report 查看 DataNode 是否正常啓動,若是 Live datanodes 不爲 0 ,則說明集羣啓動成功。

在 Slave 節點能夠看到 DataNode 和 NodeManager 進程。

10.3 排錯

執行hadoop namenode -format出現了

Cannot create directory /usr/hadoop/tmp/hdfs/name/current

則有可能須要修改tmp的權限。

$chown -R hadoop:hadoop ~/opt/hadoop/tmp

而後重啓hadoop。

$stop-yarn.sh
    $stop-dfs.sh
    $mr-jobhistory-daemon.sh stop historyserver

11 示例程序

運行 Hadoop 程序時,爲了防止覆蓋結果,程序指定的輸出目錄(如 output)不能存在,不然會提示錯誤,所以運行前須要先刪除輸出目錄。在實際開發應用程序時,可考慮在程序中加上以下代碼,能在每次運行時自動刪除輸出目錄,避免繁瑣的命令行操做。

執行分佈式實例過程與僞分佈式模式同樣,首先建立 HDFS 上的用戶目錄:

$hdfs dfs -mkdir -p /user/hadoop
    $hdfs dfs -mkdir input
    $hdfs dfs -put /home/hadoop/opt/hadoop/etc/hadoop/*.xml input

經過查看 DataNode 的狀態(佔用大小有改變),輸入文件確實複製到了 DataNode 中。能夠訪問 Web 界面 http://localhost:50070/ 查看 NameNode 和 Datanode 信息,還能夠在線查看 HDFS 中的文件。

接着就能夠運行 MapReduce 做業了:

$hadoop jar  /home/hadoop/opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

運行時的輸出信息與僞分佈式相似,會顯示 Job 的進度。

可能會有點慢,但若是遲遲沒有進度,好比 5 分鐘都沒看到進度,那不妨重啓 Hadoop 再試試。若重啓還不行,則頗有多是內存不足引發,建議增大虛擬機的內存,或者經過更改 YARN 的內存配置解決。

一樣能夠經過 Web 界面查看任務進度 http://master:8088/cluster,在 Web 界面點擊 "Tracking UI" 這一列的 History 鏈接,能夠看到任務的運行信息。前提是你開啓了YARN。

執行完後輸出結果:

$hdfs dfs -cat output/*

注意:按照上面的一系列操做,若是不想啓動 YARN,務必把配置文件 mapred-site.xml 重命名,改爲 mapred-site.xml.template,須要用時改回來就行。不然在該配置文件存在,而未開啓 YARN 的狀況下,運行程序會提示 "Retrying connect to server: 0.0.0.0/0.0.0.0:8032" 的錯誤,這也是爲什麼該配置文件初始文件名爲 mapred-site.xml.template。

12 Web UI

12+1 參考文獻

相關文章
相關標籤/搜索