hadoop
S3
hive
EMR
pig

Amazon S3からHiveやPigを使ってデータをロードしたかった

More than 1 year has passed since last update.


Hadoop使おう


  • S3に上がっているデータをHiveでHDFSに取り込みたい

  • ファイルはgzip圧縮されており、TSV形式だ

  • EMR上でHadoop+Hive, Pigなどをインストールしてテストしている

環境設定は AWSのEMRで分散クエリエンジンPrestoクラスタ作成→rubyから接続してS3の大量ファイル操作体験をしてみよう! を参考にしました。ありがとうございます。


S3 Support in Apache Hadoop

上記のサイトによれば、現在Hadoop-2.7+では、S3に対して以下のようなプロトコルが許容されている


  • S3A (URI scheme: s3a://) - Hadoop 2.7+

  • S3N FileSystem (URI scheme: s3n://)

  • S3 Block FileSystem (URI scheme: s3://)


Amazon EMRでのS3のサポート (S3 Support in Amazon EMR)


Amazon's EMR Service is based upon Apache Hadoop,

but contains modifications and their own, proprietary, S3 client.

Consult Amazon's documentation on this. Due to the fact that their code is proprietary, only Amazon can provide support and/or field bug reports related to their S3 support.


AmazonのEMRはApache Hadoopを元にしているが、AWS側による彼ら自身の商用のS3クライアントについての改変が含まれている。

Amazonのドキュメントはこれを参照せよ。彼らのコードが商用であるという事実により、AmazonのみがS3のサポートについてのバグやサポートを提供できる。


Hive

ここの回答に従うと、Hiveの内部クラス org.apache.hadoop.hive.serde2.OpenCSVSerde を使えば、TSV形式で取り込めた。


  • コマンドのイメージ


sql

$ hive

> CREATE EXTERNAL TABLE example (
- 定義…
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = "\t",
"quoteChar" = "\""
)
LOCATION 's3n://your-s3-directory-is/'
;

-- コマンドがOKで返ったらhiveからselectできる
> select * from example limit 20;



  • S3のディレクトリ単位でしかEXTERNAL TABLEを作れない(?)

  • ディレクトリを表現するにはPARTITIONを使うことが多いようだ

  • Hiveで作ったテーブルはPrestoからもクエリをかけられる


Pig

ここの回答に従って、データを取り込もうとしたのですがPigからの応答がなくなってしまう…


  • テキストファイルを読みだしたら行けた

  • "s3n://" → "s3://"


bash

$ pig -x tez

grunt> a = load 's3://your-s3-directory-is/here.txt' AS (line:chararray);
grunt> dump a;