オライリーセミナー Hive入門 #oreilly0724

30
1 Hiveの正しい使い方 Cloudera 株式会社 嶋内

description

2013/07/24 に「『プログラミング Hive』 『Hadoop 第3版』刊行記念Hadoopセミナー」で発表した内容です。 http://connpass.com/event/2944/

Transcript of オライリーセミナー Hive入門 #oreilly0724

Page 1: オライリーセミナー Hive入門  #oreilly0724

1

Hiveの正しい使い方  Cloudera  株式会社  嶋内 翔  

Page 2: オライリーセミナー Hive入門  #oreilly0724

自己紹介  

•  嶋内 翔(しまうち しょう)  •  2011年4月にClouderaの最初の日本人社員として入

社  •  テクニカルサポート業務をメインに、日本における技

術に関係する業務全般を担当  

2

Page 3: オライリーセミナー Hive入門  #oreilly0724

Apache  Hadoop  

Hadoopは、  1.  単一サーバで処理しきれないほど大量なデータを  2.  コモディティサーバを並べることによって  3.  分散処理及び保存するための  4.  オープンソースソフトウェアです  

3

Page 4: オライリーセミナー Hive入門  #oreilly0724

Hadoopシステムの全体構成  

4

Hadoop  

外部システム  

RDBMS  

Webサーバ等の  ログを生成するサーバ  

携帯端末の  通信ログ  

APIアクセス  

ログ収集  

テーブルごと  インポート  

分散バッチ処理  

機械学習  

外部システム  

APIアクセス  

ユーザ  

DWH  

テーブルごと  エクスポート  

BIツール  +  JDBC/ODBC  

検索  

SQL  

Page 5: オライリーセミナー Hive入門  #oreilly0724

Hadoopのシステム全体構成  

5

Hadoop  

外部システム  

RDBMS  

Webサーバ等の  ログを生成するサーバ  

携帯端末の  通信ログ  

APIアクセス  

ログ収集  

テーブルごと  インポート  

分散バッチ処理  

機械学習  

外部システム  

APIアクセス  

ユーザ  

DWH  

テーブルごと  エクスポート  

BIツール  +  JDBC/ODBC  

検索  

SQL  データの取り込み  

データの活用  分析  探索  提供  

データの処理  

データの  保存  

Page 6: オライリーセミナー Hive入門  #oreilly0724

Hadoopシステムの全体構成  

6

Hadoop  

外部システム  

RDBMS  

Webサーバ等の  ログを生成するサーバ  

携帯端末の  通信ログ  

APIアクセス  

ログ収集  

テーブルごと  インポート  

分散バッチ処理  

機械学習  

外部システム  

APIアクセス  

ユーザ  

DWH  

テーブルごと  エクスポート  

BIツール  +  JDBC/ODBC  

検索  

SQL  

Page 7: オライリーセミナー Hive入門  #oreilly0724

Apache  Hive  (Hive本1章)  

•  Hadoop上でMapReduceを実行してくれるSQL方言HiveQLを提供する  

•  データウェアハウスアプリケーションに最も適している  •  データが更新されない  •  高速なレスポンスが要求されない  

7

Page 8: オライリーセミナー Hive入門  #oreilly0724

スキーマ・オン・リード  (Hive本3.4)  

•  Hiveの最も強力な「概念」の一つ  •  データを読むときにスキーマを使う  •  自由にデータが投入可能になる  

8

Hadoop  

CSV   テキスト  

テーブルA  

テーブルB  ログ  

Page 9: オライリーセミナー Hive入門  #oreilly0724

Hiveのスキーマ作成クエリの例  

CREATE  EXTERNAL  TABLE  tweets  (      id  BIGINT,      created_at  STRING,      favorited  BOOLEAN,      retweet_count  INT,      retweeted_status  STRUCT<          text:STRING,          user:STRUCT<screen_name:STRING,name:STRING>>  )  PARTITIONED  BY  (datehour  INT)  ROW  FORMAT  SERDE  'com.cloudera.hive.serde.JSONSerDe'  LOCATION  '/user/flume/tweets'  

9

Page 10: オライリーセミナー Hive入門  #oreilly0724

Hiveのスキーマ作成クエリの例  

