Cloudera Enterprise 5.10でApache Kuduを使う

  • 4
    いいね
  • 0
    コメント

Apache Kudu

  • Apacheライセンスなオープンソースの分散ストレージエンジン
  • 低遅延でランダムアクセスできる高速なカラムナストレージ
  • Apache Impala (Incubating)と組み合わせればSQLでもアクセスできる
  • 行の追加、更新、削除ができる

Kuduの情報

2015年秋のStrata+Hadoop World 2015で発表された後、プロダクション環境やベータテストなどを経て、ついにCloudera Enterprise 5.10からApache Kuduがサポート対象になりました。

サポート対象にはなっていますが、Kuduはまだ素のCDHには含まれていないため、他のサービス (ImpalaやHDFSなど)とは若干インストール手順が異なります。ハマる方もいると思うので、手元のQuickstart VMの環境に導入した手順を紹介します。

環境

  • Cloudera Quickstart VM 5.8
  • Apache Kudu 1.2

Quickstart VMをアップグレード

Cloudera Quickstart VM(以下Quickstart VM)は擬似分散環境でHadoopを手っ取り早く試すことができる仮想マシンイメージです。現時点ではKudu入りのバージョンは公開されていないので、手元のQuickstart VM 5.8をアップグレードし、Kuduを導入します。

Quickstart VMの導入方法はこちらの記事も参考になります。
* http://linux.wwing.net/WordPress/?p=2735
* http://qiita.com/zaburo/items/f45e000e78f5f9043d83

Cloudera Managerをアップデート

まずはCloudera Managerを5.10にアップグレードします。終わったら再起動します。

[cloudera@quickstart ~]$ sudo yum update cloudera-manager-*
Loaded plugins: fastestmirror, security
Setting up Update Process
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.jaist.ac.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package cloudera-manager-agent.x86_64 0:5.8.0-1.cm580.p0.42.el6 will be updated
---> Package cloudera-manager-agent.x86_64 0:5.10.0-1.cm5100.p0.85.el6 will be an update
base/filelists_db                                        | 6.4 MB     00:01     
cloudera-cdh5/filelists                                  | 402 kB     00:00     
cloudera-gplextras5/filelists                            | 4.8 kB     00:00     
cloudera-kafka/filelists                                 | 2.4 kB     00:00     
cloudera-manager/filelists                               | 113 kB     00:00     
...
(略)
...
  Verifying  : cloudera-manager-daemons-5.10.0-1.cm5100.p0.85.el6.x86_64    2/6 
  Verifying  : cloudera-manager-agent-5.10.0-1.cm5100.p0.85.el6.x86_64      3/6 
  Verifying  : cloudera-manager-server-5.8.0-1.cm580.p0.42.el6.x86_64       4/6 
  Verifying  : cloudera-manager-daemons-5.8.0-1.cm580.p0.42.el6.x86_64      5/6 
  Verifying  : cloudera-manager-agent-5.8.0-1.cm580.p0.42.el6.x86_64        6/6 

Updated:
  cloudera-manager-agent.x86_64 0:5.10.0-1.cm5100.p0.85.el6                     
  cloudera-manager-daemons.x86_64 0:5.10.0-1.cm5100.p0.85.el6                   
  cloudera-manager-server.x86_64 0:5.10.0-1.cm5100.p0.85.el6                    

Complete!
[cloudera@quickstart ~]$ sudo reboot

再起動したらバージョンを確認しておきましょう

FireShot Capture 021 - ホーム - Cloudera Manager - http___quickstart.cloudera_7180_cmf_home.png

FireShot Capture 020 - ホーム - Cloudera Manager - http___quickstart.cloudera_7180_cmf_home.png

CDHをアップデート

Cloudera Managerは5.10にアップグレードできましたが、まだCDHは5.8のままです。CDH 5.10の新しいParcelをダウンロードできるようにしましょう。
FireShot Capture 022 - Parcel - Cloud__ - http___quickstart.cloudera_7180_cm.png

設定ボタンを押してParcelの設定を変更します。

元の設定
FireShot Capture 023 - Parcel - Cloud__ - http___quickstart.cloudera_7180_cm.png

変更後
FireShot Capture 024 - Parcel - Cloud__ - http___quickstart.cloudera_7180_cm.png

CDH5.10へのアップグレード

少し待つとCDH5.10が表示されます。「アップグレード」ボタンを押します
FireShot Capture 026 - Parcel - Cloud__ - http___quickstart.cloudera_7180_cm.png

