大数据处理实验(二)基于hadoop与MapReduce的分布式编程

一、基于hadoop与MapReduce的分布式编程

在上一章中,我们使用docker构建了Hadoop的分布式环境镜像,并使用docker run命令从该镜像中部署了一主两从的三个分布式节点:master、worker01、worker02。

执行sudo docker rm命令删除容器
在这里插入图片描述

重新部署命令如下:

sudo docker run -p 8088:8088 -p 9000:9000 -v /home/ryu/Documents/hadoop/master/share:/root/share -it -h master --name master <IMAGE NAME>

sudo docker run -v /home/ryu/Documents/hadoop/worker01/share:/root/share -it -h worker01 --name worker01 <IMAGE NAME>

sudo docker run -v /home/ryu/Documents/hadoop/worker02/share:/root/share -it -h worker02 --name worker02 <IMAGE NAME>

并按照实验一进行网络配置
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在端口映射上,需要打开9000端口,方便客户端访问分布式文件系统HDFS。

另外,8088端口为Hadoop的应用程序web界面,打开后可以通过web查看应用程序与节点的状态。

通过docker run命令部署仍然稍显麻烦,下一节将介绍使用docker-compose部署容器的方法。

1.通过docker-compose部署容器

1.1安装docker-compose

查询docker版本号。

在host上执行。

sudo docker -v

根据查询到的版本号,在下列网站找到对应的docker-compose版本。

https://github.com/docker/compose/releases

这里,我们使用最新的1.25.5版本。

执行下列命令,安装docker-compose。

docker-compose为单一可执行文件,将其放到/usr/local/bin中,给予文件执行权限即可使用。

当前使用的是1.25.5版本。

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

sudo chmod +x /usr/local/bin/docker-compose

或者通过下列网址下载:

https://github.com/docker/compose/releases

1.2编写docker-compose.yml文件

docker-compose.yml将通过配置的方式代替docker run冗长的参数。

具体请参考目录下的docker-compose.yml。
根据docker-compose.yml文件部署镜像

1.3进入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 <contain id>

Q: 执行部署容器后,产生错误信息:

Pool overlaps with other one on this address space

A: 相同名称的network以及定义,通过以下命令,查询并删除同名network

sudo docker network ls

sudo docker network rm <network id>

Q: 如何删除所有已经退出的容器。

A: sudo docker container prune

2.基于JAVA的MapReduce分布式编程(完成)

检查java环境。

java -version

在这里插入图片描述

当前Hadoop的版本号为3.2.1,支持的JDK版本号为8(1.8)

JAVA编程环境所用的JDK/JRE版本号必须与Hadoop环境的JDK/JRE版本号一致。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考代码:https://github.com/hbut-edu/BigDataProcessing

2.1 Maven安装与配置(eclipse)

参考文章:
eclipse Maven安装与配置
https://blog.csdn.net/qq_43663493/article/details/104663638

2.2 将Git项目转为Maven项目(eclipse)

以下内容参考文章:
Eclipse使用之将Git项目转为Maven项目
https://blog.csdn.net/yxys01/article/details/77082431

1、打开Eclipse,File->Import
2、Git->Projects from Git

在这里插入图片描述

3、Clone URl

这里写图片描述

4、填写项目地址https://github.com/hbut-edu/BigDataProcessing

这里写图片描述

5、选择Git分支master(默认勾选即可,点击下一步)

6、选择存放地址

这里写图片描述

7、选择Import as general project

这里写图片描述

8、填写项目名

这里写图片描述

9、删掉刚刚新建的项目(只从Eclipse里面删除,不要删掉本地文件)

这里写图片描述

10、重新导入项目File->Import->Maven->Existing Maven projects

这里写图片描述

11、选择刚才从Git下载下来的项目的本地地址

这里写图片描述

成功将Git项目转化为Maven项目

在这里插入图片描述

对上述代码进行修改(ip改成自己master容器ip)
在这里插入图片描述

2.3 将maven工程打包成jar包(eclipse)

