Ubuntu18.04上でHadoop3.1.2の環境構築を行う

# Ubuntu18.04上でHadoop3.1.2の環境構築を行う

## 概要

Ubuntu18.04上でHadoop 3.1.2をインストールして設定を行う

## 1. Oracle Java 11をUbuntuにインストール

### ステップ1: 準備

```
$ sudo apt update
$ sudo apt upgrade
```

### ステップ2: Java11をUbuntu18.04にインストールする

```
$ sudo add-apt-repository ppa:linuxuprising/java
$ sudo apt update
```

java11をインストールする。

```
$ sudo apt install oracle-java11-installer
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
パッケージ oracle-java11-installer は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。
しかし、以下のパッケージが置き換えます:
  oracle-java11-installer-local

E: パッケージ 'oracle-java11-installer' にはインストール候補がありません
```


エラーが出ているが、`oracle-java11-installer-local`はあるっぽいのでそちらをインストールすることにする。ただし、`oracle-java11-installer-local`をインストールするためには`Oracle Java 11 .tar.gz`を`/var/cache/oracle-jdk11-installer-local/`に置いておく必要があるので注意。ダウンロードは[ココ](https://www.oracle.com/technetwork/java/javase/downloads/index.html)の公式HPから行う。なお、ダウンロードにはユーザー登録が必要なはず。ここでは`jdk-11.0.3_linux-x64_bin.tar.gz`をダウンロードしてきた。

```
$ sudo mkdir -p /var/cache/oracle-jdk11-installer-local/
$ sudo cp jdk-11.0.3_linux-x64_bin.tar.gz /var/cache/oracle-jdk11-installer-local/
```

これが終われば以下のパッケージがインストールできるはず。

```
$ sudo apt install oracle-java11-installer-local
```

複数のバージョンのJavaがインストールされている場合、Java11をデフォルトにするために`oracle-java11-set-default`をインストールする。

```
$ sudo apt-get install oracle-java11-set-default-local
```

## 2. Hadoopのインストールと設定

### ステップ1: 必要とされるソフトウェアの確認

・Java(Java11)  
・ssh  
・rsync  


### ステップ2: 必要なソフトウェアのインストール

Java11は先のセクション1でインストール済とする。

```
$ sudo apt-get install ssh
$ sudo apt-get install rsync
```

### ステップ3: Hadoop用のユーザーを作成

**※実際にはこの後の操作においてhadoopユーザーではなく別のユーザーアカウント(ksn)を使っているので注意。ホームディレクトリは`/home/ksn/`になっている。**

```
$ sudo adduser hadoop
```

アカウントを作成後、key-based sshを自身のアカウントにセットアップする必要がある。

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

これで、Hadoopユーザーでlocalhostにsshでつなぐことができる。(当然ではあるが、sshサーバーがないとつなぐことはできないので、`$ which sshd`でsshdが見つからないようだったら`sudo apt-get install openssh-server`でsshサーバーをインストールする)

```
$ ssh localhost
$ exit
```

### ステップ4: Hadoopソースアーカイブをダウンロードする

```
$ cd ~
$ wget http://www-eu.apache.org/dist/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz
$ tar xzf hadoop-3.1.2.tar.gz
$ mv hadoop-3.1.2 hadoop
```


### ステップ5: Hadoop Pseudo-Distributed Modeのセットアップ

Hadoopによって使われる環境変数のセットアップを行う。~/.bashrcに以下を付け加える。

```
export HADOOP_HOME=/home/ksn/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

```

`.bashrc`を再度読み込む。

```
$ source ~/.bashrc
```

```
$ nano $HADOOP_HOME/etc/hadoop/hadoop-env.sh
```

でhadoop-env.shファイルを開き、以下の設定を行う。

```
export JAVA_HOME=/usr/lib/jvm/java-11-oracle
```

###  ステップ6: Hadoop設定ファイルのセットアップ

```
cd $HADOOP_HOME/etc/hadoop
```

ここに色んな設定ファイルが置いてあるのでそれらの適切な場所を以下のように編集する。

**core-site.xml**

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

**hdfs-site.xml**

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

<property>
  <name>dfs.name.dir</name>
    <value>file:///home/ksn/hadoop/hadoopdata/hdfs/namenode</value>
</property>

<property>
  <name>dfs.data.dir</name>
    <value>file:///home/ksn/hadoop/hadoopdata/hdfs/datanode</value>
</property>
</configuration>
```

**mapred-site.xml**

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

**yarn-site.xml**

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


### ステップ7: Namenodeをフォーマットする

```
$ hdfs namenode -format
WARNING: /home/ksn/hadoop/logs does not exist. Creating.
2019-07-04 06:01:49,407 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = omega/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 3.1.2
...
2019-07-04 06:01:52,712 INFO namenode.FSImageFormatProtobuf: Image file /tmp/hadoop-ksn/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 390 bytes saved in 0 seconds .
2019-07-04 06:01:52,775 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2019-07-04 06:01:52,803 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at omega/127.0.1.1
************************************************************/
```

### ステップ8: Hadoop Clusterを起動する

```
$ cd $HADOOP_HOME/sbin/
```

```
$ ./start-dfs.sh
Starting namenodes on [omega]
omega: Warning: Permanently added 'omega' (ECDSA) to the list of known hosts.
Starting datanodes
Starting secondary namenodes [omega]
2019-07-04 06:26:02,223 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
```

```
$ ./start-yarn.sh
Starting resourcemanager
Starting nodemanagers
```

サービスが立ち上がっているか確認。

```
$ jps 
29474 NameNode
15047 SecondaryNameNode
2616 SparkSubmit
29640 DataNode
9806 Jps
```

### ステップ9: ブラウザでHadoopサービスにアクセスする

Hadoop NameNodeはデフォルトでは9870番ポートで起動するのでブラウザでlocalhost:9870にアクセスすると接続できる。

また、クラスターおよび全てのアプリケーションについての情報を得るためには8042番ポートにアクセスすればよい。[^1]

[^1]: が、これは今私は見れていない。どうもHadoop3.xはJava8までしか対応していないらしいとかなんとかでResourceManagerは立ち上がらないっぽい。よって、おいおい対策を考えることに。

最後に。Hadoopノードに関する詳細を得るためには9864番ポートにアクセスすればよい。


### 参考


http://ubuntuhandbook.org/index.php/2018/11/how-to-install-oracle-java-11-in-ubuntu-18-04-18-10/

https://tecadmin.net/install-oracle-java-11-ubuntu-18-04-bionic/

https://www.linuxuprising.com/2019/06/new-oracle-java-11-installer-for-ubuntu.html