Apache Hadoop 3.0のインストール

⊥∀KA です。

Apache Hadoop 3.0の正式版が2017年12月13日にリリースされました。
2016年の3.0.0-alpha1から始まって3.0.0-alpha2、3.0.0-alpha3、3.0.0-alpha4、3.0.0-beta1とリリースされてきて、
ようやくといった感じです。
Hadoopを簡単に説明しますと、大規模データの蓄積・分析を分散処理技術によって実現するオープンソースのミドルウェアです。

以下のような特長があります。

・高い耐障害性
分散アーキテクチャであるため、データは他ノードにも分散してコピー保存されます。
よって任意のサーバが故障しても システム全体として問題なく動作します。

・高いスケーラビリティ
HDFS(Hadoop用のファイルシステム)の容量やシステムリソースが不足する場合、
サーバを追加することで容量および処理性能の向上が可能です。
サーバの追加はHadoopクラスタの停止を必要としないため、サービスを継続した状態での運用が可能です。

・並列分散処理
複数台にて並列に分散処理を行ってくれるため、大量データを高速に処理できます。

・構造化・非構造化データの格納
構造化(CSVなど)、非構造化(画像、音声など)など様々なファイルを格納可能なため、
とりあえずHDFS上にどんどん配置していくことが可能です。
またHDFSにデータを格納する際には特に何らかの定義は特に不要です。
処理するタイミングでHDFSに格納したデータに都度意味づけするため、
とりあえず格納して処理の方針が決まった際にデータの扱い方を定義すれば良いです。

では、早速Hadoop 3.0をインストールしてみたいと思います。

2.0からの大きな変更点として、

・Java 8が必須※Java 9はまだ未対応
・HDFSイレイシャーコーディング機能
・デフォルトポート変更
・2台以上のネームノード構成サポート
・YARNリソースタイプの導入

などがあげられます。この他にも沢山ありますので興味ある方は調べてみてください。

では、早速インストールを開始したいと思います。

今回の評価環境です。
マスターノードとスレーブノードを同じマシン上に配置した疑似分散モードで構築します。

環境
OS ホスト名 IPアドレス 備考
CentOS 7.4 hadoop-svr 192.168.1.223 疑似分散モード

1.ユーザ作成

Hadoopのインストールユーザ hadoopを作成します。

# useradd hadoop

2.JDKインストール

JDK8をインストールします。CentOS7では既にJDK8がインストールされてますので、最新にアップデートします。

# yum install java-1.8.0-openjdk-devel

最新Verになっていることを確認します。

# java -version

openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

3.Hadoopダウンロードとインストール

Hadoop3.0のダウンロードとインストールを行います。

インストールディレクトリを作成します。

# mkdir -p /opt/hadoop
# chown hadoop /opt/hadoop

インストールモジュールをダウンロードします。

# su - hadoop
$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/hadoop/common/hadoop-3.0.0/hadoop-3.0.0.tar.gz

インストールします。単なるtarファイルの展開です。

$ cd /opt/hadoop
$ tar xzvf ~/hadoop-3.0.0.tar.gz

4.環境変数の設定

.bash_profileに追記します。

$ vi .bash_profile

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-5.b12.el7_4.x86_64
export HADOOP_HOME=/opt/hadoop/hadoop-3.0.0
export PATH=$HADOOP_HOME/bin:$PATH

環境変数を読み込みます。

$ . .bash_profile

Hadoopのバージョンを確認してみます。

$ hadoop version

Hadoop 3.0.0
Source code repository https://git-wip-us.apache.org/repos/asf/hadoop.git -r c25427ceca461ee979d30edd7a4b0f50718e6533
Compiled by andrew on 2017-12-08T19:16Z
Compiled with protoc 2.5.0
From source with checksum 397832cb5529187dc8cd74ad54ff22
This command was run using /opt/hadoop/hadoop-3.0.0/share/hadoop/common/hadoop-common-3.0.0.jar

5.SSHの設定

