IThaiのブログ

IT関連の話題やタイに関する様々なことを書いていきます。

Hadoopとは?Hadoopを触ってみる

ビッグデータ処理を支えるJavaフレームワーク
「Hadoop」とは?

もともと、Googleが検索エンジン用に開発したバッチ処理システムを参考に作られたもので、数千ものノードを用いて、PB(ペタバイト)クラスのデータ処理ができる。
検索システムを紹介する論文中で、データ処理のMapReduce、分散ファイルシステムのGoogle File Systemを解説。この論文を見たエンジニアが、Yahoo!社内で利用するシステムとしてHadoopの開発を進めていたものだ
現在Hadoopは、Apache Software Foundation(ASF)に移管され、オープンソースソフトとして開発が進められている。

【インタビュー】ビッグデータを支えるCloudera、その役割とは? 共同創業者兼CTOのAwadallah氏に聞く - クラウド Watch

Hadoopは、主にHDFSとMapReduceの技術で構成されています。 HDFSは分散したストーレージを一つのストーレージとして扱う技術で、MapReduceはデータ解析のためのプログラムになります。これらは元々のGoogleの着想だったのですが、今はApacheFoundationでオープンソース化されているようです。DWH(データウェアハウス)やBI(ビジネスインテリジェンス)と呼ばれる領域で良く使用されていますが、以前から気になっていたので、少し触ってみます。

では、さっそくVagrantで作成したVMにHadoopをインストールしてみます。
VMを作成する記事は下記参照です。

今回はHadoopを利用する環境として、HadoopのディストリビューションのCDH(Cloudera’s Distribution including Apache Hadoop)を使用します。 まずはJDKが必要なので、OpeanJDKをインストールします。今回はJava8をインストールします。

[vagrant@vagrant-centos64 ~]$ java -version
-bash: java: command not found
[vagrant@vagrant-centos64 ~]$ yum search openjdk
<略>
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment
<略>
[vagrant@vagrant-centos64 ~]$ su
Password: 
[root@vagrant-centos64 vagrant]# yum install java-1.8.0-openjdk-devel.x86_64
<略>
[root@vagrant-centos64 vagrant]# java -version
openjdk version "1.8.0_31"
OpenJDK Runtime Environment (build 1.8.0_31-b13)
OpenJDK 64-Bit Server VM (build 25.31-b07, mixed mode)
[root@vagrant-centos64 vagrant]# 

OpenJDKがインストールされました。しかし後で知ったのですが今回使用するClouderaは Oracle製のJDKでないといけないようです。

そこで、インストールしたOpenJDKをアンインストールします。

[vagrant@vagrant-centos64 ~]$ yum list installed | grep jdk
[vagrant@vagrant-centos64 ~]$ su
Password: 
[root@vagrant-centos64 vagrant]# yum remove -y java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-headless.x86_64
<略>
[root@vagrant-centos64 vagrant]# java -version
bash: java: command not found

OpenJDKのアンインストールが完了しました。 次にOracle製のJDKのrpmをwgetでダウンロードします。 *wgetする前にOracleのJDKダウンロードページで同意にチェックが必要です。

まずは、wgetをインストールします。

[root@vagrant-centos64 vagrant]# wget
bash: wget: command not found
[root@vagrant-centos64 vagrant]# yum install wget
<略>

Oracle製のJDKのrpmをwgetでダウンロードします。

[root@vagrant-centos64 vagrant]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.rpm
<略>

rpmからJDKをインストールします。

[root@vagrant-centos64 vagrant]# rpm -ivh jdk-8u25-linux-x64.rpm 
<略>
[root@vagrant-centos64 vagrant]# java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

次にHadoopをインストールします。

[root@vagrant-centos64 vagrant]# cd /etc/yum.repos.d
[root@vagrant-centos64 yum.repos.d]# wget http://archive.cloudera.com/redhat/6/x86_64/cdh/cloudera-cdh3.repo
[root@vagrant-centos64 yum.repos.d]# rpm --import http://archive.cloudera.com/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera
[root@vagrant-centos64 yum.repos.d]# yum search hadoop
<略>
[root@vagrant-centos64 yum.repos.d]# yum install hadoop-0.20
<略>

Hadoopをインストールすることができました。次に1台でHadoopのサンプルプログラムを触ってみます。 ますはHadoopを1台で動かす設定を入れます。

[root@vagrant-centos64 yum.repos.d]# yum install hadoop-0.20-conf-pseudo
<略>

各サービスを起動します。

[root@vagrant-centos64 yum.repos.d]# service hadoop-0.20-namenode start
<略>
[root@vagrant-centos64 yum.repos.d]#                       [  OK  ]
[root@vagrant-centos64 yum.repos.d]# service hadoop-0.20-jobtracker start
<略>
[root@vagrant-centos64 yum.repos.d]#                       [  OK  ]
[root@vagrant-centos64 yum.repos.d]# service hadoop-0.20-datanode start
<略>
datanode (pid  8512) is running...                         [  OK  ]
[root@vagrant-centos64 yum.repos.d]# service hadoop-0.20-tasktracker start
<略>
[root@vagrant-centos64 yum.repos.d]#                       [  OK  ]

いよいよサンプルプログラムを動かしてみます。その前に、Hadoopはサーバをホスト名で指定するようになってるようなので、/etc/hostsファイルに記載して名前解決できるようにしておきます(これをしないとUnknownHostExceptionが吐かれます)。また、サービス起動直後はHDFSはセーフモードになっており、書き込みを行おうとすると、SafeModeExceptionが吐かれます。なのでセーフモードをOFFにします。

[root@vagrant-centos64 hadoop]# hadoop dfsadmin -safemode get
Safe mode is ON
[root@vagrant-centos64 hadoop]# hadoop dfsadmin -safemode leave
Safe mode is OFF

円周率を計算するサンプルプログラムを動かしてみます。

[root@vagrant-centos64 lib]# hadoop jar /usr/lib/hadoop-0.20/hadoop-examples.jar pi 4 1000
Number of Maps  = 4
Samples per Map = 1000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Starting Job
<略>
Job Finished in 88.588 seconds
Estimated value of Pi is 3.40000000000000000000

ちゃんと動作しましたね。
今後は複数台のサーバにHadoopを入れてデータ解析をやってみたいです。

Hadoop徹底入門 第2版

Hadoop徹底入門 第2版