在上一章中,我们使用docker构建了Hadoop的分布式环境镜像,并使用docker run
命令从该镜像中部署了一主两从的三个分布式节点:master、worker01、worker02。
这里再次根据之前配置好的镜像部署三台新的容器,命令如下:
/*
格式:
sudo docker run -p <本机端口>:<容器要映射的端口> -v <本机目录路径>:<容器目录路径> -it -h <容器的主机名> --name <容器名> <所依赖的镜像名>
*/
sudo docker run -p 8088:8088 -p 9000:9000 -v /home/ryu/Documents/hadoop/master/share:/root/share -it -h master --name master mech2who/ubuntu_hadoop:
sudo docker run -v /home/ryu/Documents/hadoop/worker01/share:/root/share -it -h worker01 --name worker01 ubuntu/hadoop_3.2.1_cluster_tested
sudo docker run -v /home/ryu/Documents/hadoop/worker02/share:/root/share -it -h worker02 --name worker02 ubuntu/hadoop_3.2.1_cluster_tested
在端口映射上,需要打开9000
端口,方便客户端访问分布式文件系统HDFS。
另外,8088
端口为Hadoop的应用程序web界面,打开后可以通过web查看应用程序与节点的状态。
- 查询docker版本号。
在host上执行。
sudo docker -v
根据查询到的版本号,在下列网站找到对应的docker-compose版本。
https://github.com/docker/compose/releases
这里,我们使用最新的1.25.5版本。 - 执行下列命令,安装docker-compose。
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- docker-compose为单一可执行文件,将其放到
/usr/local/bin
中,给予文件执行权限即可使用。当前使用的是1.25.5版本。
sudo chmod +x /usr/local/bin/docker-compose
或者通过下列网址下载:
https://github.com/docker/compose/releases
docker-compose.yml将通过配置的方式代替docker run
冗长的参数。
具体请参考目录下的docker-compose.yml。
# 文件格式版本号
# 通过 https://docs.docker.com/compose/compose-file/ 网站获取对应文件格式版本
version: "3.8"
services:
# 配置master容器的参数
master:
# 设定使用的镜像
image: ubuntu/hadoop_3.2.1_cluster_tested
# 设定端口映射
ports:
- "8088:8088" # web应用程序状态查看界面
- "9000:9000" # HDFS文件系统端口
- "50071:50070"
# 设定挂载的卷共享,通过该设置,可以在host与容器之间共享数据
volumes:
- /home/ryu/Documents/hadoop/master/share:/root/share
# 主机名
hostname: master
#容器名
container_name: master
# 依赖关系。如此设定后,master会在worker01与worker02启动之后再启动。
# 通过定义依赖关系,可以自定义容器的启动顺序。
# 无法循环依赖。
links:
- worker01
- worker02
# 设定让容器持续运行
tty: true
# 网络配置
networks:
#此为自定义网络的名称,自定义网络的配置在文件的末尾
hadoop_network:
# 为master分配静态ip
# 目的是为了自动配置/etc/hosts
ipv4_address: 172.19.0.3
# 将worker01与worker02的静态ip加入/etc/hosts中。
extra_hosts:
- "worker01:172.19.0.4"
- "worker02:172.19.0.5"
# 配置worker01容器的参数
worker01:
image: ubuntu/hadoop_3.2.1_cluster_tested
volumes:
- /home/ryu/Documents/hadoop/worker01/share:/root/share
ports:
- "50071:50070"
hostname: worker01
container_name: worker01
tty: true
networks:
hadoop_network:
ipv4_address: 172.19.0.4
extra_hosts:
- "master:172.19.0.3"
- "worker02:172.19.0.5"
# 配置worker02容器的参数
worker02:
image: ubuntu/hadoop_3.2.1_cluster_tested
ports:
- "50072:50070"
volumes:
- /home/ryu/Documents/hadoop/worker02/share:/root/share
hostname: worker02
container_name: worker02
tty: true
networks:
hadoop_network:
ipv4_address: 172.19.0.5
extra_hosts:
- "master:172.19.0.3"
- "worker01:172.19.0.4"
# 自定义网络配置
networks:
hadoop_network:
ipam:
config:
# 设定网关与掩码
- subnet: 172.19.0.0/16
3. 根据docker-compose.yml文件部署镜像
进入docker-compose.yml的目录。
sudo docker-compose up -d
通过docker exec命令可以进入启动容器的交互界面。
sudo docker exec -it master bash
sudo docker exec -it worker01 bash
sudo docker exec -it worker02 bash
再次部署容器时,必须删除上一次部署的容器(container)与网络(network)。
在删除容器之前,需要先停止容器。
sudo docker stop
Q: 执行部署容器后,产生错误信息:
Pool overlaps with other one on this address space
A: 相同名称的network以及定义,通过以下命令,查询并删除同名network
sudo docker network ls
sudo docker network rm
Q: 如何删除所有已经退出的容器。
A: sudo docker container prune
三、基于JAVA的MapReduce分布式编程- 检查java环境。
java -version
当前Hadoop的版本号为3.2.1
,支持的JDK版本号为8(1.8)
。JAVA编程环境所用的JDK/JRE版本号必须与Hadoop环境的JDK/JRE版本号一致。
这里使用IDEA作为开发环境。
参考代码:https://github.com/hbut-edu/BigDataProcessing
在非RPC模式下,代码和数据的传递方式有所不同。假设开发环境位于host,那么:
代码:在host环境下编译生成JAR包,需要通过共享文件夹将JAR包传到master容器内部。
数据:在host环境下的数据文件可以直接通过HDFS的API上传至HDFS内部。
- 修改代码中的HDFSOperator.java文件中的16行:
将ip修改为master的ip - 使用Maven工具将java代码打包
通过IDEA可以在右侧Maven->lifecycle->clean+package
:
命令行方式也可以:mvn clean install -Dmaven.test.skip=true
- 将训练集文件——
training_data.csv
放入master的共享文件夹/home/ryu/Documents/hadoop/master/share
- 在master控制台,通过以下命令在HDFS上创建输入目录
./bin/hadoop fs -mkdir /input
6. 在master控制台,通过以下命令将数据文件放入HDFS
cd /usr/local/hadoop-3.3.2
./bin/hadoop fs -put /root/share/training_data.csv /input
- 运行:
./bin/hadoop jar
/BigDataProcessing.jar <主类的完整包名>
Hadoop MapReduce不仅可以使用JAVA进行编程。借助于标准输入输出机制(STDIN/STDOUT)与Hadoop Streaming库可以与几乎所有语言进行连接。
Python是大数据处理领域流行的编程语言,本节将介绍如何使用Python编写MapReduce算法,以及如何提交给Hadoop处理。
-
检查运行环境
ls ./share/hadoop/tools/hadoop-streaming-3.2.1.jar
-
使用Python编写MapReduce代码
参考目录:
BigDataProcessingStreaming
参考网址:https://github.com/hbut-edu/big-data-processing/tree/master/BigDataProcessingStreaming
在基于Hadoop Streaming的MapReduce编程中,输入为标准输入STDIN,输出为标准输出STDOUT。
-
执行MapReduce
./bin/hadoop jar ./share/hadoop/tools/lib/hadoop-streaming-3.2.1.jar \ -files /root/share/BigDataProcessingStreaming/mapper.py,/root/share/BigDataProcessingStreaming/reducer.py \ -input "/input/training_data.csv" \ -output "/output" \ -mapper "python3 mapper.py" \ -reducer "python3 reducer.py"
说明:
和JAVA一样,在使用Hadoop Streaming的时候请注意python代码同样需要事先通过共享文件夹上传到master内部。
示例中,通过
-files
参数指定上传的文件路径。和JAVA不同的是,Hadoop Streaming不能对HDFS直接通讯,所以需要事先通过
hdfs dfs -put
命令将数据文件上传到HDFS内部。-mapper
和-reducer
参数用于指定执行任务时候的bash命令。在执行前,可以先检查一下python解释器命令。这里为
python3
。
Q:如何查看输出结果(或HDFS上的文本文件)。
A:使用cat
命令。
./bin/hdfs dfs -cat /output/part-00000
Q:如何删除HDFS上的目录。
A:使用-rm -r
命令。
./bin/hdfs dfs -rm -r /output*
链接:https://pan.baidu.com/s/1tkQjDlmhzEu7try6gNJgLw
密码:66pr
数据集来源于某地市网络的流量数据,收集了16000+个网元167天的流量数据。
数据集格式:
横坐标为网元数,无header。
纵坐标为天数,无header。
数据中因为采集设备故障等因素有异常值发生。请使用Hadoop与MapReduce以及相关算法计算出每个网元中异常值的数量。
4. 输出格式(以网元为单位)网元1 10
网元2 15
网元3 9
...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)