パスフレーズなしでlocalhostに接続できるように設定します。

$ ssh-keygen -t rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@localhost

6.HDFS領域の作成

/hadoopディレクトリをHDFS領域にします。

# mkdir /hadoop
# chown hadoop /hadoop

7.設定ファイルの修正

hadoop-env.sh にJAVA_HOMEを追加します。

$ vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-5.b12.el7_4.x86_64

core-site.xmlにローカルホストのHDFSに接続するようにポートと合わせて指定します。

$ vi $HADOOP_HOME/etc/hadoop/core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

HDFS のレプリケーション数を指定します。今回は1になります。

$ vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

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

MapReduceをYARNで実行するように指定します。

$ vi $HADOOP_HOME/etc/hadoop/mapred-site.xml

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

YARNの設定を行います。

$ vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

8.HDFSをフォーマット

HDFSをフォーマットします。

$ $HADOOP_HOME/bin/hdfs namenode -format

沢山のメッセージが表示されますが、途中に「Storage directory /tmp/hadoop-hadoop/dfs/name has been successfully formatted.」と表示されればOKです。

9.Hadoop起動

ここまでで設定は完了です。ではサービスを起動してみます。

HDFSデーモンを起動します。

$ $HADOOP_HOME/sbin/start-dfs.sh

リソースマネージャを起動します。

$ $HADOOP_HOME/sbin/start-yarn.sh

JobHistoryServerを起動します。

$ $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh --config $HADOOP_HOME/etc/hadoop start historyserver

確認してみます。

$jps

5521 ResourceManager
5671 NodeManager
6087 Jps
5209 SecondaryNameNode
4876 NameNode
4990 DataNode
6030 JobHistoryServe

ちゃんと起動していますね。

10.アプリケーションテスト

既存でインストールされている円周率を計算するサンプルアプリケーションを実行してみます。

$ $HADOOP_HOME/bin/hadoop jar /opt/hadoop/hadoop-3.0.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar pi 10 10000

2018-01-16 15:14:02,127 INFO mapreduce.Job: Job job_1515165122698_0001 failed with state FAILED due to: Application application_1515165122698_0001 failed 2 times due to AM Container for appattempt_1515165122698_0001_000002 exited with exitCode: 1
Failing this attempt.Diagnostics: [2018-01-16 15:14:01.289]Exception from container-launch.
Container id: container_1515165122698_0001_02_000001
Exit code: 1

[2018-01-16 15:14:01.304]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
エラー: メイン・クラスorg.apache.hadoop.mapreduce.v2.app.MRAppMasterが見つからなかったかロードできませんでした


[2018-01-16 15:14:01.304]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
エラー: メイン・クラスorg.apache.hadoop.mapreduce.v2.app.MRAppMasterが見つからなかったかロードできませんでした


For more detailed output, check the application tracking page: http://hadoop-svr:8088/cluster/app/application_1515165122698_0001 Then click on links to logs of each attempt.
. Failing the application.
2018-01-16 15:14:02,158 INFO mapreduce.Job: Counters: 0
Job job_1515165122698_0001 failed!

何やらエラーが出ました。エラー内容から推察するにCLASSPATHの設定に問題があるようです。

$HADOOP_HOME/etc/hadoop/mapred-site.xmlにCLASSPATHの設定としてmapreduce.application.classpathの設定を行ってみます。

$ vi $HADOOP_HOME/etc/hadoop/mapred-site.xml

