在Spark SQL Thrift Server

时间:2016-06-28 13:47:27

标签: apache-spark apache-spark-sql spark-dataframe

我有大约3000个镶木地板文件(扩展名为.gz.parquet),大小从40 MB到160 MB存储在HDFS中。 HDFS块大小为128 MB。所有文件的总大小约为360 GB。所有文件都在同一目录中,即数据未分区。

我在16个节点上启动Spark SQL Thrift Server,并为每个执行程序指定160 GB内存。每个节点有256 GB内存和32个内核。

我使用&#34创建外部表格;创建外部表格acdata(....)存储为镶木地板' / user / ac / data'"

然后我使用"缓存表acdata"缓存数据。这样做可以按预期创建大约4000个分区。数据在整个群集中占用大约1200 GB内存并且应该全部适合内存,因为我有1280 GB(16 * 160 GB / 2)可用于缓存数据。分区范围从530 MB到2 MB。问题是分区不是均匀分布在节点上。某些节点具有50 GB缓存数据,而其他节点具有80 GB缓存数据。

我跑了"选择"从JDBC客户端查询。当完成缓存数据较少的节点处理其本地数据时,它们开始处理在其他节点上缓存的数据,从而导致该数据通过网络发送。这会导致select语句花费更长时间。

重新分区存储在HDFS上的数据不是一种选择,因为每天都会将数据添加到此目录,并且每天的数据大小也不同。我必须每天重新分配所有数据,而不是仅仅将数据逐步添加到同一目录。

理想情况下,我想找到一种在所有节点上均匀分布数据的方法,这样所有任务都需要相同的时间。

如果那是不可能的,我宁愿节点只处理本地缓存的数据。通过增加" spark.locality.wait"的价值,我可以获得一点性能提升。但这会影响所有任务。

1 个答案:

答案 0 :(得分:1)

让我们将原始表格命名为acdataRaw。如果您创建新视图acdata

CREATE VIEW acdata
AS
SELECT *
FROM acdataRaw
DISTRIBUTE BY <new-key>

然后你CACHE TABLE acdata