当前位置: 首页 > 知识库问答 >
问题:

为什么RDD计算计数需要花费这么多时间

孔海超
2023-03-14

(英语不是我的第一语言,所以请原谅任何错误)

我使用SparkSQL从hive表中读取4.7TB的数据,并执行计数操作。做那件事大约需要1.6小时。而直接从HDFS txt文件读取和执行计数,只需要10分钟。这两个作业使用相同的资源和并行性。为什么RDD计数需要这么多时间?

配置单元表大约有30万列,序列化可能代价高昂。我检查了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(_))

共有2个答案

农鸿达
2023-03-14

你的第一个方法是加载所有数据来触发,网络、序列化和转换操作会花费很多时间。

第二种方式,我觉得是因为他省略了蜂巢层。

如果你只是count,第三种方法更好,它是在执行count后只加载count结果

丁雅惠
2023-03-14

您的第一种方法是查询数据而不是获取数据。差别很大。

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)

这里,我们只有一步:

    < li >从文件读入RDD

看,这是步骤的1/3。即使它是一个简单的查询,为了将其放入RDD,仍然涉及大量的开销和处理。但是,一旦它进入RDD,处理将更容易。如您的代码所示:

val count = hdfsData.count()
 类似资料:
  • 我的Gradle构建需要1分钟到2分钟,我不确定发生了什么。在事件日志中,我大部分时间都只看到一个条目 执行任务:[:app:GenerateDebugSources,:app:PrepareDebugunitTestDependencies,:app:MockableAndroidJar,:app:AssembleDebug] 我不知道这个任务在做什么,我检查了设置,希望这能有所改变,但我运气不

  • 我的java选项是: 以下是我的gc日志: 我的cpu有40个内核,有时gc会导致很多时间。我发现大部分时间花在对象复制上,我想知道在何种情况下,它会发生,我可以做些什么来优化gc... [对象复制(ms):Min:28.7,Avg:1927.0,Max:4037.8,Diff:4009.1,Sum:53956.0]max比min大得多,也许我可以减去gc工人??

  • 公共静态无效字(字符串文本){int numWords=1; 字符串“是this_one_long_word还是几个???你觉得怎么样??太多“应该打印10个字和”!这使用periods.as.word.delimiters,可能很棘手。“应该打印10个单词。 描述如下:一个单词是由一个或多个字符组成的序列,由空格或句子终止符(句号、冒号、分号、问号、感叹号)分隔,无论它是否为实际的英语单词。空白

  • 问题内容: 我有一个像这样的mysql表: 当访问者访问该网站时,它将其访问者ID和页面ID存储为一行。 我试图提取恰好X次访问该网站的访问者数量。(用于图表)。那么有多少人只访问一页,有多少人访问了2页… 到目前为止,我有: 但是我不知道该怎么做下一部分的计数。 可以作为MySQL查询吗? 问题答案: 我可以这样解决: 这一点很重要。

  • 本文向大家介绍为什么需要域驱动设计(DDD)?相关面试题,主要包含被问及为什么需要域驱动设计(DDD)?时的应答技巧和注意事项,需要的朋友参考一下 映射领域 降低复杂性 可测试性 可维护性 知识丰富的设计 将业务和服务结合在一起 上下文集中 通用语言

  • 我有一个xlsx文件,大小为90MB,不是很大。 首先,我使用XSSFWorkbook来阅读它,我得到了一个OutOfMemory错误。好吧,我改为使用XSSF和SAX(事件API)来读取。 当我尝试编写xlsx文件时,文档 https://poi.apache.org/components/spreadsheet/how-to.html#sxssf 告诉“SXSSF刷新临时文件(每工作表一个临时