私は時系列データを持つ1.6Tハイブテーブルを持っています。私はHive 1.2.1
とSpark 1.6.1
をscala
に使用しています。ハイブコンテキストを使用して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"
で火花提出与えています。
おかげ
あなたは合理的に良い設定をしています。データを再分割していないので、あなたは私たちの記憶を実行しています(または、それが再パーティショニングされていれば...それは16 * 43 * 2 = 1376または16 * 43 * 3 = 2064)。エグゼキュータ・ログを参照して、各エグゼキュータに送信されるレコードの数を確認してください。 –
私は再分割しました。しかし、再分割の前にジョブが失敗します。 selectクエリは効率的ではありません。 selectクエリの 'limit'はどのような動作をしますか?すべてのレコードを取得して制限を適用しますか? – anaga
制限を削除して試したことがありますか? –