剂量火花累加器导致saveAsTextFile()进入一个分区?

时间:2018-10-12 10:13:41

标签: apache-spark rdd partitioning

我定义了一个函数:

 def setJsonPushIndex(spark: SparkSession, currentdate: String, jsonPushInfo: RDD[(String, String)]): RDD[String] =
      {
        val sc = spark.sparkContext
        val acc = new LongAccumulator()
        sc.register(acc, "myaccumulator")
        val jsonPushWithIndex = jsonPushInfo.map(x =>
        {
          acc.add(1)
          val sendhour = x._2.toString
          val index = pushUtil.toIndex(acc.value.toString)
          var mid = "BI" + currentdate + sendhour + index
          if (sendhour.toInt < pushUtil.getNextHour().toInt)
          { 
            mid = "BI" + pushUtil.getNextday() + sendhour + index
          }
          mid + "\u0001" +
            "\"mid\": " + "\"" + mid + "\"," +
            x._1
        }
        )
        jsonPushWithIndex
      }

然后我在主函数中调用

 val json_push_res = setJsonPushIndex(spark, currentdate, json_pushInfo)
    val jsonResultPath= "/jc/algorithm/NewUserPushTest/results/" + pushUtil.NowDate() + "/"
    json_push_res.take(12).foreach(println)
    json_push_res.saveAsTextFile(jsonResultPath)

事实证明,我的目录“ part-00000”中只有一个分区。 我的命令是

spark-submit --master yarn --num-executors 5 --executor-cores 2 --executor-memory 5G  --driver-memory 10G --class "apppush.NewUserPush_V2"  /home/ilambda/lyj/test2.jar

结果数约为30000。

结果数是否很小,因为最后只有一个分区,或者Accumulator导致了这个结果?

1 个答案:

答案 0 :(得分:0)

使用Accumulators不会影响DAG,因此不会引起改组或合并。

因为jsonPushInfo仅使用窄变换进行处理

jsonPushInfo.map(x =>
  ...
)

它也不会更改分区数。

因此,我们可以得出结论,jsonPush从一开始就只有一个分区。