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)
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
增加內容
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
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
如果看到 如下圖進程,表示啓動成功
3.3.11 (可選) zookeeper Centos7 配置開機自啓動
- 在/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
- 重新加載服務
systemctl daemon-reload
- 啓動zookeeper
systemctl start zookeeper
- 開機自啓動
systemctl enable zookeeper
- 查看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
- 配置 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>
- 配置 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>
- 配置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>
- 配置mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- 將配置文件複製到其他機器
scp ./* node4:/opt/hadoop/etc/hadoop/
3.5 啓動HDFS
3.5.1 先啓動zookeeper
zkServer.sh start
3.5.2 在其中一個namenode上格式化zookeeper
hdfs zkfc -formatZK
如下圖表示格式化成功
3.5.3 啓動journalnode,需要啓動所有節點的journalnode
hdfs --daemon start journalnode
使用JPS命令查看journalnode是否啓動成功,成功之後能看到JournalNode如下圖:
3.5.4 格式化namenode
hdfs namenode -format
# 如果有多個namenode名稱,可以使用 hdfs namenode -format xxx 指定
如果沒有Error日誌輸出表示格式化成功
3.5.5 啓動namenode,以便同步其他namenode
hdfs --daemon start namenode
啓動之後使用jps命令查詢是否啓動成功
3.5.6 其他namenode同步
- 如果是使用高可用方式配置的namenode,使用下面命令同步(需要同步的namenode執行).
hdfs namenode -bootstrapStandby
2. 如果不是使用高可用方式配置的namenode,使用下面命令同步:
hdfs namenode -initializeSharedEdits
3.5.7 配置datanode
修改workers 文件,添加datanode節點
node2
node3
node4
3.5.7 啓動hdfs
start-dfs.sh
jps 查看結果:
通過瀏覽器訪問hdfs
http://192.168.56.11:9870
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 格式化錯誤
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 報錯,一直在嘗試連接
如圖:
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如下圖:
3. hdfs 啓動報錯
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 啓用報錯
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