6 个步骤,教你在Ubuntu虚拟机环境下,用Docker自带的DNS配置Hadoop | 附代码-程序员宅基地

作者 | 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就是图神经网络?
脱单?撒狗粮?加班?女神节这么过 | 程序员有话说
真香,朕在看了!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/FL63Zv9Zou86950w/article/details/104681415

智能推荐

数据库Mysql+SSM技术开发,SSM 泰州市二手房交易平台系统--03401(上万套实战教程手把手教学,免费领取源码)-程序员宅基地

文章浏览阅读162次。关注●点赞收藏并私信博主,免费领取项目源码哦~总体设计主要包括系统总体结构设计、系统数据结构设计、系统功能设计和系统安全设计等;详细设计主要包括模块实现的关键代码,系统数据库访问和主要功能模块的具体实现等。最后对系统进行功能测试,并对测试结果进行分析总结,及时改进系统中存在的不足,为以后的系统维护提供了方便,也为今后开发类似系统提供了借鉴和帮助。

【部署网站】使用nginx+tomcat部署博客网站_用nignx发布网站和用tomcat部署-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏16次。一、什么是静态网站、动态网站?静态网站没有采用任何程序开发,是纯粹使用html语言写出的网站,网页文件名以html或htm结尾。原则上不会受到攻击入侵,但是也无法在网络上实时更新内容,就纯粹的是制作好的页面。动态网站目前的主要开发语言有ASP,JSP,PHP,ASP.NET在制作好之后,都有一个网站管理后台,当以管理员身份登陆时,可以对网站的内容进行增删操作,直接在网上进行这些操作,虽然它可以随时更新,但是速度较慢。并且需要区分的是,动态网站的动态指的是动态实时更新而非网站有动态画面。区分静态网站和动_用nignx发布网站和用tomcat部署

android 实现定时任务,Android 实现定时任务的五种方式的讲解-程序员宅基地

文章浏览阅读3.9k次。1、普通线程sleep的方式,可用于一般的轮询Pollingnew Thread(new Runnable() { @Override public void run() { while (true) { //todo ..._android 定时20个小时

Dr_can模型预测控制笔记与代码实现-程序员宅基地

文章浏览阅读2.7w次,点赞206次,收藏552次。因而我们引入模型预测控制(Model PredictiveControl)的概念,对于一般的离散化系统(因为实际计算机实现的控制系统都是离散的系统,连续系统离散化的方法在此不述)。在k时刻,我们可以测量或估计出系统的当前状态y(k),再通过计算得到的u(k),u(k+1),u(k+2)...u(k+j)得到系统未来状态的估计值y(k+1),y(k+2)...y(k+j);我们将预测估计的部分称为预测区间(Predictive Horizon),将控制估计的部分称为控制区间(Control Horizon)_dr_can

由浅入深!小程序FMP优化实录,已拿offer入职_小程序fmp是指的什么(1)-程序员宅基地

文章浏览阅读569次,点赞25次,收藏12次。其实很简单就下面这张图,含概了Android所有需要学的知识点,一共8大板块:架构师筑基必备技能Android框架体系架构(高级UI+FrameWork源码)360°Androidapp全方位性能调优设计思想解读开源框架NDK模块开发移动架构师专题项目实战环节移动架构师不可不学习微信小程序混合开发的flutterAndroid学习的资料我呢,把上面八大板块的分支都系统的做了一份学习系统的资料和视频,大概就下面这些,我就不全部写出来了,不然太长了影响大家的阅读。

计算带余除法(四种方法)_带余除法怎么写编程-程序员宅基地

文章浏览阅读387次,点赞12次,收藏4次。给定两个整数a和b (0 < a,b < 10,000),计算a除以b的整数商和余数。一行,包括两个整数a和b,依次为被除数和除数(不为零),中间用空格隔开。一行,包含两个整数,依次为整数商和余数,中间用一个空格隔开。示例:输入:15 2,输出:7 1_带余除法怎么写编程

随便推点

数字化转型背景下的金融交易业务中台实践-程序员宅基地

文章浏览阅读140次。引言:目前金融业IT系统大多由业务部门或渠道进行竖井式建设,这种模式的好处是系统专业性强,但同时也给运营及IT管理部门带来分散性阵痛。那么如何在强监管与统一风控的形势下,实现统一管控、快速响应、应需而变、按期交付?中台架构就是在这种背景下应运而生。本文主要以某城商行基于BIIP实施的交易中台的实践案例展开分享,一起和大家探讨企业数字化转型中的背景、技术..._运营转型 业务中台

AWG标准_awg官方规范-程序员宅基地

文章浏览阅读1.5k次。AWG 直径 面积 铜阻抗 (inch) (mm) (kcmil) (mm²) (Ω/km) (Ω/kFT) 0000 (4/0) 0.46 11.684 212 107 0.1608 0.04901 000 (3/0) 0.4096 10.404 168 85 0.202..._awg官方规范

图像修复论文Residual Non-local Attention Networks for Image Restoration阅读笔记-程序员宅基地

文章浏览阅读2.8k次。论文来源:ICLR2019论文链接:pdf (openreview.net)_residual non-local attention networks for image restoration

表达式计算。问题描述:编写程序,计算并输出如下表达式的值:y=其中a,x,y均为float类型,取值为3.1415926。输出结果要求保留小数点后3位。_serialprintln(a)的结果为-程序员宅基地

文章浏览阅读153次。【代码】表达式计算。问题描述:编写程序,计算并输出如下表达式的值:y=其中a,x,y均为float类型,取值为3.1415926。输出结果要求保留小数点后3位。_serialprintln(a)的结果为

android 自定义Toast 吐司-程序员宅基地

文章浏览阅读274次,点赞3次,收藏8次。【Android 详细知识点思维脑图(技能树)】其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

FP-Growth算法之FP-tree的构造(python)_利用fpgrowth算法对其构造一个fptree,树的最大高度-程序员宅基地

文章浏览阅读7.4k次。前言:关于 FP-Growth 算法介绍请见:FP-Growth算法的介绍。 本文主要介绍 FP-tree 的构造算法,关于伪代码请查看上面的文章。上接:FP-Growth算法python实现;下接:FP-Growth算法之频繁项集的挖掘(python)。 正文:tree_builder.py\color{aqua}{tree\_builder.py}文件:#coding=utf-8import_利用fpgrowth算法对其构造一个fptree,树的最大高度