2016-07-06 6 views
2

フォルダがあるディレクトリがあり、各フォルダには圧縮されたJSONファイル(.gz)が含まれています。S3からJsonファイルを読み込む最も速い方法は次のとおりです。Spark

val df = sqlContext.jsonFile("s3://testData/*/*/*") 
df.show() 

例::現在、私は次のようにやっている

testData/May/01/00/File.json.gz 

各圧縮ファイルを約11〜17 GBです。

私が持っている:

  1. マスター:1 c3.4xlarge
  2. コア:19 c3.4xlarge
  3. スパーク1.5.2
  4. EMR-4.2.0

圧縮ファイルには複数のjsonオブジェクト/ファイルがあります。このプロセスは、読んだだけでは膨大な時間がかかります(上記の2つのステートメントだけ)。これを行うより速い方法がありますか?スキーマも少し複雑です。データセットの分析にいくつかのクエリを書くつもりです。しかし、私はs3からデータを読み取るのにかかる時間について心配しています。

最大負荷は10TBです。キャッシュを使用してクエリを処理する予定です。

+3

http://tech.kinja.com/how-not-to-pull-from-s3-using-apache-spark-1704509219 – zero323

答えて

2

JSONが一様に構造化されている場合は、SparkにJSONファイルのスキーマを提供することをお勧めします。これにより、処理が大幅に高速化されるはずです。

スキーマを指定しないと、Sparkはファイル内のすべての行を最初に読み込み、観察したようにしばらく時間がかかるスキーマを推測します。

スキーマを作成する方法については、このドキュメントを参照してください:http://spark.apache.org/docs/latest/sql-programming-guide.html#programmatically-specifying-the-schema

次に、あなただけのjsonFileコールに作成したスキーマを追加する必要があると思います:

val df = sqlContext.jsonFile("s3://testData/*/*/*", mySchema) 

この時点で私は( Spark 1.6.2を使用して)jsonFileが推奨されていないように思われるので、sqlContext.read.schema(mySchema).json(myJsonRDD)myJsonRDDRDD[String]です)に切り替える方が望ましいかもしれません。

+0

私はスキーマを作成して、それを使用して私のクエリは44秒で実行から47mに実行に移った。当時のクラスタの負荷には混乱する変数があるかもしれませんが、それほど時間がかかったのは興味深いと思いました。私はSparkバージョン1.5.1を実行しています。 – satoukum

+1

新しいバージョンのSparkを使用している場合、 'sqlContext.jsonFile(" ... ")'は推奨されません。代わりに 'sqlContext.read.json(" ... ")'を使用してください。 – ADAM

関連する問題