Apache spark 为什么RDD计算计数要花这么多时间
(英语不是我的第一语言,请原谅我的错误) 我使用SparkSQL从配置单元表读取4.7TB的数据,并执行计数操作。这大约需要1.6个小时。直接从HDFS txt文件读取并执行计数时,只需10分钟。这两个作业使用相同的资源和并行性。为什么RDD计数需要这么多时间 配置单元表大约有30万列,序列化可能成本很高。我检查了spark UI,每个任务读取大约240MB的数据,执行大约需要3.6分钟。我不敢相信序列化开销如此昂贵 从蜂箱读取数据(需要1.6小时):Apache spark 为什么RDD计算计数要花这么多时间,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,(英语不是我的第一语言,请原谅我的错误) 我使用SparkSQL从配置单元表读取4.7TB的数据,并执行计数操作。这大约需要1.6个小时。直接从HDFS txt文件读取并执行计数时,只需10分钟。这两个作业使用相同的资源和并行性。为什么RDD计数需要这么多时间 配置单元表大约有30万列,序列化可能成本很高。我检查了spark UI,每个任务读取大约240MB的数据,执行大约需要3.6分钟。我不敢相信序列化开销如此昂贵 从蜂箱读取数据(需要1.6小时): val sql=s“从xxxtable中选
val sql=s“从xxxtable中选择*
val hiveData=sqlContext.sql(sql).rdd
val count=hiveData.count()
从hdfs读取(需要10分钟):
val inputPath=s”/path/to/over/hivetable
val hdfsData=sc.textFile(inputPath)
val count=hdfsData.count()
使用SQL count时,仍然需要5分钟:
val sql=s“从xxxtable中选择计数(*)
val hiveData=sqlContext.sql(sql).rdd
hiveData.foreach(println(u))
您的第一种方式是将所有数据加载到spark,网络、序列化和转换操作将花费大量时间
第二种方式,我认为是因为他忽略了蜂巢层
如果您只是
count
,第三种方法更好,它是在执行count之后只加载计数结果您的第一种方法是查询数据,而不是获取数据。差别很大
val sql = s"SELECT * FROM xxxtable"
val hiveData = sqlContext.sql(sql).rdd
作为程序员,我们可以看到上面的代码并认为“是的,这就是我们获取所有数据的方式”。但是获取数据的方式是通过查询,而不是从文件中读取数据。基本上,会发生以下步骤:
- 从文件读入临时存储器
- 查询引擎处理对临时存储的查询并创建结果
- 结果被读入RDD
val inputPath = s"/path/to/above/hivetable"
val hdfsData = sc.textFile(inputPath)
在这里,我们只有一个步骤:
- 从文件读入RDD
val count = hdfsData.count()