2017-08-25 2 views
1

私は時系列データを持つ1.6Tハイブテーブルを持っています。私はHive 1.2.1Spark 1.6.1scalaに使用しています。ハイブコンテキストを使用してsparkでハイブテーブルを効率的にクエリする方法はありますか?

私のコードには次の質問があります。しかし、私はいつもJava out of memory errorを得る。繰り返しハイブテーブルから一度に少数のレコードを選択することで

val sid_data_df = hiveContext.sql(s"SELECT time, total_field, sid, year, date FROM tablename WHERE sid = '$stationId' ORDER BY time LIMIT 4320000 ") 

は、私は、メモリの122ギガバイト、44 vCoresと4つのノードのクラスタを持っている結果dataframe

にスライディングウィンドウをやろうとしています。私は利用可能な488 GBのうち425 GBのメモリを使用しています。私は親切に私にこれを最適化し、成功したハイブテーブルからデータを取得する方法についての提案を与える以下のパラメータ

--num-executors 16 --driver-memory 4g --executor-memory 22G --executor-cores 10 \ 
--conf "spark.sql.shuffle.partitions=1800" \ 
--conf "spark.shuffle.memory.fraction=0.6" \ 
--conf "spark.storage.memoryFraction=0.4" \ 
--conf "spark.yarn.executor.memoryOverhead=2600" \ 
--conf "spark.yarn.nodemanager.resource.memory-mb=123880" \ 
--conf "spark.yarn.nodemanager.resource.cpu-vcores=43" 

で火花提出与えています。

おかげ

+0

あなたは合理的に良い設定をしています。データを再分割していないので、あなたは私たちの記憶を実行しています(または、それが再パーティショニングされていれば...それは16 * 43 * 2 = 1376または16 * 43 * 3 = 2064)。エグゼキュータ・ログを参照して、各エグゼキュータに送信されるレコードの数を確認してください。 –

+0

私は再分割しました。しかし、再分割の前にジョブが失敗します。 selectクエリは効率的ではありません。 selectクエリの 'limit'はどのような動作をしますか?すべてのレコードを取得して制限を適用しますか? – anaga

+0

制限を削除して試したことがありますか? –

答えて

1

問題はここにありそうです:

LIMIT 4320000 

あなたは多数のレコードのサブセットするLIMITを使用しないでください。 Sparkでは、LIMITはすべての行を単一のパーティションに移動し、重大なパフォーマンスと安定性の問題を引き起こす可能性があります。

私は一度にいくつかのレコードを選択することで、dataframeiterativelyこの結果にスライディングウィンドウをやろうとしています例えばHow to optimize below spark code (scala)?

を参照してください。

これは正しくはありません。スライディングウィンドウの操作は、通常、ウィンドウ関数とタイムスタンプベースのいくつかの組み合わせで実現できます。window buckets

関連する問題