Centos7 安裝Hadoop3.x 完全分佈式部署

1. 最小化安裝CentOS 7 系統

1.1 安裝net-tools啓用 ifconfig

  yum install net-tools vim

1.2 更新系統

    yum update

1.3 配置系統IP爲固定IP

1.3.1 查看網卡(文件 ifcfg-enp* 爲網卡文件)

ls /etc/sysconfig/network-scripts/

1.3.2 配置網卡(virtualBox 分配 host-only網卡,並使用固定IP)

vi /etc/sysconfig/network-scripts/ifcfg-enp*
# 啓用host-only網卡
cd /etc/sysconfig/network-scripts/
cp ifcfg-enp0s3  ifcfg-enp0s8

修改網卡爲靜態IP
1. 修改BOOTPROTO爲static
2. 修改NAME爲enp0s8
3. 修改UUID(可以隨意改動一個值,只要不和原先的一樣)
4. 添加IPADDR,可以自己制定,用於主機連接虛擬機使用。
5. 添加NETMASK=255.255.255.0 (網管 也可以和網段一樣 x.x.x.255)
image

1.3.3 重啓網卡

service network restart

1.3.4 修改主機名稱(可以在安裝時候指定)

vim /etc/hostname

1.4 配置Host,可以使用名稱直接訪問

vim /etc/hosts
# 複製到其他機器
scp /etc/hosts  root@192.168.56.12:/etc/hosts

增加內容
image

1.5 配置免密碼登錄,生成各種密碼文件

    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    chmod 0600 ~/.ssh/authorized_keys
    # 拷貝公鑰到遠程服務器
    cat ~/.ssh/id_rsa.pub | ssh root@192.168.56.101  "cat - >> ~/.ssh/authorized_keys"

    # 如果需要互相免密碼登錄,則執行下面命令
    scp .ssh/authorized_keys  root@192.168.56.14:~/.ssh/authorized_keys

2. 安裝JDK

2.1 下載JDK 下載

2.2 將下載的JDK放到 opt目錄下解壓

    cd /opt/
    tar -xzvf server-jre-8u161-linux-x64.tar.gz
    # 創建快捷方式
    ln -sf jdk1.8.0_161/ jdk

2.2 將JDK添加到環境變量中

    vim /etc/profile
    # 添加如下內容
    export JAVA_HOME=/opt/jdk
    export PATH=.:$PATH:$JAVA_HOME/bin
    # 使修改生效
    source /etc/profile

2.3 驗證JDK是否安裝成功

    java -version

image

3. 安裝Hadoop

3.1 下載Hadoop,下載地址

3.2 將下載的Hadoop放入/opt目錄

    # 1. 解壓Hadoop
    tar -xzvf hadoop-3.0.0.tar.gz 
    # 2. 創建超連接
    ln -sf hadoop-3.0.0 hadoop

3.3 安裝Zookeeper

3.3.1 下載Zookeeper 下載地址

3.3.2 拷貝zookeeper到需要的機器上

    scp /opt/zookeeper-3.4.11.tar.gz node2:/opt/

3.3.3 解壓zookeeper

    tar -xzvf zookeeper-3.4.11.tar.gz

3.3.4 創建連接文件

    ln -sf zookeeper-3.4.11 zookeeper

3.3.5 配置環境變量

    vim /etc/profilve
        # 添加如下內容
        export ZOOKEEPER_HOME = /opt/zookeeper
        export PATH = $PATH:$ZOOKEEPER_HOME/bin

3.3.6 配置zookeeper集羣,修改配置文件

    cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
        # 5.1 在zoo.cfg 文件末尾追加(zoo1 爲 服務器名稱)
        # 具體配置見:http://zookeeper.apache.org/doc/r3.4.11/zookeeperStarted.html#sc_RunningReplicatedZooKeeper
        tickTime=2000
        dataDir=/opt/data/zookeeper # 數據存放路徑
        clientPort=2181
        initLimit=5
        syncLimit=2
        server.1=node2:2888:3888
        server.2=node3:2888:3888
        server.3=node4:2888:3888

3.3.7 將配置文件複製到其他節點

    scp /opt/zookeeper/conf/zoo.cfg node2:/opt/zookeeper/conf/

3.3.8 創建節點ID,在配置的 dataDir 路徑中添加myid文件

    echo "1" > myid

3.3.9 啓動 zookeeper(已經添加到環境變量了)

    zkServer.sh start

3.3.10 檢驗是否啓動成功

    jps

如果看到 如下圖進程,表示啓動成功

image

