Hadoopエコシステム周辺について

Hadoopは大規模データの分散処理を支えるオープンソースのソフトウェアフレームワークとして知られていますが、それだけで完結するという訳ではなく他のソフトウェアと連携して利用する必要があったりして初めてHadoopに触れる人などは把握しづらいと思われますので、わかる範囲でHadoopエコシステムとその周辺で使われている技術についてまとめてみたいと思います。

Hadoop

大規模分散処理の基盤として使われているソフトウェアです。Hadoopの機能は分散ファイルシステム(Hadoop Distributed File System)と分散処理基盤(YARN)の2つの機能に分けることができます。

Hadoop Distributed File System(HDFS)

HDFS分散ファイルシステムになりましてブロック単位でファイルを管理しデフォルトでは3ブロックのレプリケーションを作成します。データを保存するサーバではDataNodesのプロセスを動かす必要がありまして、ブロックの保存先を参照するにはNameNodeのプロセスを動かす必要があります。だいたいMasterサーバでNameNodeを動かしてSlaveサーバでDataNodeのプロセスを動かすことが多いかと思います。

Yet Another Resource Negotiator(YARN)

Hadoopの2.2以降で使われているリソース管理、ジョブスケジューリングです。2.2までのHadoopではリソース管理、ジョブスケジューリングとしてMapReduce Version 1が使われていたのですが、ノードとタスクの数が増えるとスケールアウトしないという問題があったのでYARNではそれが修正されています。YARNとMapReduce Version1でどこが違うのかと言いますと、まずMapReduce Version1ではJobTrackerと呼ばれる単一のマスター・プロセスが、クラスターのリソースを管理し、全てのジョブの実行順序の調整まで行います。リソースの管理とジョブの実行順序管理の2つをJobTrackerでまとめて実行する場合スケールアウトできなくなるのでYARNではリソース管理とジョブの実行順序管理を分けて実行するようにしています。YARNではMasterサーバでResourceManagerを動かしSlaveサーバでNodeManagerを動かします、このResourceManagerがHadoopクラスタのリソース管理それからNodeManagerがジョブの実行順序管理を行いましてこのように分けることでMapReduce Version1で発生したスケールアウトしない問題に対策されています。
*ここで出ているジョブとタスクは分散処理の単位になっていましてSparkアプリケーションであればMapメソッドなどの分散処理は複数のタスクで構成され、タスクはジョブで構成されます。ジョブは実際に各Slaveで実行するものになります。sparkアプリケーションは実行時にコアの数、コアごとのスレッドの数を指定するのですがコアの数5のスレッド数1で指定した状態でmap処理を呼び出した場合、データを5分割して処理を実行します。この5分割したものが実際にslaveで実行される単位でジョブになります。

Apache Tez

YARNはリソース管理、ジョブスケジューリングですがApache Tezはその上で動くアプリケーションになっていまして特徴としては処理を有向非循環グラフ(DAG)で繋げることでメモリを有効に活用して処理を行うことができます。詳しくは以下のリンクに詳しく載っています。 https://techblog.yahoo.co.jp/architecture/2015_06_ditributed_system/

Apache Hive

Apache HiveHadoopクラスタ上のRDBです。TEZ上の分散処理エンジンで実行することができます。HiveQLといったクエリを投げることでデータの操作が行えます。HDFS上に保存されたファイルがデータの実体でCSV形式やORC形式で保存されています。大量の時系列データを扱う場合は日付でパーティションを切ってファイルの実体の保存先自体を分けたり、一つのパーティションに大量のファイルがある場合は1つにまとめるなどして読み込みを早くするといった対策はあります。

Apache Spark

Hiveと同じようにDAGを構成する分散処理のエンジンです。バッチ集計やstreaming処理のプログラムを書くことができます。Scalaで作られているのでScala, Javaはもちろん使えてPythonも使えるので扱いやすいのかと思います。

Apache Sqoop

Apache Sqoopは既存のOracleMySQLPostgreSQLなどのRDBからHiveにデータを取り込むためのソフトウェアです。

Apache ZooKeeper

Apache ZooKeeperとは分散処理の環境で同期を行うためのソフトウェアでネーミングベースでロックを取りに行くことで分散処理環境で同期を取れるようにしています。 http://oss.infoscience.co.jp/hadoop/zookeeper/docs/r3.3.1/zookeeperProgrammers.html

presto

Hiveに比べてレスポンスがすぐに帰ってくるようです https://www.slideshare.net/frsyuki/presto-hadoop-conference-japan-2014?ref=https://tug.red/entry/2014/07/10/150250/ https://blog.treasuredata.com/blog/2015/03/20/presto-versus-hive/