hadoopを初めて触ってみただけの記録

hadoopの授業なう。いつか使ってみたいのでとりあえず実際に触ってみた。
hadoopというコマンドがあることも知らなかったし、hdfs というコマンドがあることも知らなかった

~~役割分担が微妙に感じた。hadoopで mkdir して、hdfsでput/delする。うーん。ディレクトリはhadoop側の管理ってことなんだろうか。directoryで分散させるわけではないだろうけど・・namespaceがなにかもまだわかってないしな~~
どうやら hadoop fs と hdfs dfs は同じことができるらしい。hadoopはHDFS以外のFSも後ろにもてて、S3とかlocalとかに保存するwrapper. wrapperなので、hadoop fs で操作できたりするらしい


環境作るのは、ここをそのままやっただけ

https://shortcut.com/developer-how-to/how-to-set-up-a-hadoop-cluster-in-docker

# setup 

たった３行で起動した

```rb
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 のようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/e701269b-1bdc-e752-2464-ebc217149661.png)


# put files
```rb
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は１つなので、その中に3つずつ作られているんだろう。素敵。


# hadoopに計算させる

```rb
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の説明はここにあった

https://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html

Javaがわからないので何もわからない

hadoopはmapper/reducer で処理するって前提があって、mapperでデータをクラスタから集めてきてreducerで重複除外したりする

contextってので受け渡ししてるぽい



感想



まあ、なんとなく Hiveとかなんとかとか、ecosystemと言われる周りのものが発展する気持ちはわかる感じの使い勝手だった。

localでしかやってないのに ls で３秒かかるし

```rb
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のファイル２つを取るとき、どんな通信してるんだべか。

まぁ、そのうち。