<property>
<name>mapreduce.application.classpath</name>
<value>
/opt/hadoop/hadoop-3.0.0/etc/hadoop,
/opt/hadoop/hadoop-3.0.0/share/hadoop/common/*,
/opt/hadoop/hadoop-3.0.0/share/hadoop/common/lib/*,
/opt/hadoop/hadoop-3.0.0/share/hadoop/hdfs/*,
/opt/hadoop/hadoop-3.0.0/share/hadoop/hdfs/lib/*,
/opt/hadoop/hadoop-3.0.0/share/hadoop/mapreduce/*,
/opt/hadoop/hadoop-3.0.0/share/hadoop/mapreduce/lib/*,
/opt/hadoop/hadoop-3.0.0/share/hadoop/yarn/*,
/opt/hadoop/hadoop-3.0.0/share/hadoop/yarn/lib/*
</value>
</property>

再度実行してみます。

$ $HADOOP_HOME/bin/hadoop jar /opt/hadoop/hadoop-3.0.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar pi 10 10000

/// 省略 ///

2018-01-16 15:21:39,227 INFO mapreduce.Job: Task Id : attempt_1515176234938_0001_m_000009_2, Status : FAILED
[2018-01-16 15:21:38.035]Container [pid=12913,containerID=container_1515176234938_0001_01_000031] is running beyond virtual memory limits. Current usage: 70.6 MB of 1 GB physical memory used; 2.5 GB of 2.1 GB virtual memory used. Killing container.
/// 省略 ///

[2018-01-16 15:21:38.807]Container killed on request. Exit code is 143
[2018-01-16 15:21:38.807]Container exited with a non-zero exit code 143.

またエラーが発生しました。メモリの設定に問題があるようです。
「memory used; 2.4 GB of 2.1 GB virtual memory used. Killing container」とのことから、
MapReduceで使用するメモリの割り当てが少ないようです。
2.1GBは $HADOOP_HOME/etc/hadoop/yarn-site.xmlの「yarn.nodemanager.vmem-pmem-ratio * 1024MB」で算出されます。
デフォルトは2.1のため、3(3072MB)で設定してみます。

$ $HADOOP_HOME/etc/hadoop/yarn-site.xml

<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>3</value>
</property>

メモリの設定変更なのでHadoopを再起動します。

$ $HADOOP_HOME/sbin/stop-dfs.sh
$ $HADOOP_HOME/sbin/stop-yarn.sh
$ $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh --config $HADOOP_HOME/etc/hadoop stop historyserver

$ $HADOOP_HOME/sbin/start-dfs.sh
$ $HADOOP_HOME/sbin/start-yarn.sh
$ $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh --config $HADOOP_HOME/etc/hadoop start historyserver

再度実行してみます。

$ $HADOOP_HOME/bin/hadoop jar /opt/hadoop/hadoop-3.0.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar pi 10 10000

/// 省略 ///

2018-01-16 15:27:44,658 INFO mapreduce.Job: map 0% reduce 0%
2018-01-16 15:28:17,459 INFO mapreduce.Job: map 20% reduce 0%
2018-01-16 15:28:23,319 INFO mapreduce.Job: map 60% reduce 0%
2018-01-16 15:28:46,651 INFO mapreduce.Job: map 70% reduce 0%
2018-01-16 15:28:47,661 INFO mapreduce.Job: map 100% reduce 0%
2018-01-16 15:28:49,679 INFO mapreduce.Job: map 100% reduce 100%
2018-01-16 15:28:54,725 INFO mapreduce.Job: Job job_1515176818346_0001 completed successfully
2018-01-16 15:28:54,869 INFO mapreduce.Job: Counters: 53

/// 省略 ///

Job Finished in 92.542 seconds
Estimated value of Pi is 3.14120000000000000000

うまく実行できたようです。

最後にHDFSへファイルを配置してみます。ローカルにテキストファイルを作成して配置します。

$ echo test > test.txt
$ cat test.txt

test

HDFSへ配置し、中身を確認してみます。

$ hadoop fs -put test.txt test.txt
$ hadoop fs -ls

-rw-r--r-- 1 hadoop supergroup 5 2018-01-16 15:36 test.txt

$ hadoop fs -cat test.txt
test

うまく配置できたようです。

今回は簡単な構成で、かつほぼデフォルトの設定でインストールしました。本番環境だと色々パラメータをチューニングする必要がありそうです。
では。

Standby Expressに関するお問合わせ

  • TEL 042-333-6217
  • FAX 042-352-6101
  • LINE
  • Mail