ubuntu 16.04で　Hadoop ,Hive,Beelineのインストール

仕事柄でローカルでのHadoopとHiveの開発環境を構築しています。CDH　Managerを使っていると楽と聞いていたが、どうも自分のVMではメモリーが足りなくて断念するしかありませんでした。手作業でミニ版を構築知ることになったが、途中でいろいろ挫折して、やっと動けるようになったので一応その手順をメモしておきます。

###Step1:

VirtualBox + Ubuntu16.04 のインストール

###Step2:
VMでSSHなどをインストール

```shell:ssh
sudo apt-get install ssh
sudo apt-get install rsync
sudo apt-get install openssh-server
```

###Step3：
IPv6とapparmorを無効にする（必須ではないが、開発環境であるし、CDHの製品を使う時にはしておいた方が無難）

/etc/sysctl.conf に下記の三行を追加します

```shell:ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
```

それで、以下のコマンドを実施

```shell:ipv6
sudo sysctl -p
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
```

1と報告されればOK

以下のコマンドを実施して、apparmorを無効にします。

```shell:apparmor
sudo systemctl stop apparmor
sudo systemctl disable apparmor
```

おまけ：　実はその前にCentOS7.5でもHadoopをインストールしていたが、当時SElinuxを無効化するときに誤ってひどい目にあったので、備忘とします。

 /etc/selinux/config
のSELINUX=enforcing　をdisabledにするつもりが、SELINUXTYPEをdisabledにしてしまい、Rebootoすると、システムが起動できなくなります。調べるのに3時間もかかってしまって、悔しい。。。

###Step4:

Hadoopの擬似クラスターにするので、パスワードなしのSSH環境にします。

```shell:ssh
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
```

###Step5:
Javaのインストール
ディフォルトではOpenJDKが入っているが、CDH製品の場合、OracleJDKが必要なので、それを入れます。

```shell:java
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default
```

（OpenJDKのアンインストール必要がありません、上記の操作でalternatives でJDKも、JAVA_HOMEも設定してもらっています。ちなみに、余談ですが、それを確認するときに、PATHに設定した記憶の無いパスが出来きました。~/.bashrcにはなくて、~/.bash_profileはファイルそのものすらありません。あれーとおもって、sudo grep -r "PATH=" /　　で調べて見たら、なるほど，~/.profileに定義されていることが分かりました）

###Step6:
HiveのmetastoreのDBとしてMysqlをインストールします。

```shell:mysql
sudo apt-get update
sudo apt-get install mysql-server
```

１回目はそれだけにして、mysql -u root でログインしようとしたら、Access denied for user ‘root’@’localhost’ (using password: NO)　と怒られて、色々対処もしましたが、ダメでした。やむを得なく再インストールしてしまいました。

今度は下記のコマンドも実施して、Rootユーザにもパスワードをセットして、ログインできました。

```shell:secure
mysql_secure_installation　
mysql -u root　-p
```

ログインできてから、データベースと必要なユーザも作ります。

```sql:create
create database hive_metastore default character set 'utf8';
use hive_metastore;
create user 'hive'@'localhost' identified by 'hive';
grant select, insert, update, delete, alter, create, index, references on hive_metastore.* to 'hive'@'localhost';
```

###Step7: 必要資材のダウンロード
apacheのサイトからダウンロードするのも当然ありですが、今回はCDHバージョンにしています。

```shell:download
wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.16.1.tar.gz
wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.16.1.tar.gz
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.13.tar.gz

tar -xvf hadoop-2.6.0-cdh5.16.1.tar.gz
tar -xvf hive-1.1.0-cdh5.16.1.tar.gz
tar -xvf mysql-connector-java-8.0.13.tar.gz 

sudo mv hadoop-2.6.0-cdh5.16.1 /usr/local/hadoop
sudo mv hive-1.1.0-cdh5.16.1 /usr/local/hive
```

上記のフォルダ構成で~/.bashrc に必要な環境変数を追加

```shell:.bashrc
export HADOOP_PREFIX="/usr/local/hadoop"
export HADOOP_HOME=$HADOOP_PREFIX  
export PATH=$PATH:$HADOOP_PREFIX/bin
export PATH=$PATH:$HADOOP_PREFIX/sbin
export HADOOP_MAPRED_HOME=${HADOOP_PREFIX}
export HADOOP_COMMON_HOME=${HADOOP_PREFIX}
export HADOOP_HDFS_HOME=${HADOOP_PREFIX}
export YARN_HOME=${HADOOP_PREFIX}
export HADOOP_USER_CLASSPATH_FIRST=true
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
```

```shell:cp
source ~/.bashrc
cp mysql-connector-java-8.0.13/mysql-connector-java-8.0.13-bin.jar $HIVE_HOME/lib/ 
```

###step8: 設定ファイルの修正

$HADOOP_HOME/etc/hadoop/hadoop-env.sh のJAVA_HOME定義のところを実際のフォルダに併せて修正します。

```shell:core-site.xml
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
```

$HADOOP_HOME/etc/hadoop/core-site.xml を下記のように作成します。

```xml:core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/dataflair/hdata</value>
</property>
```

$HADOOP_HOME/etc/hadoop/hdfs-site.xmlを下記のように作成します。

```xml:hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
```

$HADOOP_HOME/etc/hadoop/mapred-site.xmlを下記のように作成します。

```xml:mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
```

$HADOOP_HOME/etc/hadoop/yarn-site.xmlを下記のように作成します。

```xml:yarn-site.xml
<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>
```

いろいろXMLを修正した後、フォーマットがぐちゃぐちゃになったので、ツールも入れて対応するようにしました。

```shell:libxml2
sudo apt-get install libxml2-utils
```

$HIVE_HOME/conf/hive-site.xml

```xml:hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value><![CDATA[jdbc:mysql://localhost/hive_metastore?autoReconnect=true&useSSL=false]]></value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
  </property>
  <property>
    <name>datanucleus.fixedDatastore</name>
    <value>false</value>
  </property>
  <property>
      <name>hive.exec.local.scratchdir</name>
      <value>/tmp/hive</value>
  </property>
  <property>
    <name>hive.downloaded.resources.dir</name>
    <value>/tmp/hive</value>
  </property>
  <property>
    <name>hive.querylog.location</name>
    <value>/tmp/hive</value>
  </property>
  <property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value>
  </property>
</configuration>

```

###step9: 各アプリの起動
 
HDFSの保存先ディレクトリを作成します。

```shell:hdfs-init
sudo mkdir -p ~/var/lib/hdfs/{name,data}
```

HADOOP の初期化と起動

```shell:hadoop
hdfs namenode -format
start-yarn.sh
```

metastoreの初期化

```shell:metastore
schematool -dbType mysql -initSchema
```

hiveserver2の初期化

```shell:hiveserv2
start hiveserver2
hiveserver2
```



Beelineで接続

```shell:beeline
beeline -u jdbc:hive2://localhost:10000/default
```