CREATE  EXTERNAL  TABLE  tweets  (      id  BIGINT,      created_at  STRING,      favorited  BOOLEAN,      retweet_count  INT,      retweeted_status  STRUCT<          text:STRING,          user:STRUCT<screen_name:STRING,name:STRING>>  )  PARTITIONED  BY  (datehour  INT)  ROW  FORMAT  SERDE  'com.cloudera.hive.serde.JSONSerDe'  LOCATION  '/user/flume/tweets'  

10

外部テーブル  

データのパス  

Page 11: オライリーセミナー Hive入門  #oreilly0724

外部テーブル  (Hive本4.3.2)  

•  ファイルシステム上にあるデータをそのままテーブルとして扱える

•  他のツールとデータを共有することも簡単にできる  

11

CSV  

/user/sho/super_cool_web_service/access_log  

Hive  テーブルA   MapReduce   Pig  

CSV  CSV  

Page 12: オライリーセミナー Hive入門  #oreilly0724

外部テーブル  (Hive本4.3.2)  

•  テーブルを削除しても、データは消えない  

12

CSV  

Hive  テーブルA   MapReduce   Pig  

CSV  CSV  

/user/sho/super_cool_web_service/access_log  

影響なし!  

Page 13: オライリーセミナー Hive入門  #oreilly0724

Hiveのスキーマ作成クエリの例  

CREATE  EXTERNAL  TABLE  tweets  (      id  BIGINT,      created_at  STRING,      favorited  BOOLEAN,      retweet_count  INT,      retweeted_status  STRUCT<          text:STRING,          user:STRUCT<screen_name:STRING,name:STRING>>  )  PARTITIONED  BY  (datehour  INT)  ROW  FORMAT  SERDE  'com.cloudera.hive.serde.JSONSerDe'  LOCATION  '/user/flume/tweets'  

13

コレクションデータ型  

Page 14: オライリーセミナー Hive入門  #oreilly0724

コレクションデータ型(Hive本3.2)  

単なる  STRING  や  INT  だけでなく、より複雑な型もカラムとして定義可能  

14

型   定義例   参照例  

STRUCT   user  STRUCT<id:INT,  name:STRING>  

user.id  user.name  それぞれINT、STRINGの値を取り出す  

MAP   user  MAP<STRING,  STRING>   user[‘id’]  user[‘name’]  中身はどちらもSTRING  

ARRAY   user  ARRAY<STRING>   user[0]  user[1]  Hive本の例では添字が抜けているので注意  

UNIONTYPE   user  UNIONTYPE<INT,  STRING>   user  (そのまま)  列挙した型のいずれを格納することも可能  (Hive本には訳注のみ)  

Page 15: オライリーセミナー Hive入門  #oreilly0724

Hiveのスキーマ作成クエリの例  

CREATE  EXTERNAL  TABLE  tweets  (      id  BIGINT,      created_at  STRING,      favorited  BOOLEAN,      retweet_count  INT,      retweeted_status  STRUCT<          text:STRING,          user:STRUCT<screen_name:STRING,name:STRING>>  )  PARTITIONED  BY  (datehour  INT)  ROW  FORMAT  SERDE  'com.cloudera.hive.serde.JSONSerDe'  LOCATION  '/user/flume/tweets'  

15

パーティション  

Page 16: オライリーセミナー Hive入門  #oreilly0724

パーティション(Hive本4.4)  

テーブルをパーティション単位に区切ることが可能  ファイルシステム上は、別ディレクトリに配置される    

16

/user/hive/warehouse/access_log  

/country=US  

/country=JP  

/country=CN  

/dt=20130721  

/dt=20130722  

/dt=20130723  

/dt=20130724  

テーブル名 access_log   パーティション  country   パーティション dt  

Page 17: オライリーセミナー Hive入門  #oreilly0724

パーティション(Hive本4.4)  

特定のパーティションだけを読み込むことが可能  

17

/user/hive/warehouse/access_log  

/country=US  

/country=JP  

/country=CN  

/dt=20130721  

/dt=20130722  

/dt=20130723  

/dt=20130724  

SELECT  *  FROM  access_log  WHERE  country  =  ‘JP’  and  dt  =  ‘20130724’  

Page 18: オライリーセミナー Hive入門  #oreilly0724

Hiveのスキーマ作成クエリの例  

CREATE  EXTERNAL  TABLE  tweets  (      id  BIGINT,      created_at  STRING,      favorited  BOOLEAN,      retweet_count  INT,      retweeted_status  STRUCT<          text:STRING,          user:STRUCT<screen_name:STRING,name:STRING>>  )  PARTITIONED  BY  (datehour  INT)  ROW  FORMAT  SERDE  'com.cloudera.hive.serde.JSONSerDe'  LOCATION  '/user/flume/tweets'  

