コンパイラかく語りき

import { Fun } from 'programming'

MacにHadoopをインストールして、起動・実行する

環境

インストー

Homebrewから入れます。

brew install hadoop

バージョン

Apache Hadoop Releases

公式によると、2017/05/22時点では2.8.0が最新版らしいです。

インストール先

入りました。

/usr/local/Cellar/hadoop/2.8.0

f:id:chuck0523:20170522232404p:plain

名前衝突

ちなみに、nodeパッケージマネージャーのyarnをインストール済みの場合、名前衝突が起きます。 その結果、hadoop自体のインストールは終わりますが、brew linkが失敗している状態になります。 

設定

hadoopmac上で使い始める前にいくつかの設定を行います。

hadoop-env.shの編集

/usr/local/Cellar/hadoop/2.8.0/libexec/etc/hadoop/hadoop-env.shにて、以下を、

export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"

以下のように変更。

export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc="

Core-site.xmlの編集

`/usr/local/Cellar/hadoop/2.8.0/libexec/etc/hadoop/core-site.xml<conficuration />を以下のように変更。

<configuration>  
<property>
     <name>hadoop.tmp.dir</name>
     <value>/usr/local/Cellar/hadoop/hdfs/tmp</value>
     <description>A base for other temporary directories.</description>
  </property>
  <property>
     <name>fs.default.name</name>                                     
     <value>hdfs://localhost:9000</value>                             
  </property>
</configuration>  

mapred-site.xmlの編集

/usr/local/Cellar/hadoop/2.8.0/libexec/etc/hadoop/mapred-site.xml<conficuration />を以下のように変更。

<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>localhost:9010</value>
  </property>
</configuration>

ちなみに、自分の場合はファイル自体が無く、mapred-site.xml.templateというファイルがあったのでそれを複製しました。

hdfs-site.xmlの編集

/usr/local/Cellar/hadoop/2.8.0/libexec/etc/hadoop/hdfs-site.xml<conficuration />を以下のように変更。

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

xx_profileの編集

~/.bash_profile~/.zshrc等にaliasを追記します。

alias hstart="/usr/local/Cellar/hadoop/2.6.0/sbin/start-dfs.sh;/usr/local/Cellar/hadoop/2.6.0/sbin/start-yarn.sh"
alias hstop="/usr/local/Cellar/hadoop/2.6.0/sbin/stop-yarn.sh;/usr/local/Cellar/hadoop/2.6.0/sbin/stop-dfs.sh"

ターミナル上で、aliasを再読込。

source ~/.profile

SSH Localhost

localhostsshできるようにします。

~/.ssh/id_rsa~/.ssh/id_rsa.pubがあるかどうかチェック。無ければ以下のコマンド。

ssh-keygen -t rsa

リモートログイン

Macの環境設定(system preference)をいじります。 環境設定 > 共有(Sharing) > リモートログイン(Remote Login)を有効にします。

SSH鍵認証

システムがログインを受け入れるようにします。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh localhost

ログインが成功します。exitでログアウトです。

Hadoop起動

起動。

hstart

停止。

hstop

ブラウザで確認

無事にhadoopが起動していれば、以下のポートでそれぞれ様子を確認できます。

f:id:chuck0523:20170523005952p:plain

参考にした記事

ここまでの手順で参考にした記事です。

単語数カウント

さて、Hadoopの世界でのHello Worldとも言われる、単語数カウントをやってみます。

ディレクトリ・ファイル作成

まず、材料となるファイルをローカルに作っておきます。ちなみに、今は、/usr/local/Celler/hadoop/2.8.0にいる状態です。

mkdir input
touch input/a.txt input/b.txt

ファイルに書き込みをします。

echo "a a b b b c b c" > input/a.txt
echo "ab a b b c c c" > input/b.txt

次にHadoopを起動して、Hadoopファイルシステム上にディレクトリとファイルを作成します。

hstart

// 起動後…

hadoop fs -mkdir /user/hoge/input
hadoop fs -put input/a.txt input/
hadoop fs -put input/b.txt input/

putはローカルにあるファイルをhadoopファイルシステム上にコピーします。

その他のファイルシステム系のコマンドはhelpか以下のサイトからどうぞ。

HDFSシェルコマンド一覧

ちなみに、ディレクトリ構造についてはブラウザからも確認できます。

http://localhost:50070/explorer.html#/

f:id:chuck0523:20170523012638p:plain

実行

コマンドを実行します。

hadoop jar libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar wordcount input output

上記のコマンドを実行すると、inputディレクトリにおいたファイルを読んで、outputディレクトリ以下に結果を吐き出します。(outputディレクトリは自動生成されます。)

生成されたoutput/part-r-00000の中身は以下の通り。

a    3
ab  1
b   6
c   5

きちんと単語の数がカウントされていますね。

というわけで、MacHadoopをインストールして、起動・実行してみました。