docker部署Hadoop环境
发布日期:2021-05-07 00:28:14 浏览次数:10 分类:技术文章

本文共 7119 字,大约阅读时间需要 23 分钟。

1. 步骤

大致分以下几步:

  1. 安装docker
  2. 基础环境准备
  3. 配置网络,并启动docker容器
  4. 配置host及ssh免密登录
  5. 安装配置hadoop
  6. 测试使用hadoop

1.1 安装docker

依次执行如下步骤安装docker。如果有docker环境的可以跳过。

yum updateyum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install -y docker-ce systemctl start dockerdocker -v

1.2 基础环境准备

1.2.1 创建基础的centos7镜像

  1. 拉取官方centos7镜像
docker pull centos
  1. 通过build Dockfile生成带ssh功能的centos镜像
  • 创建Dockerfile文件

    vi Dockerfile

    将如下内容写入Dockerfile

    FROM centosMAINTAINER mwfRUN yum install -y openssh-server sudoRUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_configRUN yum  install -y openssh-clientsRUN echo "root:qwe123" | chpasswdRUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoersRUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_keyRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_keyRUN mkdir /var/run/sshdEXPOSE 22CMD ["/usr/sbin/sshd", "-D"]

    上述内容大概意思是:以centos镜像为基础,设置密码为wqe123,安装ssh服务并启动

  • 构建Dockerfile

    docker build -t="centos7-ssh" .

    将生成一个名为centos7-ssh的镜像,可以通过docker images查看

1.2.2 生成有hadoop和jdk环境的镜像

  1. 将准备好的包放在当前目录下。hadoop-2.7.7.tar.gzjdk-8u202-linux-x64.tar.gz

  2. 通过build Dockfile生成带hadoop和jdk环境的centos镜像

    刚才已经创建了一个Dockerfile了,先将他移开。mv Dockerfile Dockerfile.bak

  • 创建Dockerfile

    vi Dockerfile

    将以下内容写入:

    FROM centos7-sshADD jdk-8u202-linux-x64.tar.gz /usr/local/RUN mv /usr/local/jdk1.8.0_202 /usr/local/jdk1.8ENV JAVA_HOME /usr/local/jdk1.8ENV PATH $JAVA_HOME/bin:$PATHADD hadoop-2.7.7.tar.gz /usr/localRUN mv /usr/local/hadoop-2.7.7 /usr/local/hadoopENV HADOOP_HOME /usr/local/hadoopENV PATH $HADOOP_HOME/bin:$PATHRUN yum install -y which sudo

    上述内容大概意思是:以上面生成的centos7-ssh为基础,将hadoop和jdk包放进去,然后配好环境变量。

  • 构建Dockerfile

    docker build -t="hadoop" .

    将生成一个名为hadoop的镜像

1.3 配置网络,并启动docker容器

因为集群间必须要能网络连通,所以要先配置好网络。

  1. 创建网络

    docker network create --driver bridge hadoop-br

    以上命令创建了一个名为hadoop-br的bridge类型的网络

  2. 启动docker时指定网络

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

    以上命令启动了3台机器,网络都指定为hadoop-br,hadoop1还开启了端口映射。

  3. 查看网络情况

    docker network inspect hadoop-br

    执行以上命令就可以看到对应的网络信息:

    [    {             "Name": "hadoop-br",        "Id": "88b7839f412a140462b87a353769e8091e92b5451c47b5c6e7b44a1879bc7c9a",        "Containers": {     "86e52eb15351114d45fdad4462cc2050c05202554849bedb8702822945268631": {                     "Name": "hadoop1",                "IPv4Address": "172.18.0.2/16",                "IPv6Address": ""            },            "9baa1ff183f557f180da2b7af8366759a0d70834f43d6b60fba2e64f340e0558": {                     "Name": "hadoop2",                "IPv4Address": "172.18.0.3/16",                "IPv6Address": ""            },  "e18a3166e965a81d28b4fe5168d1f0c3df1cb9f7e0cbe0673864779b224c8a7f": {                     "Name": "hadoop3",                "IPv4Address": "172.18.0.4/16",                "IPv6Address": ""            }        },    }]

    我们可以得知3台机器对应的ip:

    172.18.0.2 hadoop1 172.18.0.3 hadoop2 172.18.0.4 hadoop3
  4. 登录docker容器,互相之间就可以ping通了。

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

1.4 配置host及ssh免密登录

