ぴょんぴょんブログ

Hadoop 入門してみた

記事の投稿が遅れてしましましたが、この記事は、あくあたん工房2021 GWアドベントカレンダー3日目の記事です。 他の記事もぜひ読んでみてください。

最近Hadoopについての話を聞いたので、ちょっと入門してみようと思いました。 Hadoopのざっくりとした理解とHello World程度のお試しをしました。

Hadoopとは?

分散処理フレームワークHadoop MapReduce分散ファイルシステムHDFS(Hadoop Distributed File System)から構成されているオープンソースミドルウェアです。 元々Googleが論文として出してい分散処理技術をオープンソースで実装したものだそうです。

Hadoopがどういうものか知るなら下の2つが詳しいと思います。

oss.nttdata.com www.casleyconsulting.co.jp

分散処理の歴史について書かれていて普通に読み物として面白かったです。 logmi.jp

MapReduce

MapReduceは、mapフェーズ、shuffleフェーズ、reduceフェーズからなっています。

  • mapフェーズ:入力データにユーザ定義の処理を行いをkey・valueの形式にする
  • shuffleフェーズ:keyごとにデータを集約
  • reduceフェーズ:集約されたデータに対してユーザ定義の処理を実行

mapフェーズ、reduceの処理をMapper、Reducerという2つのスクリプトで作成するだけで分散処理を実装できます。

HDFS

HDFSは、NameNodeとDataNodeで構成されています。

  • NameNode:システムのメタ情報の管理
  • DataNode:データの実体の保存

データを分割し、複数のDataNodeに保存することで、読み書き速度の高速化、冗長化をしています。 通信コストを下げるために、できるだけデータのあるサーバで処理も行うようです。

お試し

分散処理のフレームワークですが、今回はスタンドアロンモードでサンプルとして実装されているものを動かしてみます。

まず導入ですが、brewでインストールできたり有志の方?が作っているdockerイメージがあったりします。

# brew
brew install hadoop
hadoop version

# docker
docker pull sequenceiq/hadoop-docker
docker run -it sequenceiq/hadoop-docker /etc/bootstrap.sh -bash
cd $HADOOP_PREFIX # HADOOP_PREFIX = /usr/local/hadoop
bin/hadoop version # dockerでは$HADOOP_PREFIX下でbin/hadoopで実行

2021/5/3現在ではbrewでは3.3.0、dockerでは2.7.1と表示されます。 dockerイメージの方は5年ほど更新されていないようなのでbrewが使える環境であれば3.3.0をインストールしてもいいかもしれないですが、お試しだけなのでどちらも大差ないと思います。

Hadoopにはサンプルが用意されているのでそれを実行してみます。 サンプルでできることはAzureのドキュメントにありました。 抜粋すると\piを計算したり(pi)、単語をカウントしたり(wordcaount)、正規表現の一致をカウントしたり(count)できるそうです。 ここからは、brewでインストールしたHadoopでの記述になります。 wordcaountを試してみます。

# 入力ファイルの作成
mkdir input
echo "Hello World Hello Hadoop" > input/sample.txt

# 実行
hadoop jar /usr/local/Cellar/hadoop/3.3.0/libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount input output

# 出力確認
cat output/part-r-00000
# 出力
# Hadoop 1
# Hello 2
# World 1

無事単語数が数えられているのが確認できました。 inputに複数ファイル用意すると複数ファイルの単語数の合計が出力されます outputがすでに存在しているとエラーが出るので再度実行するときはoutput以下を削除してください。

Hadoopの簡単なコマンド説明は下の記事にありました。 また、Mapper、Reducerを自分が使いやすい言語で記述できるhadoop-streamingについて説明されています。 qiita.com blog.amedama.jp

今回はできませんでしたが、Hadoopには疑似分散モードと完全分散モードがあります。 www.atmarkit.co.jp

この記事では分散処理の要素はどこだって気がするのですが、分散モードで実行してもHadoopがいい感じにしてくれて、スタンドアロンモードと同じように入出力を得られるってことなんだと思います。

感想

Hadoopは日本語の文献が少なかったり、どの情報が最新のものかわかりづらい気がしました(検索能力不足かも)。 今から分散処理について学ぶなら最近の情報が多いKubernetesの方がいい気がしますが、具体的にどこが違っててそれぞれどういう利点があるかまで理解できていないので、更に分散処理について更に深堀りするなら何を勉強すればいいのか分からなくなってしまいました。 こういうのが勉強すればいいというのがあれば、ぜひ教えて下さい。