hadoopの授業なう。いつか使ってみたいのでとりあえず実際に触ってみた。
hadoopというコマンドがあることも知らなかったし、hdfs というコマンドがあることも知らなかった
役割分担が微妙に感じた。hadoopで mkdir して、hdfsでput/delする。うーん。ディレクトリはhadoop側の管理ってことなんだろうか。directoryで分散させるわけではないだろうけど・・namespaceがなにかもまだわかってないしな
どうやら hadoop fs と hdfs dfs は同じことができるらしい。hadoopはHDFS以外のFSも後ろにもてて、S3とかlocalとかに保存するwrapper. wrapperなので、hadoop fs で操作できたりするらしい
環境作るのは、ここをそのままやっただけ
setup
たった3行で起動した
git clone git@github.com:big-data-europe/docker-hadoop.git
cd docker-hadoop
docker-compose up -d
# docker ps --format "{{.ID}} {{.Names}} {{.Image}} {{.Ports}}"
fad77bdefbd5 resourcemanager bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8 8088/tcp
d999cc5952b4 datanode bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 9864/tcp
62cdd1420e1c historyserver bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8 8188/tcp
c17fd2dc5308 nodemanager bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8 8042/tcp
04afb5007d6a namenode bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8 0.0.0.0:9000->9000/tcp, 0.0.0.0:9870->9870/tcp
UI
http://localhost:9870/ にアクセスすると、dashboard的なのが見れた。 file browserもあったけど使い方がわからなかった。
これは namenode が提供している UI のようだ。
put files
docker exec -it namenode bash
mkdir input
echo "Hello World" >input/f1.txt
echo "Hello Docker" >input/f2.txt
hadoop fs -mkdir -p input
hdfs dfs -put ./input/* input
hdfs dfs -ls input
-rw-r--r-- 3 root supergroup 12 2022-09-11 13:22 input/f1.txt
-rw-r--r-- 3 root supergroup 13 2022-09-11 13:22 input/f2.txt
特徴的なのは root の左にある 3
という数字。これは dataのcopy数を表すらしい。僕は何もしてないのに、勝手に 3 copy されているらしい。datanodeは1つなので、その中に3つずつ作られているんだろう。素敵。
hadoopに計算させる
docker container ls
wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-mapreduce-examples/2.7.1/hadoop-mapreduce-examples-2.7.1-sources.jar
docker cp ../hadoop-mapreduce-examples-2.7.1-sources.jar cb0c13085cd3:hadoop-mapreduce-examples-2.7.1-sources.jar
root@namenode:/# hadoop jar hadoop-mapreduce-examples-2.7.1-sources.jar org.apache.hadoop.examples.WordCount input output
root@namenode:/# hdfs dfs -cat output/part-r-00000
Docker 1
Hello 2
World 1
このjarの説明はここにあった
Javaがわからないので何もわからない
hadoopはmapper/reducer で処理するって前提があって、mapperでデータをクラスタから集めてきてreducerで重複除外したりする
contextってので受け渡ししてるぽい
感想
まあ、なんとなく Hiveとかなんとかとか、ecosystemと言われる周りのものが発展する気持ちはわかる感じの使い勝手だった。
localでしかやってないのに ls で3秒かかるし
root@04afb5007d6a:/# time hdfs dfs -ls input
Found 2 items
-rw-r--r-- 3 root supergroup 12 2022-09-11 13:22 input/f1.txt
-rw-r--r-- 3 root supergroup 13 2022-09-11 13:22 input/f2.txt
real 0m1.997s
user 0m2.747s
sys 0m0.360s
Javaとかのprogramから使うのが前提なのと、analytics用途なので、遅くてもいいって感じなのかな。
あと気になったのが最小data block sizeが64MBってどこかに書いてあったこと。例えばこの足して25bytesのファイル2つを取るとき、どんな通信してるんだべか。
まぁ、そのうち。