[喵咪大資料]Hadoop叢集模式
既然是大資料無論儲存和處理都需要相當大的磁碟或者是處理的資源消耗,那麼單機肯定是滿足不了我們的需求的,所以本節我們就來了解Hadoop的叢集模式搭建,在叢集情況下一同配合處理任務分發,儲存分擔等相關的功能進行實踐.
附上:
Hadoop的官網:hadoop.apache.org 喵了個咪的部落格:w-blog.cn
1.準備工作
安裝包清單
統一存放到**/app/install**目錄下,暫時只用存放到hadoop-1上,配置好了之後scp到slave節點上
jdk-8u101-linux-x64.tar.gz
hadoop-2.7.3.tar.gz
伺服器環境
伺服器系統使用centos7.X 64
# hadoop-1 192.168.1.101
# hadoop-2 192.168.1.102
# hadoop-3 192.168.1.103
建立install目錄存放各項包,使用oneinstack更新基礎元件
> mkdir -p /app/install && cd /app/install # 使用oneinstack更新一下環境基礎元件 全部選擇N即可 > wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz > tar -zxvf oneinstack-full.tar.gz > cd oneinstack && ./install.sh
關閉各個節點防火牆(hadoop各個埠通訊會被攔截)或者是下面配置的一些埠全部加入到白名單中
> systemctl stop firewalld.service # 關閉firewall
> systemctl disable firewalld.service # 禁止firewall開機啟動
分別修改伺服器的主機名
# 最後主機名會全小寫狀態顯示 > hostnamectl set-hostname hadoop-1 > hostnamectl set-hostname hadoop-2 > hostnamectl set-hostname hadoop-3
修改伺服器的host(方便互相連通是的時候使用hostname)
> vim /etc/hosts
192.168.1.101 hadoop-1
192.168.1.102 hadoop-2
192.168.1.103 hadoop-3
重啟伺服器使其修改生效,重啟完成後會發現主機名已經改回來了,然後使用ping命令檢查是否可以互相連通
> ping hadoop-1
> ping hadoop-2
> ping hadoop-3
為所有叢集節點建立hadoop使用者(如果暴露外網IP務必使用複雜密碼避免攻擊)
> useradd -m hadoop -s /bin/bash
> passwd hadoop
為 hadoop 使用者增加管理員許可權,可以使用sudo來以root許可權來進行操作
> visudo
# 找到root複製一條改為hadoop
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL
給hadoop-1新增SHH免密登入(hadoop-1 是我們的master主機)
# 先切換到hadoop使用者
> su hadoop
> ssh-keygen -t rsa # 會有提示,都按回車就可以
> cd ~/.ssh/
> cat id_rsa.pub >> authorized_keys # 加入授權
> chmod 600 ./authorized_keys # 修改檔案許可權
> ssh localhost # 此時使用ssh首次需要yes以下不用密碼即可登入
讓hadoop-1可以免密碼登入到hadoop-2和hadoop-3 在2和3上執行
> su hadoop
> ssh-keygen -t rsa
在hadoop-1上執行
> scp ~/.ssh/authorized_keys hadoop@hadoop-2:/home/hadoop/.ssh/
> scp ~/.ssh/authorized_keys hadoop@hadoop-3:/home/hadoop/.ssh/
此時就可以使用如下命令通過hadoop1號登入2和3
> ssh hadoop-2
> ssh hadoop-3
2.配置叢集
Java環境
首先需要在每臺伺服器上配置好java環境
> cd /app/install
> sudo tar -zxvf jdk-8u101-linux-x64.tar.gz
> sudo mv jdk1.8.0_101/ /usr/local/jdk1.8
> scp /app/install/jdk-8u101-linux-x64.tar.gz hadoop@hadoop-2:~
> scp /app/install/jdk-8u101-linux-x64.tar.gz hadoop@hadoop-3:~
在hadoop-2 和 hadoop-3 上以root的身份執行
> sudo mv ~/jdk-8u101-linux-x64.tar.gz /app/install
> cd /app/install
> sudo tar -zxvf jdk-8u101-linux-x64.tar.gz
> sudo mv jdk1.8.0_101/ /usr/local/jdk1.8
所有節點環境變數增加如下內容
> sudo vim /etc/profile
# java
export JAVA_HOME=/usr/local/jdk1.8
export JRE_HOME=/usr/local/jdk1.8/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
# 使環境變數生效
> source /etc/profile
如下結果為安裝成功
> java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
Hadoop環境
首先在hadoop-1上準備hadoop環境
> cd /app/install
> sudo tar -zxvf hadoop-2.7.3.tar.gz
> sudo mv hadoop-2.7.3 /usr/local/
> sudo chown -R hadoop:hadoop /usr/local/hadoop-2.7.3
所有節點環境變數增加如下內容
> sudo vim /etc/profile
# hadoop
export HADOOP_HOME=/usr/local/hadoop-2.7.3
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 PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
# 使環境變數生效
> source /etc/profile
配置Hadoop叢集
叢集/分散式模式需要修改 /usr/local/hadoop-2.7.3/etc/hadoop 中的6個配置檔案,更多設定項可點選檢視官方說明,這裡僅設定了正常啟動所必須的設定項:vim hadoop-env.sh 、 slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。
1.修改hadoop-env.sh中的JAVA環境變數
> vim /usr/local/hadoop-2.7.3/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8
1, 檔案 slaves,將作為 DataNode 的主機名寫入該檔案,每行一個,預設為 localhost,所以在偽分散式配置時,節點即作為 NameNode 也作為 DataNode。分散式配置可以保留 localhost,也可以刪掉,讓 hadoop-1 節點僅作為 NameNode 使用。 本教程讓 Master 節點僅作為 NameNode 使用,因此將檔案中原來的 localhost 刪除,只新增如下內容。
> vim /usr/local/hadoop-2.7.3/etc/hadoop/slaves
hadoop-2
hadoop-3
2, 檔案 core-site.xml 改為下面的配置:
> vim /usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop-2.7.3/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
3, 檔案 hdfs-site.xml,dfs.replication 一般設為 3,但我們只有兩個 Slave 節點,所以 dfs.replication 的值還是設為 2:
NameNode:管理檔案系統的元資料,所有的資料讀取工作都會先經過NameNode獲取源資料在哪個DataNode裡面在進行獲取操作
DataNode:實際資料儲存節點,具體的對映關係會儲存在NameNode下
replication:複製因子,HDFS還有一個重要功能就是複製,當磁碟損壞的時候HDFS的資料並不會丟掉,可以理解為冗餘備份機制
這裡和單機模式不同的是需要配置NameNode的呼叫地址,DataNode節點才能連線上
> vim /usr/local/hadoop-2.7.3/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-1:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop-2.7.3/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop-2.7.3/tmp/dfs/data</value>
</property>
</configuration>
4, 檔案 mapred-site.xml (可能需要先重新命名,預設檔名為 mapred-site.xml.template),然後配置修改如下:
> mv /usr/local/hadoop-2.7.3/etc/hadoop/mapred-site.xml.template /usr/local/hadoop-2.7.3/etc/hadoop/mapred-site.xml
> vim /usr/local/hadoop-2.7.3/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop-1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop-1:19888</value>
</property>
</configuration>
5, 檔案 yarn-site.xml:
> vim /usr/local/hadoop-2.7.3/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
配置好後,將 Master 上的 /usr/local/Hadoop-2.7.3 資料夾複製到各個節點上。因為之前有跑過偽分散式模式,建議在切換到叢集模式前先刪除之前的臨時檔案。在 Master 節點上執行:
> scp -r /usr/local/hadoop-2.7.3 hadoop-2:/home/hadoop
> scp -r /usr/local/hadoop-2.7.3 hadoop-3:/home/hadoop
在 2和3節點上執行:
> sudo mv ~/hadoop-2.7.3 /usr/local
> sudo chown -R hadoop /usr/local/hadoop-2.7.3
首次啟動和單機模式一樣需要先在 Master 節點(hadoop1)執行 NameNode 的格式化:
> hdfs namenode -format
接著可以啟動 hadoop 了,啟動需要在 Master 節點上進行:
> start-dfs.sh
> start-yarn.sh
> mr-jobhistory-daemon.sh start historyserver
執行start-dfs.sh有如下提示
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
該警告通過如下方法消除了:
在hadoop-env.sh中 修改HADOOP_OPTS:
export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib:$HADOOP_PREFIX/lib/native"
檢視叢集情況(關於磁碟佔用,伺服器狀態等)
當整個叢集執行起來之後可以通過hadoop-1:50070進行叢集狀態的檢視和hdfs dfsadmin -report效果一樣
> hdfs dfsadmin -report
如果不在需要使用可以使用如下命令關閉整個叢集
> stop-yarn.sh
> stop-dfs.sh
> mr-jobhistory-daemon.sh stop historyserver
因為在環境變數中配置了**$HADOOP_HOME/sbin**也可以直接使用Hadoop快速啟動快速關閉命令來對Hadoop整個叢集啟動或關閉
start-all.sh
stop-all.sh
3.叢集模式下執行測試程式
執行叢集任務執行過程與偽分散式模式一樣,首先建立 HDFS 上的使用者目錄:
> hdfs dfs -mkdir -p /user/hadoop
將 /usr/local/hadoop-2.7.3/etc/hadoop 中的配置檔案作為輸入檔案複製到分散式檔案系統中:
> hdfs dfs -mkdir input
> hdfs dfs -put /usr/local/hadoop-2.7.3/etc/hadoop/*.xml input
> hdfs dfs -ls /user/hadoop/input
接著就可以執行 MapReduce 作業了:
> hadoop jar /usr/local/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'
執行時的輸出資訊與偽分散式類似,會顯示 Job 的進度。
可能會有點慢,但如果遲遲沒有進度,比如 5 分鐘都沒看到進度,那不妨重啟 Hadoop 再試試。若重啟還不行,則很有可能是記憶體不足引起,建議增大虛擬機器的記憶體,或者通過更改 YARN 的記憶體配置解決。
需要在所有叢集中yarn-site.xml中增加
> vim /usr/local/hadoop-2.7.3/etc/hadoop/yarn-site.xml
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>20480</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
如果你使用的是阿里雲的伺服器這裡有一個大坑,阿里雲預設的host裡面會寫一些配置影響的hadoop正常執行,如下:
如果還是出現 failed on connection exception 異常執行不起來的情況可以去/etc/hosts中註釋如下配置:
#127.0.0.1 localhost localhost.localdomain localhost4 localhost
#127.0.0.1 izbp1cvz54m4x8i9l5clyiz
#127.0.0.1 izbp1cvz54m4x8i9l5clyiz4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
同樣可以通過 Web 介面檢視任務進度 hadoop-1:8088/cluster,在 Web 介面點選 “Tracking UI” 這一列的 History 連線,可以看到任務的執行資訊,如下圖所示:
檢視處理結果
> hdfs dfs -cat output/*
4 總結
本節已經成功的在叢集的情況下協調進行了任務的處理工作資料的儲存工作,下一節中我們將講到一些關於Hadoop維護相關的內容,最後多謝大家的支援歡迎大家一同交流!
注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!