作者 | tianyouououou

責編 | Carol

來源 | CSDN 博客

封圖 | CSDN付費下載於視覺中國

最近,作者整理了一套Hadoop搭建方案。 最後的鏡像大小1.4G多,使用docker子網,容器重新啓動不需要重新配置/etc/hosts文件。

配置過程中參考瞭如下博客,有些細節問題這些博客裏面解釋的更加詳細。

ssh配置部分:

https://blog.csdn.net/weixin_42051109/article/details/82744993

wordcount部分:

https://blog.csdn.net/alexwym/article/details/82497582

雖然配置完了,但是有些地方並不完全懂,後續有機會還會做一些補充解釋。

* 環境:Ubuntu16.04虛擬機

準備工作

  1. 下載解壓jdk1.8文件夾

  2. 下載解壓Hadoop2.8.5文件夾

  3. docker pull centos7基礎鏡像

  4. 建mydocker文件夾

  5. 將jdk1.8文件夾和Hadoop文件夾移動到mydocker文件夾(這裏爲了簡潔將Hadoop2.8.5文件夾重命名爲Hadoop)

  6. 編輯Hadoop文件夾內的文件(避免創建鏡像後要修改三遍)

首先進入Hadoop/etc/Hadoop文件夾後修改hadoop.env.sh

tianyou@ubuntu:~/mydocker/Hadoop/etc/Hadoop$ vim hadoop-env.sh

將JAVA_HOME修改爲如下路徑

export JAVA_HOME= /usr/local/jdk1.8

修改core-site.xml如下

tianyou@ubuntu:~/mydocker/hadoop/etc/hadoop$ vim core-site.xml
<!-- Put site-specific property overrides in this file. -->
<configuration>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://hadoop0:9000</value>
      </property>
      <property>
         <name>io.file.buffer.size</name>
         <value>131072</value>
     </property>
     <property>
          <name>hadoop.tmp.dir</name>
          <value>/usr/local/hadoop/tmp</value>
     </property>
</configuration>

修改yarn-site.xml

tianyou@ubuntu:~/mydocker/hadoop/etc/hadoop$ vim yarn-site.xml
<configuration>
     <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
     </property>
     <property>
         <name>yarn.resourcemanager.address</name>
         <value>hadoop0:8032</value>
     </property>
     <property>
         <name>yarn.resourcemanager.scheduler.address</name>
         <value>hadoop0:8030</value>
     </property>
     <property>
         <name>yarn.resourcemanager.resource-tracker.address</name>
         <value>hadoop0:8031</value>
     </property>
     <property>
         <name>yarn.resourcemanager.admin.address</name>
         <value>hadoop0:8033</value>
     </property>
   <property>
         <name>yarn.resourcemanager.webapp.address</name>
         <value>hadoop0:8088</value>
     </property>
     <property>
         <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
         <value>org.apache.hadoop.mapred.ShuffleHandler</value>
     </property>
</configuration>          

修改mapred-site.xml,我這裏是mapred-site.xml.template

tianyou@ubuntu:~/mydocker/hadoop/etc/hadoop$ vim mapred-site.xml.template
<!-- Put site-specific property overrides in this file. -->
<configuration>
 <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

修改hdfs-site.xml(按照datanode配置)

tianyou@ubuntu:~/mydocker/hadoop/etc/hadoop$ vim hdfs-site.xml
<configuration>
    <property>
      <name>dfs.replication</name>
      <value>2</value>
    </property>
    <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:/usr/local/hadoop/hdfs/data</value>
    </property>
</configuration>

這裏修改hadoop配置文件是爲了構建鏡像時直接將hadoop文件夾COPY到鏡像中,再用鏡像創建三個容器後不需要在三個容器中分別進行重複的配置工作。

使用Dockerfile構建鏡像

1、編輯Dockefile,基於準備好的centos:7基礎鏡像構建

FROM centos:7
# 選擇一個已有的os鏡像作爲基a礎  
# 鏡像的作者  
MAINTAINER tianyou
# 安裝openssh-server和sudo軟件包,並且將sshd的UsePAM參數設置成no  
RUN yum install -y openssh-server sudo \
        && sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
