RDBMSからSqoopを用いてParquet形式でデータを取り込む

Hadoop上、または SQL on Hadoopで分析を行う場合、テキストファイル(CSVやJSONなど)をそのまま使うとパフォーマンス的に不利になる場合が多いです。(ファイルから改行文字や区切り文字を探して都度都度処理をすれば、当然遅くなりますよね、、、)

Hadoopでは複数のバイナリ形式のファイルフォーマット(SequenceFile, Avroなど)が利用できるようになっていますが、対象が分析用途なら、カラムナ(列指向)フォーマットのフォーマットを利用すると効率的です。これは、バイナリ形式で保存するだけでなく、データを列単位で保存することで、必要な列に効率良くアクセスできるためです。

Apache Parquet

カラムナフォーマットとして広く使われているApache Parquet(パーケィ、と発音)は、Hadoopだけではなく、Spark、Impala等多くのエコシステムで利用できるフォーマットです。(Apache Kuduも列指向ですが、ファイルではなく、独自の形式でデータを扱います)

#Apache Parquetの説明は別の機会に

RDBMSからHadoopにデータを取り込み場合、Sqoopを使ってデータを取り込むことが一般的ですが、この際にParquetファイルとして取り込むことができます。多くのエコシステムがParquetに対応している一例ですね。

Quickstart VMを使ってHadoopに(というかHDFSに)取り込んでみましょう。



sqoop import-all-tables     -m 1     --connect jdbc:mysql://quickstart:3306/retail_db     --username=retail_dba     --password=cloudera     --compression-codec=snappy     --as-parquetfile     --warehouse-dir=/user/hive/warehouse     --hive-import

 

これだけです。

これは、RDBMS(MySQL)のretail_dbデータベースにある全てのテーブルを、 Parquet のファイルとして、HDFSの /user/hive/warehouse にインポートします。(さらに、Hiveのメタストアに登録までを行います)。-m 1 というのは並列数です。今回「1」にしているのは、Quickstart VMが1ノードの疑似分散環境だからです。

Sqoopはインポート時にMapReduceを使用し、複数のノードから分散して並列でインポートを行います。MapReduceを起動しておいてください。(また、今回はHiveのメタストアに登録も行うため、Hiveも起動しておく必要があります)

以下実行結果です。Hiveのbeelineシェルで確認してみました。

<br data-mce-bogus="1">

[cloudera@quickstart ~]$ beeline -u jdbc:hive2://quickstart:10000 -n cloudera

(略)
0: jdbc:hive2://quickstart:10000> SHOW TABLES;
INFO  : OK
+--------------+--+
|   tab_name   |
+--------------+--+
| categories   |
| customers    |
| departments  |
| order_items  |
| orders       |
| products     |
+--------------+--+
6 rows selected (0.139 seconds)
0: jdbc:hive2://quickstart:10000> SELECT COUNT(*) FROM categories;
(略)
+------+--+
| _c0  |
+------+--+
| 58   |
+------+--+
1 row selected (19.011 seconds)


Parquetファイルとして保存されていることを確認してみます。

