OCI Big Data Service のインスタンスを立ててみた

# はじめに : Oracle Big Data Service 

Oracle Cloud Infrastructure (OCI) におけるビッグデータ活用向けのサービスとして、 Oracle Big Data Service がリリースされています。こちら、 Cloudera 社の CDH をベースとしたサービスで Hadoop / Spark 等を利用可能なプラットフォームを提供します。

今回は、 Big Data Service のインスタンスを作成し、様子を確認してみます。

ドキュメントは以下です。

[Oracle Big Data Service](https://docs.oracle.com/en/cloud/paas/big-data-service/)

# 事前準備

### VCN 作成

Big Data Service は特定の VCN 内に配置されるので、事前に VCN を作っておく必要があります。 Public / Private いずれでもいけますが、 Regional Subnet である必要があります。

### ポリシーの追加

Big Data Service が VCN とうにアクセスできるよう、ルートコンパートメントに以下のポリシーを追加しておきます。

```
allow service bdsprod to {VNIC_READ, VNIC_ATTACH, VNIC_DETACH, VNIC_CREATE, VNIC_DELETE, VNIC_ATTACHMENT_READ, SUBNET_READ, VCN_READ, SUBNET_ATTACH, SUBNET_DETACH, INSTANCE_ATTACH_SECONDARY_VNIC, INSTANCE_DETACH_SECONDARY_VNIC} in tenancy
```

### ユーザ

OCI Administrator グループに入っているユーザで進めます。

# Big Data Service インスタンスの作成

Big Data Service のインスタンスは「データおよびAI」の下の「ビッグ・データ」から作ります。

![image-20201126215639639.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/864225a6-79eb-110d-1ab1-3faed6f18380.png)

Big Data Service のページに行くと、「クラスタの作成」を行うことができます。

![image-20201126215806081.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/f7c93ce8-42c7-f65a-6a7c-e649a0367a89.png)

クラスタの作成画面は横からひゅーっと出てくるタイプです。クラスタ名とクラスタの管理パスワードを設定します。また、その下に「セキュアで高い可用性(HA)」というメニューがあるのですが、このチェックをつけると Master Node / Utility Node が冗長構成になります。試しに作ってみるレベルなのでチェックを外しておきます。

クラスタ・バージョンについては現時点では CDH 6.3 のみとなっており CDH 7 系の提供はありません。ドロップダウンリストになっているので、そのうち追加されるものと思います。

ちなみに、トライアルアカウントでは、非 HA 構成のインスタンスは作成できるようです。(それなりにノード数、リソースが必要なので、なかなか速くクレジットが消費されてしまうかもしれませんが。。)

[Big Data Service Regions, Limits, Quotas, Events, and Work Requests](https://docs.oracle.com/en/cloud/paas/big-data-service/user/get-started-oracle-big-data-service.html#GUID-C86EA0E2-491C-40E6-BE31-D1C1E72AF74B)

![image-20201126215911385.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/0397296d-7262-3b99-a180-4ed6958f30f7.png)

このあと、 Master / Utility ノードの構成選択に移ります。Master / Utility ノードは VM.Standard2.4 が最小です。 先ほどの HA を有効化すると Mater x2 / Utility x2 の構成になります。なお、E2 / E3 シェイプには対応していません。ブロックストレージのサイズもここで選択します。試しに作ってみるだけなので最低の 150 GB にしておきます。

![image-20201126220010738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/ca9a58f6-8feb-a36d-26fa-daad5c1e9ce2.png)

その後 Worker ノードの構成も同じように選択します。VM.Standard2.1 x3ノードが最小構成です。

![image-20201126220057601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/d34d7df5-9d23-0234-f124-403850ae24f5.png)

この後はネットワークの設定です。ネットワーク設定は若干固有のものがあり、「クラスタ・プライベート・ネットワーク」が構成されます。こちら VCN とは別に構成されるノード間のネットワークとなり、 CIDR ブロックのみ指定します。デフォルトですと 10.0.0.0/16 と記載がありますが、今回は VCN とかぶるので 10.1.0.0/16 としました。

顧客ネットワークが VCN 側の設定です。

![image-20201126220146807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/45ca51a1-9fde-fef3-d771-82340cba5cf3.png)

その後の「ネットワーキング・オプション」ですが、取り急ぎ作ってみるだけなので、「オラクル社が～」を設定します。後述しますが、これを選ぶと、NAT ゲートウェイ等の設定がうまくいってなくてもインスタンスからの Outbound の通信ができるように取り計らってくれるオプションのようです。

SSH 公開キーについては、各ノードへのアクセスに使うキーになりますので、公開鍵を追加しておきます。

これでクラスタの作成をクリックすると、クラスタの作成が始まります。

![image-20201126220224179.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/5539a92e-9a74-d63d-8c14-490fa6a40d2b.png)

# 構成の確認

体感的には 20 - 30分ぐらい待つとインスタンスがアクティブになります。5ノードプロビジョニングされてます。クラスタの名前をクリックして詳細を確認します。

![image-20201126225753083.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/b028e2a9-8aa9-61a4-d321-560c0a1b2632.png)

「ネットワーキング・オプション」で「オラクル社が～」を選んだのでプライベート・ネットワーク側に NAT ゲートウェイがプロビジョニングされています。上のメニューからもわかるように、ブロック・ストレージの追加やシェイプ変更等はこの画面からできるようです。

なお、 2020/11 時点では停止のメニューはないようです。

![image-20201126225848185.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/884478e3-d6e5-dd37-2b48-c52188b81868.png)

Big Data Service のクラスタ自体は CDH をベースにしているのですが、 OCI 特有のサービスとして Cloud SQL があります。画面上も説明されていますが、 HDFS や オブジェクト・ストア (OCi Object Storage や AWS S3 等)に対して、 RDBMS (Oracle Database) のインターフェースを介してアクセスできるようにするものです。 Cloud SQL のノードは、 Big Data Service クラスタの構築後に追加します。

Cloud SQL については興味深いのでまた別の機会に試してみます。

![image-20201126225913222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/f0fa1888-bacd-68cb-fb58-5e42ef8495c0.png)

ノードの一覧、詳細も確認できます。

![image-20201126225941117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/42b0d20c-2569-da08-053a-14437c36606a.png)

# Public IP アドレスの構成

Big Data Service のノードは、 Public Subnet にたてた場合でもデフォルトでは Private IP アドレスのみ構成されるため、各ノードや管理画面にアクセスするためには踏み台経由もしくは Public IP アドレスを割り当ててやる必要があります。

今回は以下のドキュメントに沿って、 Public IP アドレスを割り当てます。

[Map a Private IP Address to a Public IP Address](https://docs.oracle.com/en/cloud/paas/big-data-service/user/map-private-public-ip-adresses.html)

Public IP アドレスは Cloud Shell から OCI CLI を利用する方法で割り当てるやり方がガイドされています。

![image-20201126230954492.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/57ee56ee-999e-7550-f0ab-3f2ca74474e6.png)

上記ドキュメントの通り、以下を Cloud Shell で実行します。事前に確認しておくべきこととしては、「Subnet の OCID」、 Public IP アドレスを割り当てるノードの Private IP アドレスです。ここでは Utility Node に Public IP アドレスを振ります。なお、DISPLAY_NAME はオプションで、 Public IP 予約につける名称です。

```
export DISPLAY_NAME=testbdsun0
export SUBNET_OCID=ocid1.subnet.oc1.ap-tokyo-1.aaaaaaaahit2cop62r6gyxijyh4cbutva4nsua5axwctwc3eidubc2yazlmq
export PRIVATE_IP=10.0.0.10
oci network public-ip create --display-name $DISPLAY_NAME --compartment-id `oci network private-ip list --subnet-id $SUBNET_OCID --ip-address $PRIVATE_IP | jq -r '.data[] | ."compartment-id"'` --lifetime "RESERVED" --private-ip-id `oci network private-ip list --subnet-id $SUBNET_OCID --ip-address $PRIVATE_IP | jq -r '.data[] | ."id"'`
```

上記実行すると、以下のような結果が返ってきて、 Public IP アドレスが紐付けられます。

![image-20201126232126411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/0bfe652d-d09d-9d3f-4d02-a87eae159736.png)

これでインスタンスに SSH 接続できるようになりました。(22 ポートはあらかじめ開けています)

```
[opc@testbdsun0 ~]$ hostname -a
testbdsun0.sub11260434160.bdsvcn.oraclevcn.com. testbdsun0
```

ちなみにノードのインターフェースを確認してみると ens3 としてクラスタ・プライベート・ネットワークが構成されており、VCN 側のネットワークは ens5 として構成されています。

```
[opc@testbdsun0 ~]$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 02:00:17:01:74:eb brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.5/16 brd 10.1.255.255 scope global dynamic ens3
       valid_lft 68500sec preferred_lft 68500sec
3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 02:00:17:00:39:38 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.10/24 scope global ens5
       valid_lft forever preferred_lft forever
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:26:c0:3a:d2 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
8: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default 
    link/ether de:43:67:5c:a5:ce brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
9: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000
    link/ether da:2e:ba:ac:c6:07 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.1/24 brd 10.244.0.255 scope global cni0
       valid_lft forever preferred_lft forever
10: veth08322d14@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default 
    link/ether 1e:16:ad:d2:c9:40 brd ff:ff:ff:ff:ff:ff link-netnsid 1
11: vetha9d6e5ab@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default 
    link/ether 32:c5:dd:54:3d:bd brd ff:ff:ff:ff:ff:ff link-netnsid 2
12: vethfa5146a1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default 
    link/ether 4a:3d:05:cf:0d:a0 brd ff:ff:ff:ff:ff:ff link-netnsid 3
14: vethb0572403@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default 
    link/ether 5e:a5:10:fe:83:cf brd ff:ff:ff:ff:ff:ff link-netnsid 4
```

route -n してみると、デフォルトゲートウェイはクラスタ・プライベート・ネットワーク側(10.1.0.1)に向いていました。「ネットワーキング・オプション」のところで、 NAT ゲートウェイがクラスタ・プライベート・ネットワークに構成される、というのは個々に聞いてくるようです(「オラクル社が～」じゃなかったときにルーティングテーブルがどうなるのかは、すみません、確認できてません)

```
[opc@testbdsun0 ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.1.0.1        0.0.0.0         UG    0      0        0 ens3
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 ens5
10.1.0.0        0.0.0.0         255.255.0.0     U     0      0        0 ens3
10.244.0.0      0.0.0.0         255.255.255.0   U     0      0        0 cni0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 ens3
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens3
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
```

# Cloudera Manager 等へのアクセス

この後追加で Security List に必要なルールを追加して Cloudera Manager 等へアクセスしてみます。

![image-20201126232438455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/d22fa67e-9fd1-7611-1ece-a46e5d0da74f.png)

ドキュメントによれば、以下のポートで構成されているとのことです(Cloud SQL のポートが 1521 っていうのがオラクルっぽい)。

- Cloudera Manager - port `7183`

- Hue - port `8888`

- Web Resource Manager - port `8090`

- Spark History Server - port `18088`

- Cloud SQL (if Cloud SQL is installed) - port `1521`

  あんまり良くないかとも思ったのですが、テスト用なので、とりあえずアクセス元の IP アドレスだけ制御して上記ポートをあけます。

![image-20201126232821624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/873b9fea-6d37-bc23-d964-81fdeba4e361.png)

上記追加したら、 Cloudera Manager にアクセスします。以下のアドレスでアクセス可能です。

https://*<ユーティリティノードのip_address>*:7183

セキュリティの警告等が出るかと思いますが進めます。画面が表示されましたら、ユーザ名は admin / パスワードはインスタンス構築時に指定したクラスタ管理パスワードでログインします。

![image-20201126233219898.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/55e4092c-7566-8424-d253-758d365f36f8.png)

Cloudera Manager の画面が確認できました。 HDFS / Hive / Hue / Oozie / Spark 等が構成されていることが確認できます。

![image-20201126233339562.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131447/55491d36-de3b-f834-568b-b1da6d2b3653.png)

# まとめ

今回は Big Data Service のインスタンスをとりあえず作ってみました。ネットワークの設定等、ちょっとあらけずり感のあるところもありますが、 Cloudera 環境を OCI 上でかんたんに構成することができました。

今後 Cloud SQL や他のサービスとの連携についても考えてみたいと思います。