3.3.11 (可選) zookeeper Centos7 配置開機自啓動

  1. 在/etc/systemd/system/文件夾下創建一個啓動腳本zookeeper.service
    內容如下:
[Unit]
Description=zookeeper
After=syslog.target network.target

[Service]
Type=forking
# 指定zookeeper 日誌文件路徑,也可以在zkServer.sh 中定義
Environment=ZOO_LOG_DIR=/opt/data/zookeeper/logs
# 指定JDK路徑,也可以在zkServer.sh 中定義
Environment=JAVA_HOME=/opt/jdk
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target
  1. 重新加載服務
systemctl daemon-reload
  1. 啓動zookeeper
systemctl start zookeeper
  1. 開機自啓動
systemctl enable zookeeper
  1. 查看zookeeper狀態
systemctl status zookeeper

問題:

nohup: 無法運行命令”java”: 沒有那個文件或目錄 \
nohup: failed to run command `java’: No such file or directory

解決方法: \
主要是找不到Java造成的,配置下環境變量即可,可以在zkServer.sh 中添加如下:

    JAVA_HOME=/opt/jdk

或者在zookeeper.service中指定:

    Environment=JAVA_HOME=/opt/jdk

3.4 修改Hadoop配置(完全分佈式)

參考文檔:
1. (Hadoop HDFS分佈式配置)http://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
2. (Hadoop Yarn 分佈式配置) http://hadoop.apache.org/docs/r3.0.0/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

3.4.1 配置Hadoop 環境變量

    # 添加hadoop環境變量
    export HADOOP_HOME = /opt/hadoop
    export PATH = $PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
    # 啓用環境變量
    source /etc/profile

3.4.2 HADOOP 節點分佈如下:

節點 NN DN ZK ZKFC JN RM NM
Node1 1 1 1
Node2 1 1 1 1 1 1 1
Node3 1 1 1 1
Node4 1 1 1 1

上面已經配置好了zookeeper,這裏就不需要在配置了

3.4.3 修改Hadoop環境配置文件 hadoop-env.sh

    # 設置Java環境變量
    exprot JAVA_HOME = /opt/jdk
    export HADOOP_HOME = /opt/hadoop

3.4.4 參考 官方文檔 配置高可用HDFS

  1. 配置 hdfs-site.xml 文件如下:
<configuration>
    <property>
        <!--這裏配置邏輯名稱,可以隨意寫 -->
        <name>dfs.nameservices</name>
        <value>hbzx</value>
    </property>
    <property>
        <!-- 禁用權限 -->
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
    <property>
        <!-- 配置namenode 的名稱,多個用逗號分割  -->
        <name>dfs.ha.namenodes.hbzx</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <!-- dfs.namenode.rpc-address.[nameservice ID].[name node ID] namenode 所在服務器名稱和RPC監聽端口號  -->
        <name>dfs.namenode.rpc-address.hbzx.nn1</name>
        <value>node1:9820</value>
    </property>
    <property>
        <!-- dfs.namenode.rpc-address.[nameservice ID].[name node ID] namenode 所在服務器名稱和RPC監聽端口號  -->
        <name>dfs.namenode.rpc-address.hbzx.nn2</name>
        <value>node2:9820</value>
    </property>
    <property>
        <!-- dfs.namenode.http-address.[nameservice ID].[name node ID] namenode 監聽的HTTP協議端口 -->
        <name>dfs.namenode.http-address.hbzx.nn1</name>
        <value>node1:9870</value>
    </property>
    <property>
        <!-- dfs.namenode.http-address.[nameservice ID].[name node ID] namenode 監聽的HTTP協議端口 -->
        <name>dfs.namenode.http-address.hbzx.nn2</name>
        <value>node2:9870</value>
    </property>

    <property>
        <!-- namenode 共享的編輯目錄, journalnode 所在服務器名稱和監聽的端口 -->
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node2:8485;node3:8485;node4:8485/hbzx</value>
    </property>

    <property>
        <!-- namenode高可用代理類 -->
        <name>dfs.client.failover.proxy.provider.hbzx</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <property>
        <!-- 使用ssh 免密碼自動登錄 -->
        <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>
        <!-- journalnode 存儲數據的地方 -->
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/data/journal/node/local/data</value>
    </property>

    <property>
        <!-- 配置namenode自動切換 -->
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

</configuration>
  1. 配置 core-site.xml
<configuration>
    <property>
        <!-- 爲Hadoop 客戶端配置默認的高可用路徑  -->
        <name>fs.defaultFS</name>
        <value>hdfs://hbzx</value>
    </property>
    <property>
        <!-- Hadoop 數據存放的路徑,namenode,datanode 數據存放路徑都依賴本路徑,不要使用 file:/ 開頭,使用絕對路徑即可
            namenode 默認存放路徑 :file://${hadoop.tmp.dir}/dfs/name
            datanode 默認存放路徑 :file://${hadoop.tmp.dir}/dfs/data
        -->
        <name>hadoop.tmp.dir</name>
        <value>/opt/data/hadoop/</value>
    </property>

    <property>
        <!-- 指定zookeeper所在的節點 -->
        <name>ha.zookeeper.quorum</name>
        <value>node2:2181,node3:2181,node4:2181</value>
    </property>

</configuration>
  1. 配置yarn-site.xml 爲單節點默認,多節點參考:官方文檔
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>

    <property>
        <!-- 配置yarn爲高可用 -->
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <property>
        <!-- 集羣的唯一標識 -->
        <name>yarn.resourcemanager.cluster-id</name>
        <value>hbzx</value>
    </property>
    <property>
        <!--  ResourceManager ID -->
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <!-- 指定ResourceManager 所在的節點 -->
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>node1</value>
    </property>
    <property>
        <!-- 指定ResourceManager 所在的節點 -->
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>node2</value>
    </property>
    <property>
        <!-- 指定ResourceManager Http監聽的節點 -->
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>node1:8088</value>
    </property>
    <property>
        <!-- 指定ResourceManager Http監聽的節點 -->
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>node2:8088</value>
    </property>
    <property>
        <!-- 指定zookeeper所在的節點 -->
        <name>yarn.resourcemanager.zk-address</name>
        <value>node2:2181,node3:2181,node4:2181</value>
    </property>

    <property>
        <!-- 啓用節點的內容和CPU自動檢測,最小內存爲1G -->
        <name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
        <value>true</value>
    </property>
</configuration>
  1. 配置mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
  1. 將配置文件複製到其他機器
scp ./* node4:/opt/hadoop/etc/hadoop/

3.5 啓動HDFS

3.5.1 先啓動zookeeper

    zkServer.sh start

3.5.2 在其中一個namenode上格式化zookeeper

hdfs zkfc -formatZK

如下圖表示格式化成功
image

3.5.3 啓動journalnode,需要啓動所有節點的journalnode

hdfs --daemon start journalnode

使用JPS命令查看journalnode是否啓動成功,成功之後能看到JournalNode如下圖:
image

3.5.4 格式化namenode

hdfs namenode -format 
# 如果有多個namenode名稱,可以使用  hdfs namenode -format xxx 指定

如果沒有Error日誌輸出表示格式化成功

3.5.5 啓動namenode,以便同步其他namenode

hdfs --daemon start namenode

啓動之後使用jps命令查詢是否啓動成功
image

3.5.6 其他namenode同步

  1. 如果是使用高可用方式配置的namenode,使用下面命令同步(需要同步的namenode執行).
hdfs namenode -bootstrapStandby

image
2. 如果不是使用高可用方式配置的namenode,使用下面命令同步:

hdfs namenode -initializeSharedEdits

3.5.7 配置datanode

修改workers 文件,添加datanode節點

node2
node3
node4

3.5.7 啓動hdfs

start-dfs.sh

jps 查看結果:
image
image
image
image

通過瀏覽器訪問hdfs
http://192.168.56.11:9870
image
image

4. Hadoop 配置日誌聚合和jobhistoryserver

4.1 yarn-site.xml 配置resourcemanager web監聽

<property>
         <name>yarn.resourcemanager.webapp.address</name>
         <value>rmhost:8088</value>
 </property>

4.2 mapred-site.xml配置jobhistoryserver

<property>
    <name>mapreduce.jobhistory.address</name>
    <value>rmhost:10020</value>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>rmhost:19888</value>
</property>
<property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>/mr-history/tmp</value>
</property>
<property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>/mr-history/done</value>
</property>

注意:jobhistoryserver需單獨啓動

mapred --daemon start historyserver

4.3 yarn-site.xml配置日誌聚合

<!-- 開啓日誌聚合 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<!-- 日誌聚合目錄 -->
<property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/user/container/logs</value>
</property> 

錯誤處理

1. zkfc 格式化錯誤

image

java.net.NoRouteToHostException: 沒有到主機的路由
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
    at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)
    at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)
2018-02-06 11:34:01,218 ERROR ha.ActiveStandbyElector: Connection timed out: couldn't connect to ZooKeeper in 5000 milliseconds
2018-02-06 11:34:01,461 INFO zookeeper.ClientCnxn: Opening socket connection to server node2/192.168.56.12:2181. Will not attempt to authenticate using SASL (unknown error)

解決方法:

關閉防火牆,並禁止防火牆啓動

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啓動

2. 格式化namenode 報錯,一直在嘗試連接

如圖:
image

2018-02-06 11:43:58,061 INFO ipc.Client: Retrying connect to server: node2/192.168.56.12:8485. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2018-02-06 11:43:58,062 INFO ipc.Client: Retrying connect to server: node4/192.168.56.14:8485. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2018-02-06 11:43:58,062 INFO ipc.Client: Retrying connect to server: node3/192.168.56.13:8485. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

解決辦法:

啓用 journalnode,需要分別啓動所有節點

hdfs --daemon start journalnode

使用JPS命令查看journalnode是否啓動成功,成功之後能看到JournalNode如下圖:
image

3. hdfs 啓動報錯

image

Starting namenodes on [node1 node2]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting journal nodes [node2 node3 node4]
ERROR: Attempting to operate on hdfs journalnode as root
ERROR: but there is no HDFS_JOURNALNODE_USER defined. Aborting operation.
Starting ZK Failover Controllers on NN hosts [node1 node2]
ERROR: Attempting to operate on hdfs zkfc as root
ERROR: but there is no HDFS_ZKFC_USER defined. Aborting operation.

解決方法:
在start-dfs.sh,stop-dfs.sh 開始位置增加如下配置:

# 注意等號前後不要有空格
HDFS_NAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root

4. yarn 啓用報錯

image

Starting resourcemanager
ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
Starting nodemanagers
ERROR: Attempting to operate on yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.

解決辦法:

在start-yarn.sh 文件開始處添加:

# 注意等號前後不要有空格
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root

5. NodeManager 啓動報錯

2018-02-06 15:22:36,169 ERROR org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.ConnectException: Your endpoint configuration is wrong; For more details see:  http://wiki.apache.org/hadoop/UnsetHostnameOrPort
    at org.apache.hadoop.yarn.server.nodemanager.NodeStatusUpdaterImpl.serviceStart(NodeStatusUpdaterImpl.java:259)
    at org.apache.hadoop.service.AbstractService.start(AbstractService.java:194)
    at org.apache.hadoop.service.CompositeService.serviceStart(CompositeService.java:121)
    at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceStart(NodeManager.java:451)
    at org.apache.hadoop.service.AbstractService.start(AbstractService.java:194)
    at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:834)
    at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:894)

解決辦法:
讓 NodeManager自動檢測內容和CPU,在yarn-size.xml 添加如下配置:

    <property>
        <!-- 啓用節點的內容和CPU自動檢測 -->
        <name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
        <value>true</value>
    </property>

6. NodeManager啓動之後又結束

2018-02-06 16:50:31,210 ERROR org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Received SHUTDOWN signal from Resourcemanager, Registration of NodeManager failed, Message from ResourceManager: NodeManager from  node4 doesn't satisfy minimum allocations, Sending SHUTDOWN signal to the NodeManager. Node capabilities are <memory:256, vCores:1>; minimums are 1024mb and 1 vcores
    at org.apache.hadoop.yarn.server.nodemanager.NodeStatusUpdaterImpl.serviceStart(NodeStatusUpdaterImpl.java:259)
    at org.apache.hadoop.service.AbstractService.start(AbstractService.java:194)
    at org.apache.hadoop.service.CompositeService.serviceStart(CompositeService.java:121)
    at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceStart(NodeManager.java:451)
    at org.apache.hadoop.service.AbstractService.start(AbstractService.java:194)
    at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:834)
    at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:894)
Caused by: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Received SHUTDOWN signal from Resourcemanager, Registration of NodeManager failed, Message from ResourceManager: NodeManager from  node4 doesn't satisfy minimum allocations, Sending SHUTDOWN signal to the NodeManager. Node capabilities are <memory:256, vCores:1>; minimums are 1024mb and 1 vcores
    at org.apache.hadoop.yarn.server.nodemanager.NodeStatusUpdaterImpl.registerWithRM(NodeStatusUpdaterImpl.java:375)
    at org.apache.hadoop.yarn.server.nodemanager.NodeStatusUpdaterImpl.serviceStart(NodeStatusUpdaterImpl.java:253)
    ... 6 more

解決辦法:升級內存,NodeManager內存最小要求爲1024M 和 1核CPU

7. hdfs 安全模式開(safe mode is on)

解決辦法:

hadoop dfsadmin -safemode leave
發佈了132 篇原創文章 · 獲贊 303 · 訪問量 119萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章