强制Spark以并行计算

时间:2018-01-17 18:17:52

标签: json apache-spark

使用Spark 1.6.2,从普通文件系统中读取gzip压缩的JSON文件:

val df = sqlContext
    .read
    .json("file:///data/blablacar/transactions.json.gz")
    .count()

将对单个工作人员使用单个任务。

但是如果我保存文件:

sc.textFile("file:///data/blablacar/transactions.json.gz")
    .saveAsTextFile("file:///user/blablacar/transactions")

sqlContext.read.json("file:///user/blablacar/transactions")
.count()

将在单个任务上执行第一个作业,但是对几个任务执行JSON解码(这很好!)。

为什么Spark没有在内存中解压缩文件并在第一种情况下在几个任务中分发JSON解码?

2 个答案:

答案 0 :(得分:2)

  

为什么Spark没有在内存中解压缩文件并在第一种情况下在几个任务中分发JSON解码?

因为gzip压缩不可拆分,所以文件必须作为一个整体加载到一台机器上。如果你想要并行读取:

  • 根本不要使用gzip,或
  • 对与分割大小相当的较小文件使用gzip压缩,或
  • 在将文件传递给Spark之前自行解压缩文件。

答案 1 :(得分:0)

调用.repartition(8)就行了!

val rdd = sc.textFile("file:///data/blablacar/transactions.json.gz")
    .repartition(8)

sqlContext.read.json(rdd)
.count()

enter image description here