Edited at

Cloudera Enterprise 5.10でApache Kuduを使う

More than 1 year has passed since last update.


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

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


CDHをアップデート

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

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

元の設定

変更後


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

少し待つとCDH5.10が表示されます。「アップグレード」ボタンを押します

アップグレードウィザードが開始したら画面の指示に従って更新します。

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

無事にCDH5.10へのアップグレードが完了しました。


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

[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をダウンロードし、配布、アクティベートします。


Kuduサービスの追加

Cloudera Managerのトップ画面のメニューからサービスの追加を選び、KUDUを選択します。

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


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

今回は擬似分散環境なので、両方ともに quickstart.cloudera を選択します。


設定の確認

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


完了

以上でサービスの追加は完了です。


Apache Kudu サービスを起動する

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

さぁ、右側の三角をクリックしてサービスを開始しましょう。

この時、手元の環境では 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クエリエディタからもクエリできます。

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