使用docker进行部署hadoop

安装docker

wget -qO- https://get.docker.com/ | sh

安装完成后,要启动docker服务

sudo service docker start

查看是否运行成功

ps -aux | grep docker

也可以看看docker里面有什么

sudo docker ps

预处理,为安装hadoop做必要准备

DNS解析

域名虽然更易被用户所接受和使用,但计算机只能识别纯数字构成的IP地址,不能直接读取域名。因此要想达到访问效果,就需要将域名翻译成IP地址。而DNS域名解析承担的就是这种翻译效果。[1]

sudo docker network create --driver=bridge hadoop

以上命令创建了一个名为 Hadoop 的虚拟桥接网络,该虚拟网络内部提供了自动的DNS解析服务。

桥接:就是把一台机器上的若干个网络接口连接起来,其结果是其中一个网卡收到的报文会被复制给其他网卡发送出去。以使得网口之间的报文能够互相转发

查看docker中的网络

sudo docker network ls

下载ubuntu镜像

sudo docker pull ubuntu:16.04
#这里指定了版本为16.04,默认为最新版
#常用的docker命令

#查看已经下载的镜像
sudo docker image ls

#启动docker
sudo docker run -it ubuntu:16.04 /bin/bash

#推出容器
exit

#启动一个状态是退出的容器
sudo docker start ID

#关闭一个容器
sudo docker stop ID

安装JAVA 和 Scala

注:java要安装1.8版本

在这里最好先安装vim,

apt install vim
  • 修改image中apt的源
#备份源
cp /etc/apt/sources.list /etc/apt/sources_init.list

#删除源
rm /etc/apt/sources.list
#阿里源,将下面内容写进sources.list中,并且使用apt update 更新
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
  • 安装JDK
apt install openjdk-8-jdk
#亲测需要五分钟左右,也可能是我的网慢
  • 查看结果
java -version
  • 安装scala
apt install scala

注:这里如果出现docker网络不能用,就重启一下试试,重启docker,

夜俱麼侄般瑟怯蘇冥呼瑟罰悉闍缽者缽迦麼諳室能寫切跋都舍侄曰缽爍皤諸夜罰竟侄咒皤心他依諳栗呐僧冥豆提

安装hadoop

  • 安装一个网络工具
apt install net-tools
  • 安装 SSH,并配置免密登录,由于后面的容器之间是由一个镜像启动的,就像同一个磨具出来的 5 把锁与钥匙,可以互相开锁。所以在当前容器里配置 SSH 自身免密登录就 OK 了。
#安装ssh
apt-get install openssh-server

#安装ssh客户端
apt-get install openssh-client

#在用户根目录下生成密钥,一路enter就可
ssh-keygen -t rsa -P ""

#将公钥追加到 authorized_keys 文件中
cat .ssh/id_rsa.pub >> .ssh/authorized_keys

#启动ssh
service ssh start

#试试自己登陆自己
ssh 127.0.0.1

#修改 .bashrc 文件,启动 shell 的时候,自动启动 SSH 服务,在最后一行加上
service ssh start
  • 下载hadoop
#下载好hadoop
docker cp 本地文件路径 ID全称:容器路径
#就可
#解压
tar -zxvf hadoop-3.2.0.tar.gz -C /usr/local/

cd /usr/local/
mv hadoop-3.2.0 hadoop
  • 修改 /etc/profile 文件,添加一下环境变量到文件中
#java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre    
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib    
export PATH=${JAVA_HOME}/bin:$PATH
#hadoop
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_COMMON_HOME=$HADOOP_HOME 
export HADOOP_HDFS_HOME=$HADOOP_HOME 
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME 
export HADOOP_INSTALL=$HADOOP_HOME 
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native 
export HADOOP_CONF_DIR=$HADOOP_HOME 
export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec 
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
export HDFS_DATANODE_USER=root
export HDFS_DATANODE_SECURE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_NAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
#使环境变量生效
source /etc/profile
  • 在目录 /usr/local/hadoop/etc/hadoop
#修改 hadoop-env.sh 文件,在文件末尾添加一下信息

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

修改 core-site.xml,修改为

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://h01:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop3/hadoop/tmp</value>
    </property>
</configuration>

修改 hdfs-site.xml,修改为

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop3/hadoop/hdfs/name</value>
    </property>
    <property>
        <name>dfs.namenode.data.dir</name>
        <value>/home/hadoop3/hadoop/hdfs/data</value>
    </property>
</configuration>

修改 mapred-site.xml,修改为

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>
            /usr/local/hadoop/etc/hadoop,
            /usr/local/hadoop/share/hadoop/common/*,
            /usr/local/hadoop/share/hadoop/common/lib/*,
            /usr/local/hadoop/share/hadoop/hdfs/*,
            /usr/local/hadoop/share/hadoop/hdfs/lib/*,
            /usr/local/hadoop/share/hadoop/mapreduce/*,
            /usr/local/hadoop/share/hadoop/mapreduce/lib/*,
            /usr/local/hadoop/share/hadoop/yarn/*,
            /usr/local/hadoop/share/hadoop/yarn/lib/*
        </value>
    </property>
</configuration>

修改 yarn-site.xml,修改为

<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>h01</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

修改 workers为

h01
h02
h03
h04
h05

此时,hadoop已经配置好了

测试

先将当前容器导出为镜像,并查看当前镜像

sudo docker commit -m "haddop" -a "hadoop" ID newuhadoop

启动 5 个终端,分别执行这几个命令

第一条命令启动的是 h01 是做 master 节点的,所以暴露了端口,以供访问 web 页面

sudo docker run -it --network hadoop -h "h01" --name "h01" -p 9870:9870 -p 8088:8088 newuhadoop /bin/bash

其余的四条命令就是几乎一样的了

sudo docker run -it --network hadoop -h "h02" --name "h02" newuhadoop /bin/bash


sudo docker run -it --network hadoop -h "h03" --name "h03" newuhadoop /bin/bash

sudo docker run -it --network hadoop -h "h04" --name "h04" newuhadoop /bin/bash

sudo docker run -it --network hadoop -h "h05" --name "h05" newuhadoop /bin/bash

接下来,在 h01 主机中,启动 Haddop 集群

先进行格式化操作

root@h01:/usr/local/hadoop/bin# ./hadoop namenode -format

进入 hadoop 的 sbin 目录

root@h01:/# cd /usr/local/hadoop/sbin/
root@h01:/usr/local/hadoop/sbin#

启动

root@h01:/usr/local/hadoop/sbin# ./start-all.sh

访问本机的 8088 与 9870 端口就可以看到监控信息了

Hadoop 集群已经构建好了

2.2.5 运行内置WordCount例子

把license作为需要统计的文件

把license作为需要统计的文件

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

在 HDFS 中创建 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 文件夹里的内容

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#

运作 wordcount 例子程序

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RgdsF94Z-1666679275670)(/home/ai/.config/Typora/typora-user-images/image-20221025140731183.png)]