天天看點

[喵咪大資料]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維護相關的内容,最後多謝大家的支援歡迎大家一同交流!

注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!