LoginSignup
18
17

More than 5 years have passed since last update.

CentOSでHadoopとHiveを試してみる(2015年秋編)

Last updated at Posted at 2015-11-23

やりたいこと

Hadoopファミリーは日々進化しますが、とはいえ、MapReduceとHiveのニーズは不滅です。現行(最新)かつ素のHadoopとHiveをCentOS上に構築して動作確認してみます。

環境

  • CentOS6.7(7でも基本同じ:手元にイメージがあっただけ・・・)
  • Hadoop 2.7.1
  • Hive 1.2.1

準備

OS

CentOS6.7をMinimal構成でインストールした後、

  • yum update
  • yum groupinstall 'Development tools'
  • yum install wget

を実行した状態。テスト自体は、VMWareFusion8上で行っているが、多分依存などは無い。

ssh

疑似分散モードを利用するためには、ssh localhostでパスフレーズ無しでログインできるようにしておく必要があります。

mkdir .ssh
chmod 700 .ssh
cd .ssh
ssh-keygen -t rsa
cp id_rsa.pub authorized_keys
chmod 600 *

とでもしておけばよいでしょう。

Java

HadoopはJavaアプリなのでJava(JDK)のインストールが必要。
ここでは、OracleのJava8を入れた。wgetでrpmを取得し、インストール。

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jdk-8u66-linux-x64.rpm

rpm -ivh jdk-8u66-linux-x64.rpm

Javaは、/usr/java/jdk1.8.0_66にインストールされる。PATHはインストーラが通してくれるみたいだが、JAVA_HOMEの設定はされないので手動で行う。

JAVA_HOMEに設定は、Hadoopの事項において必須のようだ。

.bashrcをいじり、sourceで反映させておく。

export JAVA_HOME=/usr/java/jdk1.8.0_66
source .bashrc

.bash_profileではなく、.bashrcに書くほうが無難なようです。

Hadoop

Hadoopは疑似分散モードで構成します。

インストール

ここでは、Apache Hadoopサイトから最新版を取得してインストールしてみます。

wget http://ftp.riken.jp/net/apache/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz 
tar -xzvf hadoop-2.7.1.tar.gz 
mv hadoop-2.7.1 /usr/

解凍したものを、/usr/hadoop-2.7.1としてmvします。

HADOOP_HOMEとPATHの設定

.bashrcに、下記を追加し、反映させます。

export HADOOP_HOME=/usr/hadoop-2.7.1
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH
source .bashrc

ここまでの設定で、一応hadoop(クライアント)自体は動きます。

hadoop version

バージョンが表示されればOKです。

設定ファイルの編集

設定ファイルを編集します。編集するファイルは、

  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml

の3つです。
場所は、$HADOOP_HOME/etc/hadoop以下にあります。
yarn-site.xmlは用途によります。

設定は、Apache Hadoopサイトの例のまんま。

core-site.xml

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

hdfs-site.xml

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

yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
</configuration>

以上で、設定は終わりました。

Namenodeの初期化

準備ができたので、初期化処理をします。HDFS等が設定されます。

hadoop namenode -format

起動のための準備が整いました。

諸々起動

start-dfs.sh

起動時にワーニング出ますが、動作には問題ないようです。
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
あと、start-all.shは非推奨とのこと。

起動しているかの確認は、

jps

4290 SecondaryNameNode
4131 DataNode
4533 NodeManager
4440 ResourceManager
4013 NameNode
4847 Jps

停止は、

stop-dfs.sh

でできます。

WordCountを実行してみる(動作確認)

まず、カウント用のテストファイルを生成し、それをローカルファイルシステムからHDFSにコピーしてみます。

echo "a b c a" > test.txt

コピーする先のディレクトリをHDFS上に作成します。

hadoop fs -mkdir /input
hadoop fs -ls /
drwxr-xr-x   - root supergroup          0 2015-11-13 20:51 /input

inputディレクトリができています。

ここでも、WARN util.NativeCodeLoader: Unable to ...というワーニングが出ますが、動作には問題無いようです。

test.txtをコピーします。

