Hadoop+Hive

<疑似分散モード>


構築環境

  • Hadoop 2.7.1
  • Hive 1.2.1
  • had1.example.com

参考先

手順1との相違

 "許可がありません"の時はsudoをつける。rootユーザに変更しない

Hadoopのインストールが終わったらrebootする
(rebootするとjpsでプロセスが表示されるようになる)

reboot後、.bashrcの内容げ消えてしまったので再設定

start-dfs.shで以下のエラーが発生

localhost: Error: JAVA_HOME is not set and could not be found.

[対処]

$ vi /usr/hadoop-2.7.1/etc/hadoop/hadoop-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_66 を追加

NodeManager、ResourceManagerは起動されない

$ jps

2003 DataNode

2131 SecondaryNameNode

1915 NameNode

2301 Jps

解凍したapache-hive-1.2.1-binは/usr下へ移動
$ sudo mv apache-hive-1.2.1-bin /usr/

自分が設定した覚えのないシンボリックリンクがある(でも必要)

$ ls -la /usr/ | grep -- "->" | grep hive

lrwxrwxrwx   1 root    root       21  4月 10 20:09 2016 hive-1.2.1 -> apache-hive-1.2.1-bin

<完全分散モード>


構築環境

  • Java 1.8.0_66
  • Hadoop 2.0.0-cdh4.2.1

  • マスターサーバ
    • had.ms.example.com
  • スレーブサーバ
    • had.s1.example.com
    • had.s2.example.com
    • had.s3.example.com

 疑似分散モード      

JDKのインストール

$ 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
$ sudo rpm -ivh jdk-8u66-linux-x64.rpm

$ vi .bashrc
JAVA_HOME=/user/java/jdk1.8.0_66
PATH=$JAVA_HOME/bin:$PATH
$ source .bashrc
※.bashrc設定は、rootユーザも同様

$ java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

CDHのインストール

GPS鍵のインストール
$ sudo rpm --import http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera

Clouderaのリポジトリを登録
$ sudo rpm -ivh http://archive.cloudera.com/cdh4/one-click-install/redhat/6/x86_64/cloudera-cdh-4-0.x86_64.rpm

$ rpm -ql cloudera-cdh
/etc/pki/rpm-gpg
/etc/pki/rpm-gpg/RPM-GPG-KEY-cloudera
/etc/yum.repos.d/cloudera-cdh4.repo
/usr/share/doc/cloudera-cdh-4
/usr/share/doc/cloudera-cdh-4/LICENSE

バージョン4.2を指定
$ sudo vi /etc/yum.repos.d/cloudera-cdh4.repo
[cloudera-cdh4]
name=Cloudera's Distribution for Hadoop, Version 4
#baseurl=http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/4/  (コメントアウト)
baseurl=http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/4.2.1/  (追加行)
gpgkey =  http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera
gpgcheck = 1

CDHのインストール
$ sudo yum install hadoop-0.20-conf-pseudo

関連パッケージがインストールされた事を確認
$ yum list installed | grep hadoop
hadoop.x86_64        2.0.0+960-1.cdh4.2.1.p0.9.el6
hadoop-0.20-conf-pseudo.x86_64
hadoop-0.20-mapreduce.x86_64
hadoop-0.20-mapreduce-jobtracker.noarch
hadoop-0.20-mapreduce-tasktracker.noarch
hadoop-hdfs.x86_64   2.0.0+960-1.cdh4.2.1.p0.9.el6
hadoop-hdfs-datanode.x86_64
hadoop-hdfs-namenode.x86_64
hadoop-hdfs-secondarynamenode.x86_64

$ hadoop version
Hadoop 2.0.0-cdh4.2.1

hdfsユーザとmapredユーザが生成されている事を確認
$ cat /etc/passwd | egrep 'hdfs|mapred' 
hdfs:x:496:495:Hadoop HDFS:/var/lib/hadoop-hdfs:/bin/bash 
mapred:x:495:494:Hadoop MapReduce:/usr/lib/hadoop-0.20-mapreduce:/bin/bash 

NameNodeが管理するメタデータ領域のフォーマット 
$ sudo -u hdfs hdfs namenode -format 

HDFS関連のプロセスの起動 
$ sudo service hadoop-hdfs-namenode start 
$ sudo service hadoop-hdfs-datanode start 
$ ps -ef | grep hadoop-hdfs-namenode | grep -v grep 
$ ps -ef | grep hadoop-hdfs-datanode | grep -v grep 