#安裝openssh-clients
        && yum  install -y openssh-clients \
        && yum install -y vim \
        && yum install -y which \


# 添加測試用戶root,密碼root,並且將此用戶添加到sudoers裏  
        && echo "root:root" | chpasswd \
        && echo "root   ALL=(ALL)       ALL" >> /etc/sudoers \
# 下面這兩句比較特殊,在centos6上必須要有,否則創建出來的容器sshd不能登錄  
        && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \
        && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \


        && mkdir /var/run/sshd


COPY jdk1.8  /usr/local/jdk1.8/
COPY hadoop /usr/local/hadoop/
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

2、在mydocker文件夾下執行構建命令(因爲需要文件訪問權限要加sudo,命令最後的,不要丟)

tianyou@ubuntu:~/mydocker$ sudo docker build -t tianyou/centos-java-hadoop .

創建容器

1、 創建子網 Hadoopnetwork

tianyou@ubuntu:~/mydocker$ docker network create --subnet=172.19.0.0/16 hadoopnetwork

2、創建容器並指定子網和ip

創建Hadoop0容器

tianyou@ubuntu:~/mydocker$ docker run -it -d --net hadoopnetwork --ip 172.19.0.2 --name hadoop0 -h hadoop0 tianyou/centos-java-hadoop

創建hadoop1容器

tianyou@ubuntu:~/mydocker$ docker run -it -d --net hadoopnetwork --ip 172.19.0.3 --name hadoop1 -h hadoop1 tianyou/centos-java-hadoop

創建Hadoop2容器

tianyou@ubuntu:~/mydocker$ docker run -it -d --net hadoopnetwork --ip 172.19.0.4 --name hadoop2 -h hadoop2 tianyou/centos-java-hadoop

配置ssh

1.進入Hadoop0

tianyou@ubuntu:~/mydocker$ docker exec -it hadoop0 /bin/bash

2.配置ssh密鑰

[root@hadoop0 /]# /usr/sbin/sshd && /usr/sbin/sshd-keygen -A && /usr/sbin/sshd

製作密鑰,輸入ssh-keygen -t rsa,然後敲三次Enter鍵

[root@hadoop0 /]# ssh-keygen -t rsa

生成的密鑰存在 /root/.ssh/id_rsa.pub 文件中,執行指令把密鑰存儲在 /root/.ssh/authorized_keys 文件中

修改sshd_config配置使提示更簡潔,合併指令如下:

[root@hadoop0 /]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && vim /etc/ssh/sshd_config

將配置文件中對應行 修改爲如下所示:

Port 22
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
PrintLastLog no

Esc進入命令模式,:wq保存

修改ssh_config文件中 StrictHostKeyChecking ask改成no

[root@Master local]# vim /etc/ssh/ssh_config
StrictHostKeyChecking no

Ctrl+P+Q退出Hadoop0容器

進入Hadoop1和Hadoop2容器,進行同樣的操作生成ssh密鑰和配置

3、將容器的祕鑰互相添加

每個容器的 /root/.ssh/authorized_keys 文件都需要填入所有容器的密鑰

以上操作結束後在Hadoop2容器中,查看文件,複製出haoop2密鑰

[root@hadoop2 /]#  vim  /root/.ssh/authorized_keys

ctrl+P+Q退出,同樣複製出Hadoop1和Hadoop0祕鑰,將三個祕鑰全部複製到三個容器的/root/.ssh/authorized_keys文件中。

複製完成後在每個容器中都執行一次 /usr/sbin/sshd命令。

[root@Master local]# /usr/sbin/sshd

至此,通過ssh可以互相訪問,測試一下

[root@hadoop0 /]# ssh hadoop1

ctrl+D返回

完善Hadoop配置

進入Hadoop0,修改hdfs-site.xml 文件如下:

[root@hadoop0 /]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml

因爲在COPY進容器時按照datanode配置,所以要修改爲namenode配置,只需要將三處data修改爲name。

