それが僕には楽しかったんです。

僕と MySQL と時々 MariaDB

Hadoopを使ってみた

はじめに

インフラに興味をもってから、その中でも特に分散システムや分散並列処理に興味を持ったので有名な分散処理フレームワークであるHadoopを使ってみる。

今回は以下の記事を参考にして自分のUbuntu 16.04上で動かす。

Apache Hadoop 2.5.0 セットアップ手順 その1 – ローカル実行からシングルノードクラスター起動まで – hrendoh's tech memo

Hadoopのインストール

Hadoop ver 2.7以降のものはJava7の環境下で動く。 Linuxを使ってる人でJavaScalaを使ったことがある人ならわかると思うがJavaの実行環境と言ってもOpenJDKとOracle JDK/JREの2つが存在する。 しかし、Hadoopはこの両方をサポートしているため、いずれかがインストールされていればいい。

詳しくは以下のHadoop wikiに書いてある。

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について触れていこうと思う。