チュートリアル:Impala用の優れたファイルフォーマットとHadoopの高速なSQL

Published on 23 October 2013 in Impala / Tutorial / カテゴリーなし - 2 minutes read
原文

Impalaのファイルフォーマット

最適なファイルフォーマットを使用することは、優れたパフォーマンスを得るためには極めて重要です。これは、Impala アプリケーション(英語)でJSONがサポートされていない理由の一つです。実際に、1レコードでさえ全てのテキストレコードの構文解析や取得をすることは、パフォーマンスにひどいダメージを与えます。Impalaでは別の一連のフォーマットを推奨しています。

ここではjsonデータを含んだAvroフォーマットのHiveテーブルと、新しいParquetフォーマットのテーブルをどのようにして作成するのかを紹介しています。HadoopチュートリアルシリーズのEpisode 2 of the Season 2 (英語)の同じYelpデータを使用しています。

Avro

最初の手順はPigスクリプトの支援によりデータをJSONに変換することです。Pig Editor をオープンして実行します:

REGISTER piggybank.jar

data = load '/user/hive/warehouse/review/yelp_academic_dataset_review_clean.json'
    AS (funny:INT, useful:INT, cool:INT, user_id:CHARARRAY, review_id:CHARARRAY, text:CHARARRAY, business_id:CHARARRAY, stars:INT, date:CHARARRAY, type:CHARARRAY);

data_clean = FILTER data BY business_id IS NOT NULL AND text IS NOT NULL;    

STORE data_clean INTO 'impala/reviews_avro'
USING org.apache.pig.piggybank.storage.avro.AvroStorage(
'{
"schema": {
  "name": "review",
  "type": "record",
  "fields": [
     {"name":"funny", "type":"int"},
     {"name":"useful", "type":"int"},
     {"name":"cool", "type":"int"},
     {"name":"user_id", "type":"string"}
     {"name":"review_id", "type":"string"},
     {"name":"text", "type":"string"},
     {"name":"business_id", "type":"string"},
     {"name":"stars", "type":"int"},
     {"name":"date", "type":"string"},      
     {"name":"type", "type":"string"},
  ]}
}');

続いて、Hive Editorで、以下のようにしてテーブルを作成します:

CREATE TABLE review_avro
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS
inputformat 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
LOCATION '/user/romain/impala/reviews_avro'
tblproperties ('avro.schema.literal'='{
  "name": "review",
  "type": "record",
  "fields": [
     {"name":"business_id", "type":"string"},
     {"name":"cool", "type":"int"},
     {"name":"date", "type":"string"},
     {"name":"funny", "type":"int"},
     {"name":"review_id", "type":"string"},
     {"name":"stars", "type":"int"},
     {"name":"text", "type":"string"},
     {"name":"type", "type":"string"},
     {"name":"useful", "type":"int"},
     {"name":"user_id", "type":"string"}]}'
);

ここでImpalaに戻り、以下のようにメタデータをリフレッシュした後にテーブルを使用することができます:

REFRESH avro_table

Parquet

Parquetは、新しい列指向のバイナリーファイルフォーマットで、特にImpalaには効率が良いです。これはImpalaアプリからテーブルを作成する方法です:

CREATE TABLE review_parquet LIKE review STORED AS PARQUETFILE;

その後データをロードします:

INSERT OVERWRITE review_parquet  SELECT * FROM review;

時間をかけて、それぞれのフォーマットの目的についてと、圧縮を有効にする方法を読んでみて下さい。より詳しく知りたければ、Impala tuning guideも良い参考資料です。

いつものように、何かあればhue-userメーリングリスト(英語)や、@gethueに気軽にコメントして下さい!


comments powered by Disqus

More recent stories

10 June 2021
Hue4.10(新しいSQLエディタコンポーネント、REST API、小さなファイルのインポート、Slackアプリなど)がリリースされました!
Read More
29 May 2021
Sqlスクラッチパッドコンポーネントとパブリック REST API を使用して、5 分で独自の SQL エディター (BYOE) を構築する
Read More
26 May 2021
改善されたHueのImporter -- ファイルの選択、方言の選択、テーブルの作成
Read More