hadoop-logo
ようこそ Tech blogへ!
「これからHadoopを勉強しよう」という方はまず下記のページから

サイトの移行に伴って画像が表示されないなどの不具合が生じています

Kuduを仮想化環境で動かしてみる

KuduにはQuickstartが用意されており、実機がなくてもVirtualBoxの仮想マシン上で動かしてみることができるようです。
Kudu Quickstart:http://getkudu.io/docs/quickstart.html
早速手元の環境で実行してみました。ダウンロード時間を含めて一通り実行しても30分もかからないので、興味のある方は是非。(ダウンロード時間次第)

※VirtualBoxのインストールについては割愛します。事前に準備しておいてください。ダウンロードは下記から行えます。
https://www.virtualbox.org/wiki/Downloads
余談:なぜか手元の環境では、VirtualBoxのホストオンリーネットワーク(vboxnet3)へのルーティングが正しく行われず、インストール後にホストからゲストへのネットワークが接続できないという問題が生じていました。ワークアラウンドとして、ターミナルから以下のコマンドを実行して回避したので、もしsshで接続できなかったら試してみてください。(IPアドレスは変更する必要があるかもしれません)
[code]
sudo route add -net 192.168.59.0/24 -interface vboxnet3
[/code]

インストール

以下のコマンドを実行すると、KuduのQuickstartに利用する仮想マシンイメージをダウンロードして、仮想マシンにファイルのセットアップなどを行ってくれます。
[code]
$ curl -s https://raw.githubusercontent.com/cloudera/kudu-examples/master/demo-vm-setup/bootstrap.sh | bash
[/code]
 
[code]
$ curl -s https://raw.githubusercontent.com/cloudera/kudu-examples/master/demo-vm-setup/bootstrap.sh | bash
+ : https://github.com/cloudera/kudu-examples.git
+ git clone https://github.com/cloudera/kudu-examples.git
Cloning into ‘kudu-examples’…
remote: Counting objects: 289, done.
remote: Total 289 (delta 0), reused 0 (delta 0), pack-reused 289
Receiving objects: 100% (289/289), 58.25 KiB | 0 bytes/s, done.
Resolving deltas: 100% (96/96), done.
Checking connectivity… done.
+ pushd kudu-examples
~/Documents/vm/kudu-examples ~/Documents/vm
+ pushd demo-vm-setup
~/Documents/vm/kudu-examples/demo-vm-setup ~/Documents/vm/kudu-examples ~/Documents/vm
+ ./setup-kudu-demo-vm.sh
Downloading Virtualbox Image file: http://cloudera-kudu-beta.s3.amazonaws.com/cloudera-quickstart-vm-5.4.2-kudu-virtualbox.ova
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1257M 100 1257M 0 0 1947k 0 0:11:01 0:11:01 –:–:– 5470k
0%…10%…20%…30%…40%…50%…60%…70%…80%…90%…100%
Interface ‘vboxnet4’ was successfully created
Importing VM cloudera-quickstart-vm-5.4.2-kudu-virtualbox.ova…
0%…10%…20%…30%…40%…50%…60%…70%…80%…90%…100%
Interpreting /Users/kawasaki/Documents/vm/kudu-examples/demo-vm-setup/cloudera-quickstart-vm-5.4.2-kudu-virtualbox.ova…
OK.
Disks: vmdisk1 68719476736 -1 http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized cloudera-quickstart-vm-5.4.2-kudu-virtualbox-disk1.vmdk -1 -1
Virtual system 0:
0: Suggested OS type: "RedHat_64"
(change with "–vsys 0 –ostype <type>"; use "list ostypes" to list all possible values)
1: VM name specified with –vmname: "kudu-demo"
2: No. of CPUs specified with –cpus: 2
3: Guest memory specified with –memory: 6144 MB
4: Network adapter: orig NAT, config 3, extra slot=0;type=NAT
5: Network adapter: orig NAT, config 3, extra slot=1;type=NAT
6: CD-ROM
(disable with "–vsys 0 –unit 6 –ignore")
7: IDE controller, type PIIX4
(disable with "–vsys 0 –unit 7 –ignore")
8: IDE controller, type PIIX4
(disable with "–vsys 0 –unit 8 –ignore")
9: Hard disk image: source image=cloudera-quickstart-vm-5.4.2-kudu-virtualbox-disk1.vmdk, target path=/Users/kawasaki/VirtualBox VMs/cloudera-quickstart-vm-5.4.2-kudu-virtualbox/cloudera-quickstart-vm-5.4.2-kudu-virtualbox-disk1.vmdk, controller=7;channel=0
(change target path with "–vsys 0 –unit 9 –disk path";
disable with "–vsys 0 –unit 9 –ignore")
0%…10%…20%…30%…40%…50%…60%…70%…80%…90%…100%
Successfully imported the appliance.
Waiting for VM "kudu-demo" to power on…
VM "kudu-demo" has been successfully started.
Wait until services become available.
Updating the /etc/hosts file requires sudo rights.
Password:
=========================================================================
Kudu Quickstart VM installed successfully
To use the C++ and Python examples from this repository, you have to SSH
to the VM using the user ‘demo’ with the password ‘demo’.
You can use this command: ssh demo@quickstart.cloudera
You’ll find the examples mounted as a shared folder at /media/sf_examples
+ popd
~/Documents/vm/kudu-examples ~/Documents/vm
Tatsuo-no-MacBook-Pro:vm kawasaki$ ping quickstart.cloudera
PING quickstart.cloudera (192.168.60.100): 56 data bytes
64 bytes from 192.168.60.100: icmp_seq=0 ttl=64 time=0.303 ms
^C
— quickstart.cloudera ping statistics —
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.303/0.303/0.303/0.000 ms
[/code]
自動的にVirtualBoxが起動します。
kudu_quickstart_vm仮想マシンの起動直後、bootstrap.shを実行したターミナル内で、sudoで利用するパスワードが聞かれます。(/etc/hostsを変更するため?)。忘れずに入力しておきましょう。
起動したらターミナルからsshで接続します。パスワードはdemoです。
[code]
$ ssh demo@quickstart.cloudera
demo@quickstart.cloudera’s password:
Last login: Mon Sep 28 09:15:26 2015 from 192.168.60.1
$
[/code]
これで準備完了です。