18

SerDe  

Page 19: オライリーセミナー Hive入門  #oreilly0724

SerDe  (Hive本15.4)  

•  Serializer  /  Deserializer  の略。「さーでぃー」と読む  •  あらゆるデータをHiveレコードに変換するためのイン

タフェースを提供する  •  組み込みSerDeもいくつかある  

•  RegexSerDeなど  

•  テキスト以外のバイナリデータなども、カスタムSerDeを実装することで読み込むことは可能  •  ただしJavaのクラスを実装する必要がある  

19

Page 20: オライリーセミナー Hive入門  #oreilly0724

RegexSerDeを使った  Apacheログの読み込みの例(Hive  wikiより)  

20

CREATE  TABLE  apachelog  (      host  STRING,    idenkty  STRING,    user  STRING,      kme  STRING,    request  STRING,    status  STRING,      size  STRING,      referer  STRING,        agent  STRING)  ROW  FORMAT  SERDE  'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'  WITH  SERDEPROPERTIES  (      "input.regex"  =  "([^]*)  ([^]*)  ([^]*)  (-­‐|\\[^\\]*\\])  ([^  \"]*|\"[^\"]*\")  (-­‐|[0-­‐9]*)  (-­‐|[0-­‐9]*)(?:  ([^  \"]*|\".*\")  ([^  \"]*|\".*\"))?",      "output.format.string"  =  "%1$s  %2$s  %3$s  %4$s  %5$s  %6$s  %7$s  %8$s  %9$s"  )  STORED  AS  TEXTFILE;  

Page 21: オライリーセミナー Hive入門  #oreilly0724

21

Impala  

Page 22: オライリーセミナー Hive入門  #oreilly0724

Cloudera  Impala(Hive本付録B)  

•  オープンソースの低レイテンシSQLエンジン  •  HiveQLベース  •  Hive  の文法はほぼそのまま使えます  •  スキーマオンリードの概念はそのまま生かせます  

•  C++    •  MapReduceは使わない  •  HDFS  や HBase  上のデータを処理可能  •  非常に高速  

•  大体  x10〜30  •  遅い時でも  x2〜3      

Page 23: オライリーセミナー Hive入門  #oreilly0724

Cloudera  Impala(Hive本付録B)  

•  オープンソースの低レイテンシSQLエンジン  •  HiveQLベース  •  Hive  の文法はほぼそのまま使えます  

•  C++    •  MapReduceは使わない  •  HDFS  や HBase  上のデータを処理可能  •  非常に高速  

•  大体  x10〜30  •  遅い時でも  x2〜3  

•  私が見たことある最速は x97    

Page 24: オライリーセミナー Hive入門  #oreilly0724

Cloudera  Impala(Hive本付録B)  

•  利点  •  ひたすら速い  

•  欠点  •  耐障害性がない  •  UDFがない  •  etc..  

•  Hive  の置き換えではありません!  

Page 25: オライリーセミナー Hive入門  #oreilly0724

Impalaの賢い使い方  

•  まずはImpalaで色々試す  •  使えそうなクエリを発見したら、Hiveで定期実行  

25

Impala  

Hadoop  

Hive  

色々なクエリを試して  実験する   業務処理はHiveで  

Page 26: オライリーセミナー Hive入門  #oreilly0724

26

まとめ  

Page 27: オライリーセミナー Hive入門  #oreilly0724

まとめ  

•  HiveはSQLを使ってHadoopを使える、分析用プログラムです  

•  Impalaは高速ですがHiveより機能が少ないです  •  正しく使うには、きちんとしたドキュメントが必要です  

27

Page 28: オライリーセミナー Hive入門  #oreilly0724

まとめ  

•  HiveはSQLを使ってHadoopを使える、分析用プログラムです  

•  Impalaは高速ですがHiveより機能が少ないです  •  正しく使うには、きちんとしたドキュメントが必要です  

28

Page 29: オライリーセミナー Hive入門  #oreilly0724

まとめ  

•  HiveはSQLを使ってHadoopを使える、分析用プログラムです  

•  Impalaは高速ですがHiveより機能が少ないです  •  正しく使うには、きちんとしたドキュメントが必要です  

29

買いましょう、今すぐに!  

Page 30: オライリーセミナー Hive入門  #oreilly0724