<!-- Put site-specific property overrides in this file. --><configuration>    <property>      <name>dfs.replication</name>      <value>2</value>    </property>    <property>      <name>dfs.namenode.name.dir</name>      <value>file:/usr/local/hadoop/hdfs/name</value>    </property></configuration>

通過ssh進入Hadoop1,刪除重建hdfs文件

[root@hadoop0 /]# ssh hadoop1[root@hadoop1 ~]# rm -rf /usr/local/hadoop/hdfs && mkdir -p /usr/local/hadoop/hdfs/data

ctrl+D退出,同樣進入Hadoop2,刪除重建hdfs文件

ctrl+D退出,回到Hadoop0,刪除重建hdfs文件,注意這裏是name。

[root@hadoop0 /]# rm -rf /usr/local/hadoop/hdfs && mkdir -p /usr/local/hadoop/hdfs/name

修改slaves文件

[root@hadoop0 local]# vim /usr/local/hadoop/etc/hadoop/slaves

填入Hadoop1,Hadoop2

localhosthadoop1hadoop2

格式化hdfs(這裏當時報了一個錯,找不到JAVA_HOME,因爲Hadoop-env.sh中JAVA_HOME=後面多敲了一個空格,刪掉後成功運行)

[root@hadoop0 /]# hdfs namenode -format

修改/etc/profile文件 ,修改後可以使用jps 或 Hadoop fs xx 指令

[root@hadoop0 local]# vim /etc/profile

將下面的代碼添加到文件末尾,保存退出

export JAVA_HOME=/usr/local/jdk1.8export HADOOP_HOME=/usr/local/hadoopexport PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source使配置生效

[root@hadoop1 ~]# source /etc/profile

ssh進入Hadoop1和hadoop2做同樣修改。

回到Hadoop0進入Hadoop/sbin,執行start-all命令啓動

[root@hadoop0 local]# cd /usr/local/hadoop/sbin/[root@hadoop0 sbin]# ./start-all.sh

可以運行如下命令查看節點情況

[root@hadoop0 sbin]# hadoop dfsadmin -report

測試wordcount程序

啓動Hadoop之後(一定要先啓動),可以運行自帶的wordcount程序來測試一下

進入Hadoop文件夾 在hdfs建立input文件夾

[root@hadoop0 hadoop]# bin/hdfs dfs -mkdir -p /data/input

在容器中創建my_wordcount.txt文件,編輯一些單詞 ,Esc :wq保存

[root@hadoop0 hadoop]# vim my_wordcount.txt

將本地的文件上傳到hdfs

[root@hadoop0 hadoop]# bin/hdfs dfs -put my_wordcount.txt /data/input

啓動wordcount程序,指定輸入文件和輸出文件(版本號需要改)

[root@hadoop0 hadoop]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /data/input/my_wordcount.txt /data/out/my_wordcount

查看運行結果

[root@hadoop0 hadoop]# bin/hdfs dfs -cat /data/out/my_wordcount/part-r-00000

你學會了嗎? 如果你對本文有什麼想法或意見,歡迎評論區告訴我們!

在全民抗疫的特殊時期下,在人員複雜、流動量大地方的出入口處都設置了無接觸式無感紅外人體測溫系統。

在這次疫情防控中,無感人體測溫系統發揮了怎樣的作用? 高精準的無感人體測溫系統的核心技術武器是什麼? 對於開發者們來說,大家應該瞭解哪些技術?

今晚 8點《多場景疫情防控: 解讀雲邊端聯動下的全棧 AI 技術應用》

推薦閱讀:必看!Spark 進階之路之「SparkSQL」入門概述 | 博文精選
如果你覺得 Git 很迷惑人,那麼這份小抄正是爲你準備的!
開闢 Dart 到 Native 的超級通道,餓了麼跨平臺的最佳實踐
比特幣歸誰所有?有人通過分析區塊鏈數據集找到答案
爲什麼說Transformer就是圖神經網絡?
脫單?撒狗糧?加班?女神節這麼過 | 程序員有話說
真香,朕在看了!
相關文章