データをロードする

以下の手順に従い、HDFSにデータをロードします。
http://getkudu.io/docs/quickstart.html#_load_data
[code]
$ hdfs dfs -mkdir /data
$ hdfs dfs -put examples/SFO_Passenger_Data/MonthlyPassengerData_200507_to_201506.csv /data
[/code]

Impalaシェルの開始

別のターミナルを開いて、以下のコマンドを実行してImpalaを開始します。
[code]
$ ssh demo@quickstart.cloudera -t impala-shell
demo@quickstart.cloudera’s password:
Starting Impala Shell without Kerberos authentication
Connected to quickstart.cloudera:21000
Server version: impalad version 2.3.0-IMPALA_KUDU-cdh5 RELEASE (build 6b0b0c08de605a907c659f0c0f8bbadae9a40825)
Welcome to the Impala shell. Press TAB twice to see a list of available commands.
Copyright (c) 2012 Cloudera, Inc. All rights reserved.
(Shell build version: Impala Shell v2.3.0-IMPALA_KUDU-cdh5 (6b0b0c0) built on Sat Sep 26 23:16:31 PDT 2015)
[quickstart.cloudera:21000] >
[/code]
 

外部テーブルを作成する

シェルから以下のクエリを実行して、外部テーブルを作成します。なお、ここで作成するテーブルではKuduを利用していません。
[code]
CREATE EXTERNAL TABLE passenger_data_raw (
id int,
activity_period int,
operating_airline string,
airline_iata_code string,
published_airline string,
published_airline_iata_code string,
geo_summary string,
geo_region string,
activity_type_code string,
price_category_code string,
terminal string,
boarding_area string,
passenger_count bigint
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘,’
LOCATION ‘/data/’;
[/code]
 

クエリを実行する

以下のクエリを実行してみます。件数は13901件と表示されていますね。
[code]
[quickstart.cloudera:21000] > SELECT count(*) FROM passenger_data_raw;
Query: select count(*) FROM passenger_data_raw
+———-+
| count(*) |
+———-+
| 13901 |
+———-+
Fetched 1 row(s) in 5.53s
[/code]

Kuduに新しいテーブルを作成する

CREATE TABLE AS SELECTを利用して、上記のテーブルからKuduのテーブルを作成します。
[code]
CREATE TABLE passenger_data TBLPROPERTIES(
‘storage_handler’ = ‘com.cloudera.kudu.hive.KuduStorageHandler’,
‘kudu.table_name’ = ‘passenger_data’,
‘kudu.master_addresses’ = ‘127.0.0.1’,
‘kudu.key_columns’ = ‘id’
) AS SELECT * FROM passenger_data_raw;
[/code]
次のようなメッセージが出力され、Kuduにデータが格納されました。
[code]
[quickstart.cloudera:21000] > CREATE TABLE passenger_data
> TBLPROPERTIES(
> ‘storage_handler’ = ‘com.cloudera.kudu.hive.KuduStorageHandler’,
> ‘kudu.table_name’ = ‘passenger_data’,
> ‘kudu.master_addresses’ = ‘127.0.0.1’,
> ‘kudu.key_columns’ = ‘id’
> ) AS SELECT * FROM passenger_data_raw;
Query: create TABLE passenger_data
TBLPROPERTIES(
‘storage_handler’ = ‘com.cloudera.kudu.hive.KuduStorageHandler’,
‘kudu.table_name’ = ‘passenger_data’,
‘kudu.master_addresses’ = ‘127.0.0.1’,
‘kudu.key_columns’ = ‘id’
) AS SELECT * FROM passenger_data_raw
+———————–+
| summary |
+———————–+
| Inserted 13901 row(s) |
+———————–+
WARNINGS: Error converting column: 12 TO BIGINT (Data is: Other)
file: hdfs://quickstart.cloudera:8020/data/MonthlyPassengerData_200507_to_201506.csv
record:
11381,201309,"Atlas Air, Inc",5Y,"Atlas Air, Inc",5Y,Domestic,US,Deplaned,Other,Other,Other,65
Error converting column: 12 TO BIGINT (Data is: Other)
file: hdfs://quickstart.cloudera:8020/data/MonthlyPassengerData_200507_to_201506.csv
record:
11382,201309,"Atlas Air, Inc",5Y,"Atlas Air, Inc",5Y,Domestic,US,Thru / Transit,Other,Other,Other,3
Fetched 1 row(s) in 2.76s
[quickstart.cloudera:21000] >
[/code]
これでKuduにデータの投入は完了です。

データの読み出しと修正

HDFSと違い、Kuduに格納しているデータは挿入、変更などを行うこともできます。さっそく手順に従って実行してみましょう。
まずはデータを読み出します。クエリを実行すると、以下のような結果が返ってきます。
[code]
SELECT sum(passenger_count) AS total, operating_airline FROM passenger_data
GROUP BY operating_airline
HAVING total IS NOT null
ORDER BY total DESC LIMIT 10;
+———–+———————————-+
| total | operating_airline |
+———–+———————————-+
| 105363917 | United Airlines – Pre 07/01/2013 |
| 51319845 | United Airlines |
| 32657456 | SkyWest Airlines |
| 31727343 | American Airlines |
| 23801507 | Delta Air Lines |
| 23685267 | Virgin America |
| 22507320 | Southwest Airlines |
| 16235520 | US Airways |
| 11860630 | Alaska Airlines |
| 6706438 | JetBlue Airways |
+———–+———————————-+
[/code]
このデータの operating_airlineの中から、 United Airlines – Pre 07/01/2013 という値を変更します。
[code]
UPDATE passenger_data SET operating_airline="United Airlines" WHERE operating_airline LIKE "United Airlines – Pre%";
[/code]
先ほどと同じクエリを実行すると、データが変更されていることがわかります。
[code]
SELECT sum(passenger_count) AS total, operating_airline FROM passenger_data
GROUP BY operating_airline
HAVING total IS NOT null
ORDER BY total DESC LIMIT 10;
+———–+——————–+
| total | operating_airline |
+———–+——————–+
| 156683762 | United Airlines |
| 32657456 | SkyWest Airlines |
| 31727343 | American Airlines |
| 23801507 | Delta Air Lines |
| 23685267 | Virgin America |
| 22507320 | Southwest Airlines |
| 16235520 | US Airways |
| 11860630 | Alaska Airlines |
| 6706438 | JetBlue Airways |
| 6266220 | Northwest Airlines |
+———–+——————–+
[/code]
おお、普通に使えますね。
これで、HDFSにデータがあるときには考えられなかった、Impalaを使ったUPDATEやINSERT処理、Parquetフォーマットと同じようにクエリが実行できます。
次のImpalaのバージョンでImpalaがネスト型に対応すれば、さらに幸せな分析ライフを送ることができるかもしれません♪
(注:Kuduはまだβ版)

余談:スクリーンショットs

Kudu-ImpalaとKuduのマスター、タブレットサーバーのWebUIのスクリーンショットです。

Impalad

impala_kudu1ImpaladのところにIMPALA_KUDUというのが見えますね。
impala_kudu2クエリの結果です。右側のDetailsをクリックすると、下記のような実行計画がグラフィカル?に表示されます。

KuduのWebUI

KuduのWebUIで利用するポート番号は 8051 と8050 です。まずはmasterから。
kudu_master続いてTablet Server。
kudu_tablet

次のステップ

KuduはImpalaのためのストレージエンジンではありません。KuduのAPIを使用することで、JavaやSparkのアプリケーションからデータを読み書きすることができます。(将来的にはPythonも)

Javaによるアプリケーションの例

https://github.com/cloudera/kudu-examples/blob/master/java/java-sample/src/main/java/org/kududb/examples/sample/Sample.java

コメント