アップグレードウィザードが開始したら画面の指示に従って更新します。
FireShot Capture 027 - Cloudera Quick__ - http___quickstart.cloudera_7180_cm.png

7つのステップを経て、最終的に次のような画面が表示されるはずです。

FireShot Capture 034 - Cloudera Quick__ - http___quickstart.cloudera_7180_cm.png

無事にCDH5.10へのアップグレードが完了しました。
FireShot Capture 035 - ホーム - Cloudera Manager - http___quickstart.cloudera_7180_cmf_home.png

Apache Kuduをインストールする

CDH5がリリースされた3年前の時点では、Kuduはリリースされていませんでした。(当然ですが...)
そのため、新しいサービスであるKuduは、CDH5とは別のパッケージで提供されています。次のCDHのメジャーバージョンではきっと簡単に導入できるようになるでしょう。

Kuduをインストールするためのアドオンファイルをダウンロード

現時点ではKuduはアドオン形式で提供されています。下記のリンクからCSD(custom service descriptor)ファイル[1]をダウンロードし、Cloudera Managerからセットアップできるようにします。
http://www.cloudera.com/downloads/kudu/1-2-0.html

kudu_home.png

[1] CSDについて http://www.cloudera.com/documentation/enterprise/latest/topics/cm_mc_addon_services.html#concept_kpt_spj_bn

ダウンロードしたjarファイルを所定の場所に配置

CSDファイルをダウンロードし、パーミッション、オーナー/グループを変更して再起動します。(Cloudera Managerサービスの再起動でも構いません)

$ sudo mv KUDU-5.10.0.jar /opt/cloudera/csd/
$ sudo chmod 644 /opt/cloudera/csd/KUDU-5.10.0.jar 
$ sudo chown cloudera-scm:cloudera-scm /opt/cloudera/csd/KUDU-5.10.0.jar 
$ sudo reboot

Kudu Parcelのダウンロードとアクティベート

これでParcelのダウンロードができるようになります。スクリーンショットのようにKuduをダウンロードし、配布、アクティベートします。

FireShot Capture 020 - Parcel - Cloud__ - http___quickstart.cloudera_7180_cm.png

FireShot Capture 021 - Parcel - Cloud__ - http___quickstart.cloudera_7180_cm.png

Kuduサービスの追加

Cloudera Managerのトップ画面のメニューからサービスの追加を選び、KUDUを選択します。
スクリーンショット 2017-02-10 1.16.37.png

ウィザードが開始します。

ロール割り当てのカスタマイズ

今回は擬似分散環境なので、両方ともに quickstart.cloudera を選択します。
FireShot Capture 022 - Kudu サービスを Clo__ - http___quickstart.cloudera_7180_cm.png

設定の確認

Kudu MasterとTablet Serverが利用するWALとデータのディレクトリを指定します。
今回はあらかじめ下記のように作成しておきました。

$ sudo mkdir /var/lib/kudu/master
$ sudo mkdir /var/lib/kudu/tserver
$ sudo chown kudu:kudu /var/lib/kudu/master/
$ sudo chown kudu:kudu /var/lib/kudu/tserver

FireShot Capture 024 - Kudu サービスを Clo__ - http___quickstart.cloudera_7180_cm.png

完了

以上でサービスの追加は完了です。
FireShot Capture 025 - Kudu サービスを Clo__ - http___quickstart.cloudera_7180_cm.png

Apache Kudu サービスを起動する

Cloudera Manager のトップページにも Kudu が表示されています。

スクリーンショット 2017-02-10 2.50.11.png

さぁ、右側の三角をクリックしてサービスを開始しましょう。
スクリーンショット 2017-02-10 1.23.18.png

この時、手元の環境では MasterやTablet Server の起動に失敗しました。NTPの時刻同期が行われていない場合に生じる問題のようなので、うまくいかない場合はしばらく待ってからサービスを開始すると良いでしょう。(Quickstart VMではntpサービスが動作しています)
https://kudu.apache.org/docs/troubleshooting.html#ntp

Kuduを使ってみる

Kuduのサービスが開始したので、Imaplaから使ってみましょう。
Quickstart VMにはあらかじめHive/Impalaのテーブルが用意されています。

[cloudera@quickstart ~]$ impala-shell 
Starting Impala Shell without Kerberos authentication
Connected to quickstart.cloudera:21000
Server version: impalad version 2.7.0-cdh5.10.0 RELEASE (build 785a073cd07e2540d521ecebb8b38161ccbd2aa2)
***********************************************************************************
Welcome to the Impala shell.
(Impala Shell v2.7.0-cdh5.10.0 (785a073) built on Fri Jan 20 12:03:56 PST 2017)

