2013-10-23-チュートリアル:impala用の優れたファイルフォーマ.md 6.0 KB


title: チュートリアル:Impala用の優れたファイルフォーマットとHadoopの高速なSQL author: Hue Team type: post date: 2013-10-23T23:59:45+00:00 url: /チュートリアル:impala用の優れたファイルフォーマ/ sf_thumbnail_type:

  • none sf_thumbnail_link_type:
  • link_to_post sf_detail_type:
  • none sf_page_title:
  • 1 sf_page_title_style:
  • standard sf_page_title_bg:
  • none sf_page_title_text_style:
  • light sf_background_image_size:
  • cover sf_social_sharing:
  • 1 sf_sidebar_config:
  • left-sidebar sf_left_sidebar:
  • Sidebar-2 sf_right_sidebar:
  • Sidebar-1 sf_caption_position:
  • caption-right slide_template:
  • default sf_custom_excerpt:
  • | Impalaのファイルフォーマット 最適なファイルフォーマットを使用することは、優れたパフォーマンスを得るためには極めて重要です。これは、Impala アプリケーション... categories:
  • Impala
  • Tutorial
  • カテゴリーなし

原文

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に気軽にコメントして下さい!