はじめに
インフラに興味をもってから、その中でも特に分散システムや分散並列処理に興味を持ったので有名な分散処理フレームワークであるHadoopを使ってみる。
今回は以下の記事を参考にして自分のUbuntu 16.04上で動かす。
Apache Hadoop 2.5.0 セットアップ手順 その1 – ローカル実行からシングルノードクラスター起動まで – hrendoh's tech memo
Hadoopのインストール
Hadoop ver 2.7以降のものはJava7の環境下で動く。 Linuxを使ってる人でJavaやScalaを使ったことがある人ならわかると思うがJavaの実行環境と言ってもOpenJDKとOracle JDK/JREの2つが存在する。 しかし、Hadoopはこの両方をサポートしているため、いずれかがインストールされていればいい。
HadoopJavaVersions - Hadoop Wiki
次はJDK/JRE以外で必要なものをインストールする。 公式ドキュメントにはssh,rsyncが必要と書いているがこれらはUbuntuにデフォルトで入っているため省略。
いよいよ、Hadoop本体をインストールする。 今回は次のリンクからhadoop-2.8.2をダウンロードした。
Index of /software/apache/hadoop/common
それらのファイルを展開したら/etc/profileに次のコードを末尾に追加する
export PATH=/<展開したディレクトリ>/hadoop-2.5.0/bin:$PATH
その次に展開したディレクトリ内の/etc/hadoop/hadoop-env.shにJAVA_HOMEのパスを通す。
それが完了したなら、コマンドを実行する。
$ hadoop Usage: hadoop [--config confdir] [COMMAND | CLASSNAME] CLASSNAME run the class named CLASSNAME or where COMMAND is one of: fs run a generic filesystem user client version print the version jar <jar> run a jar file note: please use "yarn jar" to launch YARN applications, not this command. checknative [-a|-h] check native hadoop and compression libraries availability distcp <srcurl> <desturl> copy file or directories recursively archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive classpath prints the class path needed to get the Hadoop jar and the required libraries credential interact with credential providers daemonlog get/set the log level for each daemon trace view and modify Hadoop tracing settings Most commands print help when invoked w/o parameters.
このあと参考にした記事ではスタンドアロンモードで起動して動作確認しているがそれは省略。
擬似分散モード
通常はいくつかのサーバなどにあれこれを分散させて処理を行うがそれが難しい場合もあるので今回は擬似分散モードという HDFSデーモンやDataNode、yarnなどを全て同一のサーバ上で実行するモードを使う。
設定ファイルの編集
etc/hadoopのディレクトリに設定ファイルが存在する。
まずはcore-site.xmlに次を追加
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
次にhdfs-site.xmlにプロパティdfs.replicationを1にセットしたproperty要素を追加。
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
これが終わったなら次の段階に移行する
hdfs(hadoop distributed file system)をフォーマット
初回はデーモンを起動する前にファイルシステムのフォーマットが必要になる。
$ hdfs namenode -format
hdfsデーモンの起動
hdfsのデーモンを起動するにはhadoopを展開したディレクトリ直下のsbin/start-dfs.shを実行する。
実行後にjpsコマンドを叩いて、NameNodeとDataNodeがあれば正常に動作している。
$ cd hadoop-2.8.2 $ sbin/start-dfs.sh $ jps 15538 SecondaryNameNode 15301 DataNode 24793 Jps 15182 NameNode
Webインターフェースの確認
50070番ポートの通信をファイヤーウォールの設定から許可するとlocalhost:50070でwebインターフェースが起動していることが確認できる。
MapReduceを実行する
MapReduceで使うディレクトリをHDFS(Hadoop Distributed File System)上に作成する
$ hadoop fs -mkdir /user $ hadoop fs -mkdir /user/<username>
この時のusernameは現在自分の使用しているアカウント名と同一にするといい。
次に、ディレクトリ内に格納されている既存のサンプルを動作させる。
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.2.jar pi 10 10000 ..... Estimated value of Pi is 3.14120000000000000000
今回はHDFS上で円周率を求めるサンプルがあったのでそれを実行した。 調べてみるとWordCountなどもあるらしい。
おわりに
今回はHadoopをインストールし、HDFS上でサンプルを動かすところまでやった。 ただし、HDFS上で実行したためジョブがローカル実行されている。 次回はそれを分散実行するためのyarnについて触れていこうと思う。