1.4.1 配置host

分别在每台修改每台机器的host

vi /etc/hosts

将以下内容写入(注:docker分出来的ip对于每个人可能不一样,填你自己的):

172.18.0.2 hadoop1 172.18.0.3 hadoop2 172.18.0.4 hadoop3

1.4.2 ssh免密登录

因为上面在镜像中已经安装了ssh服务,所以直接分别在每台机器上执行以下命令:

ssh-keygen一路回车ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1输入密码,如果按我的来得话就是qwe123ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2输入密码,如果按我的来得话就是qwe123ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop3输入密码,如果按我的来得话就是qwe123

1.4.3 测试是否配置成功

ping hadoop1 ping hadoop2ping hadoop3ssh hadoop1ssh hadoop2ssh hadoop3

1.5 安装配置hadoop

1.5.1 在hadoop1上操作

  1. 进入hadoop1

    docker exec -it hadoop1 bash
  2. 创建一些文件夹,一会在配置中要用到

    mkdir /home/hadoopmkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data
  3. 切换到hadoop配置的目录

    cd $HADOOP_HOME/etc/hadoop/
  4. 编辑core-site.xml

    fs.defaultFS
    hdfs://hadoop1:9000
    hadoop.tmp.dir
    file:/home/hadoop/tmp
    io.file.buffer.size
    131702
  5. 编辑hdfs-site.xml

    dfs.namenode.name.dir
    file:/home/hadoop/hdfs_name
    dfs.datanode.data.dir
    file:/home/hadoop/hdfs_data
    dfs.replication
    2
    dfs.namenode.secondary.http-address
    hadoop1:9001
    dfs.webhdfs.enabled
    true
  6. 编辑mapred-site.xml

    mapred-site.xml默认不存在,要执行cp mapred-site.xml.template mapred-site.xml

    mapreduce.framework.name
    yarn
    mapreduce.jobhistory.address
    hadoop1:10020
    mapreduce.jobhistory.webapp.address
    hadoop1:19888
  7. 编辑yarn-site.xml

    yarn.nodemanager.aux-services
    mapreduce_shuffle
    yarn.nodemanager.auxservices.mapreduce.shuffle.class
    org.apache.hadoop.mapred.ShuffleHandler
    yarn.resourcemanager.address
    hadoop1:8032
    yarn.resourcemanager.scheduler.address
    hadoop1:8030
    yarn.resourcemanager.resource-tracker.address
    hadoop1:8031
    yarn.resourcemanager.admin.address
    hadoop1:8033
    yarn.resourcemanager.webapp.address
    hadoop1:8088
  8. 配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh 文件的 JAVA_HOME参数

  9. 编辑slaves

    我这里把hadoop1当成主节点,hadoop2、3作为从节点

    hadoop2hadoop3
  10. 把文件拷贝到hadoop2和hadoop3上

    依次执行以下命令:

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

1.5.2 在每台机器上操作

  1. 分别连接每台机器

    docker exec -it hadoop1 bashdocker exec -it hadoop2 bashdocker exec -it hadoop3 bash
  2. 配置hadoop sbin目录的环境变量

    因为hadoop bin目录在之前创建镜像时就配好了,但是sbin目录没有配,所以要单独配置。分配为每台机器配置:

vi ~/.bashrc

追加如下内容:

export PATH=$PATH:$HADOOP_HOME/sbin

执行:

source ~/.bashrc

1.5.3 启动hadoop

在hadoop1上执行以下命令:

  1. 格式化hdfs

    hdfs namenode -format
  2. 一键启动

    start-all.sh

不出错的话,就可以庆祝一下了。出错的话,加油。

1.6 测试使用hadoop

  • jps
# hadoop11748 Jps490 NameNode846 ResourceManager686 SecondaryNameNode# hadoop2400 DataNode721 Jps509 NodeManager# hadoop3425 NodeManager316 DataNode591 Jps
  • 上传文件
hdfs dfs -mkdir /mwfecho hello > a.txthdfs dfs -put a.txt /mwfhdfs dfs -ls /mwfFound 1 itemsdrwxr-xr-x   - root supergroup          0 2020-09-04 11:14 /mwf

由于是云服务器,不想配端口,就不看ui界面了。

2. 参考

上一篇:字符串面试问题(String、StringBuilder和StringBuffer的区别)
下一篇:docker部署ambari-2.7.3(大数据集群快速搭建)

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月24日 12时32分08秒