ConoHaでお手軽Hadoop&Spark開発
筆者が所属している次世代システム研究室では,
ConoHaで構築するHadoopクラスタのインスタンス構成と料金
試験などのための開発環境として,
表1 HDPに用意されているHadoopエコシステム
Ambari | HDPのHadoop管理システム |
YARN | Hadoopクラスタ上で動作するソフトウェアのスケジュール管理, |
HBase | GoogleのBigTableをモデルとした列指向の分散データベース |
Hive | Hadoopの上に構築されたデータベース。HiveQLというSQLに似たクエリを使用できる |
Spark | インメモリで分散処理をするソフトウェア。リアルタイムストリーミング処理が行えるSparkStreaming, |
リージョンは
表2 Hadoopクラスタを使用したシステムの見積り料金
マシン名 | 役割 | CPU | メモリ | SSD | 月額料金 |
---|---|---|---|---|---|
gateway | インターネットから接続できるSSHサーバ | 2コア | 1GB | 50GB | 900円 |
ci_ | HDPのHadoop管理システムAmbariとデプロイサーバ | 4コア | 4GB | 50GB | 3,420円 |
master_ | Hadoopのマスタノード | 6コア | 8GB | 50GB | 6,670円×3 |
slave_ | Hadoopのスレーブノード | 6コア | 8GB | 550GB | 11,170円×3 |
dev-web1, | Nginxサーバ | 2コア | 1GB | 50GB | 900円×2 |
dev-ap1, | HTTPアプリケーションサーバ | 3コア | 2GB | 50GB | 1,750円×2 |
dev-batch1, | 集計バッチサーバ | 3コア | 2GB | 50GB | 1,750円×2 |
ロードバランサ1台 | Webサーバで使用 | 1,000円 | |||
合計 | 67,640円 |
システム構築作業の際にインスタンスを作って壊すことも何度かはあるため,
HadoopクラスタでのSparkの活用
構築したクラスタで,
1.ダミーデータの作成(1,000万レコード)
データベーステーブルの元となるアクセスログのダミーデータ
リスト1 ダミーデータを作成するPerlスクリプト
#!/usr/bin/perl
for ($i=0; $i < $ARGV[0]; $i++) {
$user_id = "uid_".int(rand ($ARGV[1]));
$page_url = "http://maru/page/".int(rand $ARGV[2]);
print $user_id."\t".$page_url."\n";
}
あるサイトに1万ページのURLがあり,
[hive@slave_node1]$./dummy.pl 10000000 1000000 10000 > dummy10m.tsv
生成したログデータは次のようなものです。
uid_1 http://maru/page/1
uid_1 http://maru/page/2
uid_2 http://maru/page/3
uid_3 http://maru/page/4
uid_3 http://maru/page/5
このデータをリスト2のようなデータ形式にSpark SQLで変換してみます。
リスト2 Spark SQLで変換したデータ
uid_1 http://maru/page/1 http://maru/page/2
uid_2 http://maru/page/3
uid_3 http://maru/page/4 http://maru/page/5
2.テーブルにデータ(TSV)を登録
spark-sqlを起動し,
spark-sql> create database noda_conoha_sd4; use noda_conoha_sd4; CREATE TABLE raw_log_data ( uid STRING, url STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS TEXTFILE; CREATE TABLE log_data ( uid STRING, url STRING ) STORED AS ORC tblproperties ("orc.compress"="SNAPPY");
TSVファイルをTEXTFILEフォーマットテーブルにロードしたあと,
spark-sql> LOAD DATA LOCAL INPATH "./dummy10m.tsv" into table raw_log_data; INSERT OVERWRITE TABLE log_data select uid, url from raw_log_data; select * from log_data limit 10; uid_387616 http://maru/page/2197 uid_734748 http://maru/page/6714 uid_982660 http://maru/page/6854