我正在使用 Apache Spark 1.4.1(与 Hive 0.13.1 集成)和 Hadoop 2.7
我在 Hive 中创建了一个使用 Snappy 压缩的 ORC 表,并使用 Spark Dataframe API(insertInto 方法)将大约 5000 万条记录插入其中,如下所示:
inputDF.write.format("orc").mode(SaveMode.Append).partitionBy("call_date","hour","batch_id").insertInto("MYTABLE")
该表有大约 50-60 列,其中 3 列是 varchar,所有其他列都是 INT 或 FLOAT。
我的问题是,当我使用以下 spark 命令查询表时:
var df1 = hiveContext.sql("select * from MYTABLE")
val count1 = df1.count()
查询没有出来,在上面的查询中卡了几个小时。Spark 控制台日志卡在下面:
16/12/02 00:50:46 INFO DAGScheduler: 从 ShuffleMapStage 70 (MapPartitionsRDD[553] 缓存在 MYTABLE_LOAD.scala:498) 提交 2700 个缺失任务 16/12/02 00:50:46 INFO YarnScheduler: 添加任务集70.0 有 2700 个任务
该表在仓库目录中有 2700 个零件文件。
我已经尝试将 inputDF 合并到 10 个分区,然后再插入到为表创建 270 个部分文件而不是 2700 个的表中,但是查询表给出了同样的问题,即查询不出来。
奇怪的是,当我通过 spark-shell(使用 5g 驱动程序内存调用)调用相同的选择查询时,查询在不到一分钟的时间内给出了结果。
即使对于其他 ORC 表(未 Snappy 压缩),使用 hiveContext.sql 和非常简单的查询(从 table where 选择)查询它们也需要 10 多分钟。
有人可以告诉这里可能是什么问题吗?我认为该表没有问题,因为 spark-shell 查询在这种情况下不起作用。
提前谢谢了。