Want to know what version of Impala you're connected to? Run the VERSION command to
find out!
***********************************************************************************
[quickstart.cloudera:21000] > SHOW TABLES;
Query: show TABLES
+---------------+
| name          |
+---------------+
| array         |
| categories    |
| customers     |
| departments   |
| jptablec      |
| order_items   |
| orders        |
| parquet_array |
| parray        |
| products      |
+---------------+
Fetched 10 row(s) in 0.45s
[quickstart.cloudera:21000] > 

Kudu用のテーブルを作成する

CTAS (Create Table As Select)を使って、既存のテーブルから Kuduのテーブルを作成します。
この際、TBLPROPERTIES等でKuduのMasterを指定してください。また、今回はTablet Serverが1つしかないのでレプリカを1にしています。

[quickstart.cloudera:21000] > CREATE TABLE kudu_products
                            > PRIMARY KEY (product_id)
                            > PARTITION BY HASH(product_id) PARTITIONS 8
                            > STORED AS KUDU
                            > TBLPROPERTIES('kudu.master_addresses' = 'quickstart.cloudera:7051',
                            > 'kudu.num_tablet_replicas'='1')
                            > AS SELECT * FROM products;
Query: create TABLE kudu_products
PRIMARY KEY (product_id)
PARTITION BY HASH(product_id) PARTITIONS 8
STORED AS KUDU
TBLPROPERTIES('kudu.master_addresses' = 'quickstart.cloudera:7051',
'kudu.num_tablet_replicas'='1')
AS SELECT * FROM products
+----------------------+
| summary              |
+----------------------+
| Inserted 1345 row(s) |
+----------------------+
Fetched 1 row(s) in 3.37s
[quickstart.cloudera:21000] > 

クエリを行う

これでImaplaからクエリを行うことができます。1回目のクエリは多少時間がかかってますね。

