Docker Centos7 Hadoop2.10.1 搭建環(huán)境

前情提要:因?yàn)閙ac上docker ping不通容器,后裝了一個(gè)docker-mac-network進(jìn)行轉(zhuǎn)發(fā),但是速度太慢,web界面都沒(méi)辦法打開(kāi),所以就沒(méi)辦法使用hdfs客戶端,最后還是轉(zhuǎn)投了parallel裝虛擬機(jī)進(jìn)行學(xué)習(xí),大部分內(nèi)容還是可以用的。

1.以centos7為基礎(chǔ)創(chuàng)建centos7-ssh鏡像

創(chuàng)建Dockerfile文件

vi Dockerfile

將如下內(nèi)容寫(xiě)入Dockerfile

FROM centos:centos7
MAINTAINER wr

RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum  install -y openssh-clients

RUN echo "root:123456" | chpasswd
RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

上述內(nèi)容大概意思是:以centos鏡像為基礎(chǔ),設(shè)置密碼為123456,安裝ssh服務(wù)并啟動(dòng)

構(gòu)建Dockerfile(注意有個(gè)“點(diǎn)”)

docker build -t="centos7-ssh" .

將生成一個(gè)名為centos7-ssh的鏡像,可以通過(guò)docker images查看'

2.準(zhǔn)備好hadoop和jdk,以centos7-ssh為基礎(chǔ)構(gòu)建centos7-hadoop鏡像

hadoop-2.10.1.tar.gz
jdk-8u281-linux-x64.tar.gz

創(chuàng)建新的Dockerfile

vi Dockerfile

將以下內(nèi)容寫(xiě)入:

FROM centos7-ssh
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_281 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

ADD hadoop-2.10.1.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.10.1 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

RUN yum install -y which sudo

上述內(nèi)容大概意思是:以上面生成的centos7-ssh為基礎(chǔ),將hadoop和jdk包放進(jìn)去,然后配好環(huán)境變量。

構(gòu)建Dockerfile

將生成一個(gè)名為hadoop的鏡像

3.配置docker網(wǎng)橋,啟動(dòng)鏡像

1.創(chuàng)建網(wǎng)絡(luò)

docker network create --driver bridge bridge_hadoop

以上命令創(chuàng)建了一個(gè)名為hadoop-br的bridge類(lèi)型的網(wǎng)絡(luò)

2.啟動(dòng)docker時(shí)指定網(wǎng)絡(luò)

docker run -itd --network bridge_hadoop --name hadoop1 -p 50070:50070 -p 8088:8088 hadoop
docker run -itd --network bridge_hadoop --name hadoop2 hadoop
docker run -itd --network bridge_hadoop --name hadoop3 hadoop

以上命令啟動(dòng)了3臺(tái)機(jī)器,網(wǎng)絡(luò)都指定為bridge_hadoop,hadoop1還開(kāi)啟了端口映射。

3.查看網(wǎng)絡(luò)情況

docker network inspect bridge_hadoop

4.登錄docker容器,互相之間就可以ping通了。

docker exec -it hadoop1 /bin/bash
docker exec -it hadoop2 /bin/bash
docker exec -it hadoop3 /bin/bash

4.配置host及ssh免密登錄

1.分別在每臺(tái)修改每臺(tái)機(jī)器的host

vi /etc/hosts

將以下內(nèi)容寫(xiě)入(注:docker分出來(lái)的ip對(duì)于每個(gè)人可能不一樣,填你自己的):

${ip1} hadoop1 
${ip1} hadoop2 
${ip1} hadoop3 

2.因?yàn)樯厦嬖阽R像中已經(jīng)安裝了ssh服務(wù),所以直接分別在每臺(tái)機(jī)器上執(zhí)行以下命令:

ssh-keygen
一路回車(chē)
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1

ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2

ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop3

3.測(cè)試是否配置成功
ping hadoop1
ping hadoop2
ping hadoop3
ssh hadoop1
ssh hadoop2
ssh hadoop3

5.配置hadoop

1.創(chuàng)建一些文件夾,一會(huì)在配置中要用到

mkdir /home/hadoop
mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data

2.切換到hadoop配置的目錄

cd $HADOOP_HOME/etc/hadoop/

