Spark Map partiton无法在纱线群集模式下工作

时间:2017-02-16 14:36:40

标签: scala apache-spark rdd

我正在运行一个spark scala程序,用于在输入文件中执行文本扫描。我试图通过使用rdd.mappartition实现并行性。在mappartition部分内部,我执行一些检查并调用map函数来实现每个分区的并行执行。在地图功能中,我正在调用自定义方法,我正在执行扫描并将结果发回。

现在,当我使用--master local [*]提交代码时,代码工作正常,但是当我使用--master yarn-cluster提交代码时,代码工作正常。它没有任何错误,但调用没有进入mappartition本身。我通过放置几个println语句验证了这一点。

请帮助我提出建议。 以下是示例代码:

def main(args: Array[String]) {

  val inputRdd = sc.textFile(inputFile,2)
  val resultRdd = inputRdd.mapPartitions{ iter =>

    println("Inside scanning method..")
    var scanEngine = ScanEngine.getInstance();
    ...
    ....
    ....
    var mapresult = iter.map { y =>
      line = y
      val last = line.lastIndexOf("|");
      message = line.substring(last + 1, line.length());
      getResponse(message)
    }
  }

  val finalRdd = sc.parallelize(resultRdd.map(x => x.trim()))
  finalRdd.coalesce(1, true).saveAsTextFile(hdfsOutpath)

}   

def getResponse(input: String): String = {
  var result = "";
  val rList = new ListBuffer[String]();

  try {
      //logic here
  }
  return result;
}

2 个答案:

答案 0 :(得分:1)

如果您的工作证据是打印出内部扫描方法,则在群集上运行时不会显示,因为该代码由工作人员而不是驱动程序执行。

你将不得不以开放的态度审视法医细节中的代码,并尝试找出工作没有输出的原因。通常当作业在本地模式下工作但在集群上不工作时,这是因为代码执行的位置或记录输出的位置有些微妙。

剪辑代码太多,无法提供更具体的答案。

答案 1 :(得分:0)

Spark使用map函数和mapPartitions实现了并行性。分区数决定了并行度,但无论是否使用mapPartitions函数,每个分区都将独立执行。

使用mapPartitions而不是map的原因只有几个;例如函数的初始化成本很高,但是可以多次调用它,比如在文本上做一些NLP任务