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をインストールします
- Dockerのバージョン番号を照会します。
ホストで実行します。
sudo docker -v
照会されたバージョン番号に従って、次のWebサイトで対応する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
または、次の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分散プログラミング
- 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に直接アップロードできます。
- コード内のHDFSOperator.javaファイルの16行目を変更します。IP
をマスターのIPに変更します。 - Mavenツールを使用し
て、右側のIDEAを介してJavaコードをパッケージ化しMaven->lifecycle->clean+package
ます。
コマンドラインメソッドも使用できます。mvn clean install -Dmaven.test.skip=true
- トレーニングセットファイル
training_data.csv
をマスターの共有フォルダーに入れます/home/ryu/Documents/hadoop/master/share
- マスターコンソールで、次のコマンドを使用して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
- 走る:
./bin/hadoop jar <jar包在master本机的路径>/BigDataProcessing.jar <主类的完整包名>
4.HadoopストリーミングとPythonに基づくMapReduce分散プログラミング
Hadoop MapReduceは、JAVAを使用してプログラムするだけではありません。標準入出力メカニズム(STDIN / STDOUT)とHadoopストリーミングライブラリを使用すると、ほとんどすべての言語を接続できます。
Pythonは、ビッグデータ処理の分野で人気のあるプログラミング言語です。このセクションでは、Pythonを使用してMapReduceアルゴリズムを作成する方法と、処理のためにそれらをHadoopに送信する方法を紹介します。
-
動作環境を確認してください
ls ./share/hadoop/tools/hadoop-streaming-3.2.1.jar
-
PythonでのMapReduceコードの記述
参照ディレクトリ:
BigDataProcessingStreaming
参照URL:https://github.com/hbut-edu/big-data-processing/tree/master/BigDataProcessingStreaming
Hadoopストリーミングに基づく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ストリーミングを使用する場合は、Pythonコードも事前に共有フォルダーを介してマスターにアップロードする必要があることに注意してください。
この例では、
-files
アップロードされたファイルのパスはパラメーターで指定されています。hdfs dfs -put
JAVAとは異なり、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
...