Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么RDD计算计数要花这么多时间_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 为什么RDD计算计数要花这么多时间

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中选

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

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

配置单元表大约有30万列,序列化可能成本很高。我检查了spark UI,每个任务读取大约240MB的数据,执行大约需要3.6分钟。我不敢相信序列化开销如此昂贵

从蜂箱读取数据(需要1.6小时):

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
看,这是步骤的1/3。尽管这是一个简单的查询,但要将其放入RDD中,仍然需要大量的开销和处理。但一旦它进入RDD,处理就会更容易。如您的代码所示:

val count = hdfsData.count()