2017-08-25 40 views
1

我有一個1.6T的時間序列數據Hive表。我在scala中使用Hive 1.2.1Spark 1.6.1如何使用配置單元上下文高效地查詢火花中的配置單元表?

以下是我在我的代碼中的查詢。但我總是得到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 ") 

通過從蜂巢表中的時間迭代地選擇一些記錄,我試圖做的結果dataframe

我有4個結點與122 GB的內存,44個vCores集羣中的滑動窗口。我正在使用可用的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查詢上的'limit'是否起作用,它將獲取所有記錄並對其應用限制? – anaga

+0

下面有一個答案,您是否刪除了限制並嘗試過? –

回答

1

這個問題可能在這裏:

LIMIT 4320000 

您應該避免使用LIMIT於子集大量記錄。在Spark中,LIMIT將所有行移動到單個分區,並可能導致嚴重的性能和穩定性問題。

見例如How to optimize below spark code (scala)?

我想dataframeiteratively通過一次選擇幾個記錄上做這個合力的滑動窗口。

這聽起來不對。滑動窗口操作通常可以通過窗口功能和基於時間戳window buckets的某種組合來實現。