MapReduce用システムディレクトリの作成 
$ sudo -u hdfs hadoop fs -mkdir -p /var/lib/hadoop-hdfs/cache/mapred/mapred/staging 
$ sudo -u hdfs hadoop fs -chmod 1777 /var/lib/hadoop-hdfs/cache/mapred/mapred/staging 
$ sudo -u hdfs hadoop fs -chown -R mapred /var/lib/hadoop-hdfs/cache/mapred 

ユーザーディレクトリの作成 
$ sudo useradd sampleuser 
$ sudo -u hdfs hadoop fs -mkdir -p /user/sampleuser 
$ sudo -u hdfs hadoop fs -chown sampleuser /user/sampleuser 

MapReduce関連のプロセスの起動 
$ sudo service hadoop-0.20-mapreduce-jobtracker start 
$ sudo service hadoop-0.20-mapreduce-tasktracker start 
$ ps -ef | grep mapreduce | grep -v grep 

サンプルアプリケーションの実行 
$ sudo -u sampleuser hadoop jar /usr/lib/hadoop-0.20-mapreduce/hadoop-examples.jar pi 10 1000000

 完全分散クラスタの設定      

ネットワークの設定

hostsの設定
$ sudo vi /etc/hosts
192.168.33.110  had.ms.example.com
192.168.33.120  had.s1.example.com
192.168.33.121  had.s2.example.com
192.168.33.122  had.s3.example.com
※127.0.0.1は削除

$ sudo touch /etc/hadoop/conf/hosts.exclude
iptablesを無効
$ sudo service iptables status
iptables: ファイアウォールが稼働していません。
$ chkconfig --list | grep iptables
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
$ sudo chkconfig iptables off
$ chkconfig --list | grep iptables
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off

Hadoopの設定

完全分散モードへ変更
$ ls /etc/hadoop/conf/
README         hadoop-metrics.properties  log4j.properties
core-site.xml  hdfs-site.xml              mapred-site.xml

$ alternatives --display hadoop-conf
hadoop-conf -ステータスは自動です。
リンクは現在 /etc/hadoop/conf.pseudo.mr1 を指しています。
/etc/hadoop/conf.empty - 優先項目 10
/etc/hadoop/conf.pseudo.mr1 - 優先項目 30
現在の「最適」バージョンは /etc/hadoop/conf.pseudo.mr1 です。

$ sudo cp -prL /etc/hadoop/conf /etc/hadoop/conf.distribute.mr1

$ sudo alternatives --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.distribute.mr1 50

$ alternatives --display hadoop-conf
hadoop-conf -ステータスは自動です。
リンクは現在 /etc/hadoop/conf.distribute.mr1 を指しています。
/etc/hadoop/conf.empty - 優先項目 10
/etc/hadoop/conf.pseudo.mr1 - 優先項目 30
/etc/hadoop/conf.distribute.mr1 - 優先項目 50
現在の「最適」バージョンは /etc/hadoop/conf.distribute.mr1 です。

HDFSの設定

設定変更前にサービス停止
$ sudo service hadoop-hdfs-namenode stop
$ sudo service hadoop-hdfs-datanode stop

Namenodeの設定
$ sudo vi /etc/hadoop/conf.distribute.mr1/core-site.xml
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://had.ms.example.com:8020</value>
  </property>
  
  削除
  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:8020</value>
  </property>
</configuration>

データを格納するディレクトリの設定とレプリケーション数の設定
$ sudo vi /etc/hadoop/conf.distribute.mr1/hdfs-site.xml
<configuration>

  初期値なので編集不要
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/var/lib/hadoop-hdfs/cache/${user.name}/dfs/name</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/var/lib/hadoop-hdfs/cache/${user.name}/dfs/data</value>
  </property>

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

Namenodeへの接続許可
$ sudo vi /etc/hadoop/conf/hosts.include
had.s1.example.com
had.s2.example.com
had.s3.example.com

$ sudo vi /etc/hadoop/conf.distribute.mr1/hdfs-site.xml
<configuration>
  <property>
    <name>dfs.hosts</name>
    <value>/etc/hadoop/conf/hosts.include</value>
  </property>
  <property>
    <name>dfs.hosts.exclude</name>
    <value>/etc/hadoop/conf/hosts.exclude</value>
  </property>
</configuration>

MapReduceの設定

設定変更前にサービス停止
$ sudo service hadoop-0.20-mapreduce-jobtracker stop
$ sudo service hadoop-0.20-mapreduce-tasktracker stop

JobTrackerのサーバー名とポート番号を指定
$ sudo vi /etc/hadoop/conf.distribute.mr1/mapred-site.xml
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>had.ms.example.com:8021</value>
  </property>
</configuration>

MapReduce用のシステムディレクトリを指定
$ sudo vi /etc/hadoop/conf.distribute.mr1/mapred-site.xml
<configuration>
  <property>
    <name>mapred.system.dir</name>
    <value>/var/lib/hadoop-hdfs/cache/mapred/mapred/system</value>
  </property>
