基于hadoop与MapReduce的分布式编程

基于hadoop与MapReduce的分布式编程

一、部署hadoop集群

在上一章中,我们使用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-compose部署容器(可选)

1. 安装docker-compose

  1. 查询docker版本号。
    在host上执行。
    sudo docker -v
    根据查询到的版本号,在下列网站找到对应的docker-compose版本。
    https://github.com/docker/compose/releases
    这里,我们使用最新的1.25.5版本。
  2. 执行下列命令,安装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
  3. docker-compose为单一可执行文件,将其放到/usr/local/bin中,给予文件执行权限即可使用。当前使用的是1.25.5版本。
    sudo chmod +x /usr/local/bin/docker-compose
    或者通过下列网址下载:
    https://github.com/docker/compose/releases

2. 编写docker-compose.yml文件

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 <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

三、基于JAVA的MapReduce分布式编程

  1. 检查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内部。

  2. 修改代码中的HDFSOperator.java文件中的16行:在这里插入图片描述
    将ip修改为master的ip
  3. 使用Maven工具将java代码打包
    通过IDEA可以在右侧Maven->lifecycle->clean+package:
    在这里插入图片描述 命令行方式也可以:mvn clean install -Dmaven.test.skip=true
  4. 将训练集文件——training_data.csv放入master的共享文件夹/home/ryu/Documents/hadoop/master/share
  5. 在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 在这里插入图片描述
  6. 运行:
    ./bin/hadoop jar <jar包在master本机的路径>/BigDataProcessing.jar <主类的完整包名>
    在这里插入图片描述

四、基于Hadoop Streaming与Python的MapReduce分布式编程

Hadoop MapReduce不仅可以使用JAVA进行编程。借助于标准输入输出机制(STDIN/STDOUT)与Hadoop Streaming库可以与几乎所有语言进行连接。
Python是大数据处理领域流行的编程语言,本节将介绍如何使用Python编写MapReduce算法,以及如何提交给Hadoop处理。

  1. 检查运行环境

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

  2. 使用Python编写MapReduce代码

    参考目录:BigDataProcessingStreaming
    参考网址:https://github.com/hbut-edu/big-data-processing/tree/master/BigDataProcessingStreaming

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

  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*

六、实验任务:

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

2. 数据集地址

链接:https://pan.baidu.com/s/1tkQjDlmhzEu7try6gNJgLw 密码:66pr

3. 数据集说明(输入)

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

数据集格式:
横坐标为网元数,无header。
纵坐标为天数,无header。

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

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

网元1 10
网元2 15
网元3 9
...

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45795947/article/details/124282479