(以下内容参考文章:将maven工程打成jar包
https://blog.csdn.net/u011723409/article/details/116671296

1、eclipse中使用命令:
选中项目:右键-> Run As -> Run Configurations,

在base directory(workspace)中选中要打包的工程
Goals输入命令:clean package
点击run

在这里插入图片描述在这里插入图片描述

在项目文件夹target中可以找到生成的jar包

在这里插入图片描述

2.4将jar包从本机传到虚拟机中

参考文章:
将本机文件复制到安装的虚拟机系统中的两种方法
https://blog.csdn.net/qq_41486333/article/details/115259771
虚拟机如何使用共享文件夹传文件
https://blog.csdn.net/weixin_45205599/article/details/121214310?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_default&utm_relevant_index=1

建议安装vmware tools将JAR包传到虚拟机

安装VMware Tools按钮为灰色的解决方法
https://blog.csdn.net/qq_43203949/article/details/121728559
https://blog.csdn.net/tanbitlong/article/details/116205873

在这里插入图片描述
在这里插入图片描述
或直接拖拽主机文件至虚拟机文件夹在这里插入图片描述
在非RPC模式下,代码和数据的传递方式有所不同。
假设开发环境位于host,那么:
代码:在host环境下编译生成JAR包,需要通过共享文件夹将JAR包传到master容器内部。
数据:在host环境下的数据文件可以直接通过HDFS的API上传至HDFS内部。

数据集地址

链接:https://pan.baidu.com/s/1tkQjDlmhzEu7try6gNJgLw

密码:66pr

输入命令将jar包和数据集文件移动到共享文件夹下:

sudo mv BigDataProcessing-1.0-SNAPSHOT.jar /home/ryu/Documents/hadoop/master/share
sudo mv training_data.csv /home/ryu/Documents/hadoop/master/share

在这里插入图片描述

在master查看这两个文件

ls /root/share

在这里插入图片描述
按照实验一的步骤启动hadoop

./bin/hdfs namenode -format
./sbin/start-all.sh

在这里插入图片描述
在两个worker上用jps查看,有Datanode则代表成功
在这里插入图片描述

在hdfs新建一个 /input目录

./bin/hdfs dfs -mkdir /input

查看是否创建成功

./bin/hdfs dfs -ls /

在这里插入图片描述
将数据集csv文件放到hdfs上刚创建好的文件夹上并查看

./bin/hdfs dfs -put /root/share/training_data.csv /input
./bin/hdfs dfs -ls /input

在这里插入图片描述

2.5 运行

./bin/hadoop jar /root/share/BigDataProcessing-1.0-SNAPSHOT.jar cn.edu.hbut.bigdataprocessing.BigDataProcessing

在这里插入图片描述

结果可以在output中查看:

./bin/hdfs dfs -ls /output
./bin/hdfs dfs -cat /output/part-r-00000

在这里插入图片描述在这里插入图片描述

3.基于Hadoop Streaming与Python的MapReduce分布式编程

Hadoop MapReduce不仅可以使用JAVA进行编程。借助于标准输入输出机制(STDIN/STDOUT)与Hadoop Streaming库可以与几乎所有语言进行连接。

Python是大数据处理领域流行的编程语言,本节将介绍如何使用Python编写MapReduce算法,以及如何提交给Hadoop处理。

3.1 检查运行环境

ls ./share/hadoop/tools/hadoop-streaming-3.2.1.jar

3.2 使用Python编写MapReduce代码

参考目录:BigDataProcessingStreaming

https://github.com/hbut-edu/big-data-processing/tree/master/BigDataProcessingStreaming

在基于Hadoop Streaming的MapReduce编程中,输入为标准输入STDIN,输出为标准输出STDOUT。

3.3 执行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&A

Q:如何查看输出结果(或HDFS上的文本文件)。

A:使用cat命令。

./bin/hdfs dfs -cat /output/part-00000

Q:如何删除HDFS上的目录。

A:使用-rm -r命令。

./bin/hdfs dfs -rm -r /output*

三、实验任务:

使用Hadoop平台处理数据集,输出数据集中的异常值。

数据集地址

链接:https://pan.baidu.com/s/1tkQjDlmhzEu7try6gNJgLw

密码:66pr

数据集说明(输入)

数据集来源于某地市网络的流量数据,收集了16000+个网元167天的流量数据。

数据集格式:

横坐标为网元数,无header。

纵坐标为天数,无header。

数据中因为采集设备故障等因素有异常值发生。请使用Hadoop与MapReduce以及相关算法计算出每个网元中异常值的数量。

输出格式(以网元为单位)

网元1 10

网元2 15

网元3 9

见2.5运行模块

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值