[quickstart.cloudera:21000] > SELECT COUNT(*) FROM kudu_products;
Query: select COUNT(*) FROM kudu_products
Query submitted at: 2017-02-10 01:49:29 (Coordinator: http://quickstart.cloudera:25000)
Query progress can be monitored at: http://quickstart.cloudera:25000/query_plan?query_id=b64665e932d075bf:d00505ab00000000
+----------+
| count(*) |
+----------+
| 1345     |
+----------+
Fetched 1 row(s) in 5.91s
[quickstart.cloudera:21000] > SELECT COUNT(*) FROM kudu_products;
Query: select COUNT(*) FROM kudu_products
Query submitted at: 2017-02-10 01:49:39 (Coordinator: http://quickstart.cloudera:25000)
Query progress can be monitored at: http://quickstart.cloudera:25000/query_plan?query_id=cc4715f6b0b6189b:19eef11800000000
+----------+
| count(*) |
+----------+
| 1345     |
+----------+
Fetched 1 row(s) in 0.15s
[quickstart.cloudera:21000] > 

JOIN

Parquet形式のテーブルとKuduのテーブルの結合も普通にできます。

[quickstart.cloudera:21000] > SELECT kudu_products.product_name,
                            >        order_items.order_item_product_price
                            > FROM kudu_products
                            > JOIN order_items ON kudu_products.product_id = order_items.order_item_id
                            > ORDER BY kudu_products.product_id LIMIT 10
                            > ;
Query: select kudu_products.product_name,
       order_items.order_item_product_price
FROM kudu_products
JOIN order_items ON kudu_products.product_id = order_items.order_item_id
ORDER BY kudu_products.product_id LIMIT 10
Query submitted at: 2017-02-10 02:19:47 (Coordinator: http://quickstart.cloudera:25000)
Query progress can be monitored at: http://quickstart.cloudera:25000/query_plan?query_id=37499dd264968128:3985140900000000
+-----------------------------------------------+--------------------------+
| product_name                                  | order_item_product_price |
+-----------------------------------------------+--------------------------+
| Quest Q64 10 FT. x 10 FT. Slant Leg Instant U | 299.9800109863281        |
| Under Armour Men's Highlight MC Football Clea | 199.9900054931641        |
| Under Armour Men's Renegade D Mid Football Cl | 50                       |
| Under Armour Men's Renegade D Mid Football Cl | 129.9900054931641        |
| Riddell Youth Revolution Speed Custom Footbal | 24.98999977111816        |
| Jordan Men's VI Retro TD Football Cleat       | 59.9900016784668         |
| Schutt Youth Recruit Hybrid Custom Football H | 50                       |
| Nike Men's Vapor Carbon Elite TD Football Cle | 49.97999954223633        |
| Nike Adult Vapor Jet 3.0 Receiver Gloves      | 299.9800109863281        |
| Under Armour Men's Highlight MC Football Clea | 59.9900016784668         |
+-----------------------------------------------+--------------------------+
Fetched 10 row(s) in 0.36s
[quickstart.cloudera:21000] > 

テーブルの詳細を表示

[quickstart.cloudera:21000] > DESCRIBE FORMATTED kudu_products;
Query: describe FORMATTED kudu_products
+------------------------------+-------------------------------------------------------------------+-------------------------------------------+
| name                         | type                                                              | comment                                   |
+------------------------------+-------------------------------------------------------------------+-------------------------------------------+
| # col_name                   | data_type                                                         | comment                                   |
|                              | NULL                                                              | NULL                                      |
| product_id                   | int                                                               | NULL                                      |
| product_category_id          | int                                                               | NULL                                      |
| product_name                 | string                                                            | NULL                                      |
| product_description          | string                                                            | NULL                                      |
| product_price                | float                                                             | NULL                                      |
| product_image                | string                                                            | NULL                                      |
|                              | NULL                                                              | NULL                                      |
| # Detailed Table Information | NULL                                                              | NULL                                      |
| Database:                    | default                                                           | NULL                                      |
| Owner:                       | cloudera                                                          | NULL                                      |
| CreateTime:                  | Fri Feb 10 01:47:41 JST 2017                                      | NULL                                      |
| LastAccessTime:              | UNKNOWN                                                           | NULL                                      |
| Protect Mode:                | None                                                              | NULL                                      |
| Retention:                   | 0                                                                 | NULL                                      |
| Location:                    | hdfs://quickstart.cloudera:8020/user/hive/warehouse/kudu_products | NULL                                      |
| Table Type:                  | MANAGED_TABLE                                                     | NULL                                      |
| Table Parameters:            | NULL                                                              | NULL                                      |
|                              | COLUMN_STATS_ACCURATE                                             | false                                     |
|                              | DO_NOT_UPDATE_STATS                                               | true                                      |
|                              | kudu.master_addresses                                             | quickstart.cloudera:7051                  |
|                              | kudu.num_tablet_replicas                                          | 1                                         |
|                              | kudu.table_name                                                   | impala::default.kudu_products             |
|                              | numFiles                                                          | 0                                         |
|                              | numRows                                                           | -1                                        |
|                              | rawDataSize                                                       | -1                                        |
|                              | storage_handler                                                   | com.cloudera.kudu.hive.KuduStorageHandler |
|                              | totalSize                                                         | 0                                         |
|                              | transient_lastDdlTime                                             | 1486658970                                |
|                              | NULL                                                              | NULL                                      |
| # Storage Information        | NULL                                                              | NULL                                      |
| SerDe Library:               |                                                                   | NULL                                      |
| InputFormat:                 | org.apache.kudu.mapreduce.KuduTableInputFormat                    | NULL                                      |
| OutputFormat:                | org.apache.kudu.mapreduce.KuduTableOutputFormat                   | NULL                                      |
| Compressed:                  | No                                                                | NULL                                      |
| Num Buckets:                 | 0                                                                 | NULL                                      |
| Bucket Columns:              | []                                                                | NULL                                      |
| Sort Columns:                | []                                                                | NULL                                      |
+------------------------------+-------------------------------------------------------------------+-------------------------------------------+
Fetched 39 row(s) in 0.02s
[quickstart.cloudera:21000] > 

UPSERT を使ってみる

Kuduはデータを更新できるのが魅力です。せっかくなので単純にUPDATEするのではなく、CDH5.10以降で利用できる UPSERT を使ってみます。
https://www.cloudera.com/documentation/enterprise/latest/topics/impala_upsert.html

UPSERTは、以下のような挙動になります。
- 主キーが存在する場合はUPDATEする
- 主キーが存在しない場合はINSERTする

主キーが存在する行と、主キーが存在しない行に対してUPSERTを試してみます。

このテーブルの一番小さなproduct_idは1でした。

[quickstart.cloudera:21000] > SELECT * FROM kudu_products ORDER BY product_id LIMIT 1;
Query: select * FROM kudu_products ORDER BY product_id LIMIT 1
Query submitted at: 2017-02-10 01:53:21 (Coordinator: http://quickstart.cloudera:25000)
Query progress can be monitored at: http://quickstart.cloudera:25000/query_plan?query_id=be4b9af50163a1d4:cbaaf50700000000
+------------+---------------------+-----------------------------------------------+---------------------+-------------------+---------------------------------------------------------------------------------------+
| product_id | product_category_id | product_name                                  | product_description | product_price     | product_image                                                                         |
+------------+---------------------+-----------------------------------------------+---------------------+-------------------+---------------------------------------------------------------------------------------+
| 1          | 2                   | Quest Q64 10 FT. x 10 FT. Slant Leg Instant U |                     | 59.97999954223633 | http://images.acmesports.sports/Quest+Q64+10+FT.+x+10+FT.+Slant+Leg+Instant+Up+Canopy |
+------------+---------------------+-----------------------------------------------+---------------------+-------------------+---------------------------------------------------------------------------------------+
Fetched 1 row(s) in 0.29s

UPSERTを行い、更新されているかどうかを確認します。

[quickstart.cloudera:21000] > UPSERT INTO kudu_products (product_id, product_category_id, product_name, product_description, product_price, product_image) VALUES (1, 2, 'Hadoop XXX', '', 100,'');
Query: upsert INTO kudu_products (product_id, product_category_id, product_name, product_description, product_price, product_image) VALUES (1, 2, 'Hadoop XXX', '', 100,'')
Query submitted at: 2017-02-10 01:59:20 (Coordinator: http://quickstart.cloudera:25000)
Query progress can be monitored at: http://quickstart.cloudera:25000/query_plan?query_id=af418323c2444c50:fb36d6cc00000000
Modified 1 row(s), 0 row error(s) in 0.12s
[quickstart.cloudera:21000] > SELECT * FROM kudu_products ORDER BY product_id LIMIT 1;
Query: select * FROM kudu_products ORDER BY product_id LIMIT 1
Query submitted at: 2017-02-10 01:59:26 (Coordinator: http://quickstart.cloudera:25000)
Query progress can be monitored at: http://quickstart.cloudera:25000/query_plan?query_id=d543d9f6cd01a03d:3931c08700000000
+------------+---------------------+--------------+---------------------+---------------+---------------+
| product_id | product_category_id | product_name | product_description | product_price | product_image |
+------------+---------------------+--------------+---------------------+---------------+---------------+
| 1          | 2                   | Hadoop XXX   |                     | 100           |               |
+------------+---------------------+--------------+---------------------+---------------+---------------+
Fetched 1 row(s) in 0.26s
[quickstart.cloudera:21000] > 

続いて主キーが存在しないデータ (0) をUPSERTしてみます。

[quickstart.cloudera:21000] > UPSERT INTO kudu_products (product_id, product_category_id, product_name, product_description, product_price, product_image) VALUES (0, 1, 'Kudu', 'Kudu is Great!!', 10000000,'');
Query: upsert INTO kudu_products (product_id, product_category_id, product_name, product_description, product_price, product_image) VALUES (0, 1, 'Kudu', 'Kudu is Great!!', 10000000,'')
Query submitted at: 2017-02-10 02:08:24 (Coordinator: http://quickstart.cloudera:25000)
Query progress can be monitored at: http://quickstart.cloudera:25000/query_plan?query_id=fc4b8470192884bf:4b69c19400000000
Modified 1 row(s), 0 row error(s) in 0.11s
[quickstart.cloudera:21000] > SELECT * FROM kudu_products ORDER BY product_id LIMIT 1;Query: select * FROM kudu_products ORDER BY product_id LIMIT 1
Query submitted at: 2017-02-10 02:08:29 (Coordinator: http://quickstart.cloudera:25000)
Query progress can be monitored at: http://quickstart.cloudera:25000/query_plan?query_id=bc4865353e9f8e46:9085e43300000000
+------------+---------------------+--------------+---------------------+---------------+---------------+
| product_id | product_category_id | product_name | product_description | product_price | product_image |
+------------+---------------------+--------------+---------------------+---------------+---------------+
| 0          | 1                   | Kudu         | Kudu is Great!!     | 10000000      |               |
+------------+---------------------+--------------+---------------------+---------------+---------------+
Fetched 1 row(s) in 0.25s
[quickstart.cloudera:21000] > 

Hueからクエリする

HueのImpalaクエリエディタからもクエリできます。
スクリーンショット 2017-02-10 2.28.37.png

HueのKudu対応は着々と進んでいるようですが、CDH5.10のHue3.11ではいくつか制約があるので注意が必要ですね。
https://issues.cloudera.org/browse/HUE-4908?jql=project%20%3D%20HUE%20AND%20text%20~%20%22kudu%22%20ORDER%20BY%20created%20DESC