LoginSignup
7
7

More than 5 years have passed since last update.

Cloudera Enterprise 5.10でApache Kuduを使う

Last updated at Posted at 2017-02-09

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

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7