2017-08-25 100 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的某种组合来实现。