【发布时间】:2019-07-15 03:52:55
【问题描述】:
(英语不是我的母语,如有错误请见谅)
我使用 SparkSQL 从 hive 表中读取 4.7TB 数据,并执行计数操作。完成此操作大约需要 1.6 小时。直接从 HDFS txt 文件读取并进行计数,只需 10 分钟。这两个作业使用相同的资源和并行性。为什么 RDD 计数需要这么多时间?
hive 表大约有 300 万列,可能序列化成本很高。我检查了 spark UI,每个任务读取了大约 240MB 的数据,执行大约需要 3.6 分钟。我不敢相信序列化开销如此昂贵。
从蜂巢读取(耗时 1.6 小时):
val sql = s"SELECT * FROM xxxtable"
val hiveData = sqlContext.sql(sql).rdd
val count = hiveData.count()
从 hdfs 读取(需要 10 分钟):
val inputPath = s"/path/to/above/hivetable"
val hdfsData = sc.textFile(inputPath)
val count = hdfsData.count()
虽然使用 SQL 计数,但仍然需要 5 分钟:
val sql = s"SELECT COUNT(*) FROM xxxtable"
val hiveData = sqlContext.sql(sql).rdd
hiveData.foreach(println(_))
【问题讨论】:
标签: apache-spark apache-spark-sql