hadoop fs -put test.txt /input
hadoop fs -ls -R /
drwxr-xr-x   - root supergroup          0 2015-11-13 20:53 /input
-rw-r--r--   1 root supergroup          8 2015-11-13 20:53 /input/test.txt
hadoop fs -cat /input/test.txt
a b c a

どうやらうまくコピーできたようです。

-ls -Rとすると再帰的にフォルダの中身が表示されます。

では、WordCountを実行してみます。

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /input /output

hadoop fs -ls -R /
drwxr-xr-x   - root supergroup          0 2015-11-13 20:53 /input
-rw-r--r--   1 root supergroup          8 2015-11-13 20:53 /input/test.txt
drwxr-xr-x   - root supergroup          0 2015-11-13 20:55 /output
-rw-r--r--   1 root supergroup          0 2015-11-13 20:55 /output/_SUCCESS
-rw-r--r--   1 root supergroup         12 2015-11-13 20:55 /output/part-r-00000

/output/part-r-00000が出力ファイルです。中身を見てみます。

hadoop fs -cat /output/part-r-00000

a   2
b   1
c   1

期待の結果が得られました。

Hive

HadoopファミリーのコアであるHadoopやHDFSが問題無く動いているようなので、Hiveもセットアップしてみます。

インストール

Hadoopと同じくHiveのサイトからwgetと取得します。

wget http://ftp.riken.jp/net/apache/hive/hive-1.2.1/apache-hive-1.2.1-bin.tar.gz
tar -xzvf apache-hive-1.2.1-bin.tar.gz
apache-hive-1.2.1-bin /usr/hive-1.2.1

HIVE_HOMEとPATHの設定をします。

export HIVE_HOME=/usr/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
souce .bashrc

動作の確認をしてみます。hiveと入力し、hive>プロンプトがでれば基本OKです。

hive

hive>show databases;
OK
default
Time taken: 0.825 seconds, Fetched: 1 row(s)

簡単なテスト

データの準備

ビックデータと呼ぶには程遠い、下記のようなファイル(data.csv)を用意ます。

新橋店,100
新宿店,340
池袋店,874
渋谷店,400

Hiveは問題なく日本語を処理できますが、形式はUTF-8が良いでしょう。

データベースとテーブルの準備

これを扱うデータベースとテーブルをHive上に作成します。

hive> create database testdb;
hive> use testdb;
hive> create table sales(shop string,sales int) row format delimited fields terminated by ',';
desc sales;
OK
shop                    string
sales                   int
Time taken: 0.471 seconds, Fetched: 2 row(s)

MySQLを利用しているのとほぼ感覚は変わりませんね。

データの読込

hive> load data local inpath "/root/data.csv" into table sales;

うまくいったら、selectをしてみましょう。

select * from sales;
OK
新橋店   100
新宿店   340
池袋店   874
渋谷店   400
    NULL
Time taken: 0.311 seconds, Fetched: 5 row(s)

いいですね。日本語もバッチリです。
likeもOK。

select * from sales where shop like '新%';
OK
新橋店   100
新宿店   340
Time taken: 0.155 seconds, Fetched: 2 row(s)

SumもOK。

select sum(sales) from sales;

OK
1714
Time taken: 2.21 seconds, Fetched: 1 row(s)

この程度のデータとSQLなら、普通のRDBの方が高速ですが、ひとまず動作確認ということで。

処理結果のファイルへの出力

Hiveはインタラクティブに利用するというよりも、最終的な処理を担うDWHやSparkなどに値を渡してやることが多いと思うので、結果をファイルに出力してみます。

hive>
    > insert overwrite directory '/output/'
    > select * from sales;

insert~分で出力先を指定した後、クエリを実行します。
出力結果を見てみます。

hadoop fs -cat /output/000000_0
新橋店100
新宿店340
池袋店874
渋谷店400
\N

いちおう出力はされています。

Update, Delete

HiveQLには、UpdateやDeleteは存在しない。

hiveを終了させる

hive> exit;

で、コンソールから抜けられます。

18
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
17