</configuration>

Mapタスクスロット数/Reduceタスクスロット数の指定
$ sudo vi /etc/hadoop/conf.distribute.mr1/mapred-site.xml
<configuration>
  <property>
    <name>mapred.tasktracker.map.tasks.maximum</name>
    <value>1</value>
  </property>
  <property>
    <name>mapred.tasktracker.reduce.tasks.maximum</name>
    <value>1</value>
  </property>
</configuration>

JobTrackerへの接続許可
$ sudo vi /etc/hadoop/conf.distribute.mr1/mapred-site.xml
<configuration>
  <property>
    <name>mapred.hosts</name>
    <value>/etc/hadoop/conf/hosts.include</value>
  </property>
  <property>
    <name>mapred.hosts.exclude</name>
    <value>/etc/hadoop/conf/hosts.exclude</value>
  </property>
</configuration>

設定後の起動

マスターノード
$ sudo -u hdfs hdfs namenode -format

マスターノード
$ sudo service hadoop-hdfs-namenode start
$ ps -ef | grep hadoop-hdfs-namenode | egrep -v 'grep|tail'

スレーブノード
$ sudo service hadoop-hdfs-datanode start
$ ps -ef | grep hadoop-hdfs-datanode | egrep -v 'grep|tail'

マスターノード
$ sudo service hadoop-0.20-mapreduce-jobtracker start
$ ps -ef | grep jobtracker | egrep -v 'grep|tail'

スレーブノード
$ sudo service hadoop-0.20-mapreduce-tasktracker start
$ ps -ef | grep tasktracker | egrep -v 'grep|tail'

$ sudo -u hdfs hadoop fs -mkdir -p /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
$ sudo -u hdfs hadoop fs -chmod 1777 /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
$ sudo -u hdfs hadoop fs -chown -R mapred /var/lib/hadoop-hdfs/cache/mapred

JPSの確認

プロセスが表示されない場合はrebootする。
マスターノード
$ sudo -u hdfs jps
2439 NameNode
1715 SecondaryNameNode
3534 Jps

$ sudo -u mapred jps
3137 JobTracker
3577 Jps

$ ls -l /tmp/hsperfdata_{hdfs,mapred}
/tmp/hsperfdata_hdfs:
-rw------- 1 hdfs hdfs 32768  8月  6 00:42 2016 1715
-rw------- 1 hdfs hdfs 32768  8月  6 00:42 2016 2439

/tmp/hsperfdata_mapred:
-rw------- 1 mapred mapred 32768  8月  6 00:41 2016 3137

スレーブノード
$ sudo -u hdfs jps
2254 DataNode
1543 SecondaryNameNode
2601 Jps

$ sudo -u mapred jps
2434 TaskTracker
2631 Jps

$ ls -l /tmp/hsperfdata_{hdfs,mapred}
/tmp/hsperfdata_hdfs:
-rw------- 1 hdfs hdfs 32768  8月  6 00:43 2016 1543
-rw------- 1 hdfs hdfs 32768  8月  6 00:42 2016 2254

/tmp/hsperfdata_mapred:
-rw------- 1 mapred mapred 32768  8月  6 00:43 2016 2434

 ログ/例外対応      

ログファイル

マスターノード
tail -f /var/log/hadoop-hdfs/hadoop-hdfs-namenode-had.ms.example.com.log
tail -f /var/log/hadoop-0.20-mapreduce/hadoop-hadoop-jobtracker-had.ms.example.com.log
スレーブノード
tail -f /var/log/hadoop-hdfs/hadoop-hdfs-datanode-had.s1.example.com.log
tail -f /var/log/hadoop-0.20-mapreduce/hadoop-hadoop-tasktracker-had.s1.example.com.log

例外が発生したら最初にやること

マスターノード
sudo mv /var/lib/hadoop-hdfs/cache/hdfs/dfs/name ~/
sudo -u hdfs hdfs namenode -format
スレーブノード
sudo mv /var/lib/hadoop-hdfs/cache/hdfs/dfs/data ~/
sudo service hadoop-hdfs-datanode start

sudo service hadoop-hdfs-secondarynamenode stop

<Hive>


インストール
$ sudo yum install hive
HDFSに作業フォルダーを作成
$ sudo -u hdfs hadoop fs -mkdir /user/vagrant
$ sudo -u hdfs hadoop fs -chown -R hive:hive /user/vagrant
Hiveシェル起動
$ hive
DB作成
hive> create database db_vagrant location '/user/vagrant';
hive> use db_vagrant;

<Pig>


インストール
$ sudo yum install pig