hadoopとMapReduceに基づく分散プログラミング

hadoopとMapReduceに基づく分散プログラミング

1.Hadoopクラスターをデプロイします

前の章では、dockerを使用してHadoopの分散環境イメージを構築し、docker runコマンドを使用して、イメージから1つのマスターと2つのスレーブ(master、worker01、worker02)を持つ3つの分散ノードをデプロイしました。

ここでも、以前に構成されたイメージに基づいて3つの新しいコンテナーがデプロイされます。コマンドは次のとおりです。

/*
格式:
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を介してアプリケーションとノードのステータスを表示できます。

2. docker-composeを介してコンテナーをデプロイします(オプション)

1.docker-composeをインストールします

  1. Dockerのバージョン番号を照会します。
    ホストで実行します。
    sudo docker -v
    照会されたバージョン番号に従って、次のWebサイトで対応する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
    または、次のURLからダウンロードします。
    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

コンテナを再度デプロイする場合は、前回デプロイしたコンテナとネットワークを削除する必要があります。
コンテナを削除する前に、コンテナを停止する必要があります。
sudo docker stop <contain id>
Q:デプロイメントコンテナを実行した後、エラーメッセージが生成されます
Pool overlaps with other one on this address space
。A:同じ名前とその定義を持つネットワーク。次のコマンドを使用して、同じ名前のネットワークをクエリして削除します。

sudo docker network ls
sudo docker network rm <network id>

Q:終了したすべてのコンテナーを削除するにはどうすればよいですか。

A:sudodockerコンテナプルーン

3.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モードでは、コードとデータの受け渡しが異なります。

    開発環境がホスト上にあると仮定すると、次のようになります。

    コード:ホスト環境でJARパッケージをコンパイルおよび生成するには、共有フォルダーを介してJARパッケージをマスターコンテナーに転送する必要があります。

    データ:ホスト環境のデータファイルは、HDFSAPIを介してHDFSに直接アップロードできます。

  2. コード内のHDFSOperator.javaファイルの16行目を変更します。IPここに画像の説明を挿入
    をマスターのIPに変更します。
  3. Mavenツールを使用し
    て、右側のIDEAを介してJavaコードをパッケージ化しMaven->lifecycle->clean+packageます。
    ここに画像の説明を挿入コマンドラインメソッドも使用できます。mvn clean install -Dmaven.test.skip=true
  4. トレーニングセットファイルtraining_data.csvをマスターの共有フォルダーに入れます/home/ryu/Documents/hadoop/master/share
  5. マスターコンソールで、次のコマンドを使用してHDFSに入力ディレクトリを作成します。6
    ./bin/hadoop fs -mkdir /input ここに画像の説明を挿入。マスターコンソールで、次のコマンドを使用してデータファイルを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 <主类的完整包名>
    ここに画像の説明を挿入

4.HadoopストリーミングとPythonに基づくMapReduce分散プログラミング

Hadoop MapReduceは、JAVAを使用してプログラムするだけではありません。標準入出力メカニズム(STDIN / STDOUT)とHadoopストリーミングライブラリを使用すると、ほとんどすべての言語を接続できます。
Pythonは、ビッグデータ処理の分野で人気のあるプログラミング言語です。このセクションでは、Pythonを使用してMapReduceアルゴリズムを作成する方法と、処理のためにそれらをHadoopに送信する方法を紹介します。

  1. 動作環境を確認してください

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

  2. PythonでのMapReduceコードの記述

    参照ディレクトリ:BigDataProcessingStreaming
    参照URL:https://github.com/hbut-edu/big-data-processing/tree/master/BigDataProcessingStreaming

    Hadoopストリーミングに基づく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ストリーミングを使用する場合は、Pythonコードも事前に共有フォルダーを介してマスターにアップロードする必要があることに注意してください。

    この例では、-filesアップロードされたファイルのパスはパラメーターで指定されています。

    hdfs dfs -putJAVAとは異なり、HadoopストリーミングはHDFSと直接通信できないため、事前にコマンドを使用してデータファイルをHDFSにアップロードする必要があります。

    -mapperおよび-reducerパラメーターは、タスクの実行時にbashコマンドを指定するために使用されます。

    実行する前に、pythonインタープリターコマンドを確認できます。ここでpython3

5. Q&A

Q:出力結果(またはHDFSのテキストファイル)を表示する方法。

A:catコマンドを使用してください。

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

Q:HDFSのディレクトリを削除するにはどうすればよいですか。

A:-rm -rコマンドを使用してください。
./bin/hdfs dfs -rm -r /output*

6.実験的タスク:

1. Hadoopプラットフォームを使用してデータセットを処理し、データセットに外れ値を出力します。

2.データセットアドレス

リンク:https://pan.baidu.com/s/1tkQjDlmhzEu7try6gNJgLwパスワード:66pr

3.データセットの説明(入力)

データセットは、特定の都市のネットワークのトラフィックデータから取得され、167日間の16,000以上のネットワーク要素のトラフィックデータが収集されます。

データセット形式:
横軸は、ヘッダーなしのネットワーク要素の数です。
縦座標は、ヘッダーなしの日数です。

取得機器の故障などにより、データに異常値があります。Hadoop、MapReduce、および関連するアルゴリズムを使用して、各ネットワーク要素の外れ値の数を計算してください。

4.出力フォーマット(NE)

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

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_45795947/article/details/124282479