0: jdbc:hive2://quickstart:10000>; DESCRIBE FORMATTED ORDERS;
INFO : Compiling command(queryId=hive_20161211152525_107ba790-aab1-414c-a5d3-d4a1d1b499d1): DESCRIBE FORMATTED ORDERS
INFO : Semantic Analysis Completed
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:col_name, type:string, comment:from deserializer), FieldSchema(name:data_type, type:string, comment:from deserializer), FieldSchema(name:comment, type:string, comment:from deserializer)], properties:null)
INFO : Completed compiling command(queryId=hive_20161211152525_107ba790-aab1-414c-a5d3-d4a1d1b499d1); Time taken: 0.037 seconds
INFO : Executing command(queryId=hive_20161211152525_107ba790-aab1-414c-a5d3-d4a1d1b499d1): DESCRIBE FORMATTED ORDERS
INFO : Starting task [Stage-0:DDL] in serial mode
INFO : Completed executing command(queryId=hive_20161211152525_107ba790-aab1-414c-a5d3-d4a1d1b499d1); Time taken: 0.016 seconds
INFO : OK
+-------------------------------+-----------------------------------------------------------------+--------------------------------------------------------------------------------------+--+
| col_name | data_type | comment |
+-------------------------------+-----------------------------------------------------------------+--------------------------------------------------------------------------------------+--+
| # col_name | data_type | comment |
| | NULL | NULL |
| order_id | int | |
| order_date | bigint | |
| order_customer_id | int | |
| order_status | string | |
| | NULL | NULL |
| # Detailed Table Information | NULL | NULL |
| Database: | default | NULL |
| Owner: | null | NULL |
| CreateTime: | Sun Dec 11 15:19:11 PST 2016 | NULL |
| LastAccessTime: | UNKNOWN | NULL |
| Protect Mode: | None | NULL |
| Retention: | 0 | NULL |
| Location: | hdfs://quickstart.cloudera:8020/user/hive/warehouse/orders | NULL |
| Table Type: | MANAGED_TABLE | NULL |
| Table Parameters: | NULL | NULL |
| | COLUMN_STATS_ACCURATE | false |
| | avro.schema.url | hdfs://quickstart.cloudera:8020/user/hive/warehouse/orders/.metadata/schemas/1.avsc |
| | kite.compression.type | snappy |
| | numFiles | 0 |
| | numRows | -1 |
| | rawDataSize | -1 |
| | totalSize | 0 |
| | transient_lastDdlTime | 1481498351 |
| | NULL | NULL |
| # Storage Information | NULL | NULL |
| SerDe Library: | org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe | NULL |
| InputFormat: | org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat | NULL |
| OutputFormat: | org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat | NULL |
| Compressed: | No | NULL |
| Num Buckets: | -1 | NULL |
| Bucket Columns: | [] | NULL |
| Sort Columns: | [] | NULL |
+-------------------------------+-----------------------------------------------------------------+--------------------------------------------------------------------------------------+--+
34 rows selected (0.091 seconds)
0: jdbc:hive2://quickstart:10000>


 

 

参考情報
https://parquet.apache.org/documentation/latest/

Introducing Parquet: Efficient Columnar Storage for Apache Hadoop
http://blog.cloudera.com/blog/2013/03/introducing-parquet-columnar-storage-for-apache-hadoop/

Choosing an HDFS data storage format- Avro vs. Parquet and more – StampedeCon

Dremel made simple with Parquet
https://blog.twitter.com/2013/dremel-made-simple-with-parquet

CDH 5.4でHive on Sparkを試す

Hive on Spark (on CDH5.4)

※Hive on Sparkはテクノロジープレビュー扱いです。現時点ではサポート対象外なのでご注意を。

CDH5.4に含まれているHiveはHive 1.1です。このバージョンのHiveから、Hiveの実行エンジンとしてSparkが利用できるようになりました。(Hive on Spark [1][2])

[1] https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started
[2] https://issues.apache.org/jira/browse/HIVE-7292

ドキュメントも発見したので早速試してみます。

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/admin_hos_config.html

(続きを読む)

Hue 3.8の新しい機能

最近いくつかのブログ記事を翻訳しましたが、Hadoop用のデファクトスタンダードなGUIであるHue、新しいバージョンのHue 3.8は素晴らしいものになりそうです。

Hueのブログページ(日本語)

http://gethue.com/blog/?lang=ja

Hue 3.8の機能(日本語のブログから抜粋)

例えば上記にある通り、Hue 3.8は Hive 1.1とImapala 2.2に対応する予定です。また、今回のバージョンでクールだと思うのは、個人的にはNoteBook UIかな、、、HiveQLやImpalaのクエリを入力したり、SparkもREPLで入力/実行できるのは素晴らしいです。

Hue 3.8はおそらくCDH5.4に含まれると思うので、きっともうすぐですね

Hive on Spark のベータ版!

Hive on Spark

寝る間際に見てしまった、「Download the Hive-on-Spark Beta」という文字。

下記のClouderaのブログによれば、Cloudera ManagerからHive on Sparkがセットアップできるとの情報が。