3.編輯core-site.xml

    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop1:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/home/hadoop/tmp</value>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>131702</value>
    </property>

4.編輯hdfs-site.xml

 <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/home/hadoop/hdfs_name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/hadoop/hdfs_data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop1:9001</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

5.編輯mapred-site.xml

mapred-site.xml默認(rèn)不存在,要執(zhí)行

cp mapred-site.xml.template mapred-site.xml

 <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop1:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop1:19888</value>
    </property>

6.編輯yarn-site.xml

 <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>hadoop1:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>hadoop1:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>hadoop1:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>hadoop1:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>hadoop1:8088</value>
    </property>

7.編輯slaves

我這里把hadoop1當(dāng)成主節(jié)點(diǎn),hadoop2、3作為從節(jié)點(diǎn)

hadoop2
hadoop3

8.把文件拷貝到hadoop2和hadoop3上

依次執(zhí)行以下命令:

scp -r $HADOOP_HOME/ hadoop2:/usr/local/
scp -r $HADOOP_HOME/ hadoop3:/usr/local/

scp -r /home/hadoop hadoop2:/
scp -r /home/hadoop hadoop3:/

9.分別連接每臺(tái)機(jī)器,配置hadoop sbin目錄的環(huán)境變量

docker exec -it hadoop1 bash
docker exec -it hadoop2 bash
docker exec -it hadoop3 bash

因?yàn)閔adoop bin目錄在之前創(chuàng)建鏡像時(shí)就配好了,但是sbin目錄沒(méi)有配,所以要單獨(dú)配置。分配為每臺(tái)機(jī)器配置:

vi ~/.bashrc

追加如下內(nèi)容:

export PATH=$PATH:$HADOOP_HOME/sbin

執(zhí)行:

source ~/.bashrc

6.啟動(dòng)

在hadoop1上執(zhí)行以下命令:

格式化hdfs

hdfs namenode -format

一鍵啟動(dòng)

start-all.sh

不出錯(cuò)的話,就可以慶祝一下了。

Hadoop啟動(dòng)報(bào)Error: JAVA_HOME is not set and could not be found解決辦法
修改/etc/hadoop/hadoop-env.sh中設(shè)JAVA_HOME。
應(yīng)當(dāng)使用絕對(duì)路徑。
export JAVA_HOME=$JAVA_HOME //錯(cuò)誤,不能這么改
export JAVA_HOME=/usr/java/jdk1.6.0_45 //正確,應(yīng)該這么改

測(cè)試使用hadoop
jps
# hadoop1
1748 Jps
490 NameNode
846 ResourceManager
686 SecondaryNameNode

# hadoop2
400 DataNode
721 Jps
509 NodeManager

# hadoop3
425 NodeManager
316 DataNode
591 Jps

上傳文件

hdfs dfs -mkdir /mwf

echo hello > a.txt
hdfs dfs -put a.txt /mwf

hdfs dfs -ls /mwf

Found 1 items
drwxr-xr-x   - root supergroup          0 2020-09-04 11:14 /mwf

7.運(yùn)行wordcount

把license作為需要統(tǒng)計(jì)的文件

root@h01:/usr/local/hadoop# cat LICENSE.txt > file1.txt
root@h01:/usr/local/hadoop# ls

在 HDFS 中創(chuàng)建 input 文件夾

root@h01:/usr/local/hadoop/bin# ./hadoop fs -mkdir /input
root@h01:/usr/local/hadoop/bin#

上傳 file1.txt 文件到 HDFS 中

root@h01:/usr/local/hadoop/bin# ./hadoop fs -put ../file1.txt /input
root@h01:/usr/local/hadoop/bin#

查看 HDFS 中 input 文件夾里的內(nèi)容

root@h01:/usr/local/hadoop/bin# ./hadoop fs -ls /input
Found 1 items
-rw-r--r--   2 root supergroup     150569 2019-03-19 11:13 /input/file1.txt
root@h01:/usr/local/hadoop/bin#

運(yùn)作 wordcount 例子程序

root@h01:/usr/local/hadoop/bin# ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jar wordcount /input /output

使用http://0.0.0.0:50070/dfshealth.html#tab-overview訪問(wèn)UI界面

參考:https://www.cnblogs.com/upupfeng/p/13616125.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容