2016-05-12 30 views
16

我与大型数据集工作,由两列分区。第二个分区 - tag_id具有200000个唯一值,我主要通过特定的tag_id值访问数据。如果我使用以下Spark命令:星火是否支持分区修剪与平面文件

sqlContext.setConf("spark.sql.hive.metastorePartitionPruning", "true") 
sqlContext.setConf("spark.sql.parquet.filterPushdown", "true") 
val df = sqlContext.sql("select * from tag_data where plant_name='PLANT01' and tag_id='1000'") 

我希望快速响应,因为这解决了一个单一的分区。在Hive和Presto中这需要几秒钟,但是在Spark中它会运行数小时。

实际数据保存在S3存储桶中,并且当我提交sql查询时,Spark将关闭并首先从Hive Metastore(其中的200000个)获取所有分区,然后调用refresh()以强制完整状态S3对象存储中所有这些文件的列表(实际调用listLeafFilesInParallel)。

正是这两种操作是如此昂贵,是否有可以得到星火的分区修剪前面任何设置 - 要么调用元数据存储,或随即期间?

+1

我也试图与附加配置参数上面的代码: 'sqlContext.setConf(“spark.sql.hive.verifyPartitionPath”,“假”)' 对性能没有影响 – Euan

+1

这是一个有趣问题,但很难回答,因为你没有描述如何创建'tag_data'的DataFrame。我认为延长这个问题是一个好主意,以便它可以自己重现。 –

+1

如果我更了解Hive和Parquet,可能我会。实际上,我不知道如何创建(双重)分区的Parquet文件。而且我不清楚你是直接使用Parquet文件,还是在某种程度上涉及Hive。 (Hive被多次提及,但如果这只是一个Parquet文件,我不知道它扮演了什么角色。) –

回答

0

只是一个想法:为HadoopFsRelation

星火API文档中说, (https://spark.apache.org/docs/1.6.2/api/java/org/apache/spark/sql/sources/HadoopFsRelation.html

” ......从存储在文件系统 蜂巢式的分区表读取数据时,它能够发现分割来自输入目录的路径 的信息,并且在开始 读取数据之前执行分区修剪...“

所以,我想“listLeafFilesInParallel”不能成为一个问题。

类似的问题已经在火花JIRA:https://issues.apache.org/jira/browse/SPARK-10673

尽管“spark.sql.hive.verifyPartitionPath”设置为false的,在性能没有影响,我怀疑 问题可能有由未注册的分区引起。请列出表格的分区并验证是否所有 分区都已注册。否则,恢复分区,显示在此链接:

Hive doesn't read partitioned parquet files generated by Spark

更新:

  1. 我想适当的拼花块大小和页面大小是在写入数据集。

  2. 创建具有提到的分区,和文件格式作为镶木地板新鲜蜂巢表,利用动态分区的方法从非分区表进行加载。 (https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions) 运行一个普通的蜂巢查询,然后通过运行火花程序进行比较。

声明:我不是火花/镶木地板专家。这个问题听起来很有趣,因此做出了回应。

1

是,火花支持分区修剪。

Spark会执行分区目录列表(顺序或并行listLeafFilesInParallel)以首次构建所有分区的缓存。同一应用程序中的查询,即扫描数据利用此缓存。所以你看到的缓慢可能是因为这个缓存构建。后续扫描数据的查询利用缓存来修剪分区。

这些日志显示分区被列出来填充缓存。

App > 16/11/14 10:45:24 main INFO ParquetRelation: Listing s3://test-bucket/test_parquet_pruning/month=2015-01 on driver 
App > 16/11/14 10:45:24 main INFO ParquetRelation: Listing s3://test-bucket/test_parquet_pruning/month=2015-02 on driver 
App > 16/11/14 10:45:24 main INFO ParquetRelation: Listing s3://test-bucket/test_parquet_pruning/month=2015-03 on driver 

这些是显示修剪正在发生的日志。

App > 16/11/10 12:29:16 main INFO DataSourceStrategy: Selected 1 partitions out of 20, pruned 95.0% partitions. 

HiveMetastoreCatalog.scala参考convertToParquetRelationgetHiveQlPartitions