A Hive-on-Spark beta is now available via CDH parcel. Give it a try!」

http://blog.cloudera.com/blog/2015/02/download-the-hive-on-spark-beta/

ドキュメントも用意されています。

http://www.cloudera.com/content/cloudera/en/documentation/hive-spark/latest/PDF/hive-spark-get-started.pdf

さっそく試さなければ!

※本当はセットアップをやりかけたんですが、Parcelの設定がうまくいかなかったのと、ドキュメントの手順が複雑だったので断念。もう3:00AMだし…

Hadoopのいろんな言語でwordcount(1)

Hadoop関連(全部俺) Advent Calendar 2014:14日目の記事です

Apache Crunchを少し調べたついでに、Hadoopでいろんな言語を用いてwordcountを実行してみました。まずはMapReduce, HadoopStreamingHivePigwordcountを実行します。

(追記)githubにコードを置きました:https://github.com/kawamon/wordcount.git

ワードカウントの余談

ワードカウントは、HadoopのMapReduceの最初の説明によく利用される、いわゆる”Hello World”のような意味をもちます。

HadoopのMapReduceではワードカウントがサンプルとして取り上げられる理由が曖昧なことが多いのですが、なぜワードカウントなのでしょうか?

いわゆる量の多いビッグデータを処理するには2つの課題があります。

  1. ストレージに保存された大量のデータをCPUで処理するために読み込むため、データの移動に時間がかかる
  2. 1台のマシンで実行するには時間がかかりすぎる(メモリに乗り切らない、あるいは1台のCPUではまかなえないほど量が多い)

このような課題の解決には、1台のマシンをスケールアップして対応するには限界があるかもしれません。そのため、複数のマシンを使ってスケールアウトする、「分散処理」が力を発揮します。ワードカウントは大量のデータを「分散」して処理できるサンプルとして取り上げられています。
(続きを読む)

2014年版 Hadoopを10分で試す(5) まずはHiveから(後編)

Hadoop関連(全部俺) Advent Calendar 2014:13日目の記事です

#既に10分を超えてしまったかもしれませんが、、、

昨日はHiveが使用するメタストアについて紹介しました。テーブルは作成されていますが、まだデータがありません。今日のデータのロードでHive編完了です。 (続きを読む)

2014年版 Hadoopを10分で試す(4) まずはHiveから(中編)

Hadoop関連(全部俺) Advent Calendar 2014:12日目の記事です

昨日はHueからHiveを使ってクエリを行いました。Hiveでのクエリの実行時には間接的にMapReduceのジョブが実行されています。CDH5ならMapReduce v2/YARN、もしくはMapReduce v1のいずれかです。

HueがあればHadoopをほとんど意識せずにHiveのクエリを実行できますが、今日はHiveについてもう少し詳しく見てみましょう。 (続きを読む)

2014年版 Hadoopを10分で試す(3) まずはHiveから(前編)

Hadoop関連(全部俺) Advent Calendar 2014:11日目の記事です

Cloudera Quickstart VMによりHadoopの環境が用意できました。HadoopのコアはHDFS(Hadoop分散ファイルシステム)とMapReduce(分散処理)ですが、今回はHadoopに関するところは無視して、まずは10分(ぐらい)で Hiveとはどんなものか、使いながら把握していきましょう。かなり大雑把なので、正確な情報は書籍やウェブでご確認下さい。

HDFSやMapReduceについては以前書いた記事などを参考にして下さい(めざせ!hadoopエンジニア(開発者編)Hadoopを40分で理解する(続きを読む)

2014年版 Hadoopを10分で試す(1)

Hadoop関連(全部俺) Advent Calendar 2014:7日目

先週の研修中に、「Hadoopをこれから試してみたいけど、どこから始めたらいいでしょうか?」という質問がありました。

構築の勉強をしたいのであれば、今ならパブリッククラウドや仮想化環境を使えるので、実際に構築してみるのが良いでしょう。パッケージを手作業でインストールしても良いですし、Cloudera Managerを使えば簡単です。 (続きを読む)