在火花管中使用的脚本执行了多少次。

时间:2015-08-17 10:40:39

标签: apache-spark

我尝试了下面的spark scala代码并得到了如下所述的输出。 我试图将输入传递给脚本,但它没有收到,当我使用收集时,我在脚本中使用的print语句出现了两次。

我的简单和非常基本的perl脚本首先:

#!/usr/bin/perl
print("arguments $ARGV[0] \n"); // Just print the arguments.

我的Spark代码:

object PipesExample {
  def main(args:Array[String]){
    val conf = new SparkConf();

    val sc = new SparkContext(conf);

    val distScript = "/home/srinivas/test.pl"
    sc.addFile(distScript)

    val rdd = sc.parallelize(Array("srini"))

    val piped = rdd.pipe(Seq(SparkFiles.get("test.pl")))

    println(" output " + piped.collect().mkString(" "));

  }
}

输出看起来像这样..

 output arguments arguments 

1)我做了什么错误使它无法接收参数。? 2)为什么它执行了两次。?

如果它看起来太基础,请向我道歉。我试图理解最好,并想清除我的怀疑。

2 个答案:

答案 0 :(得分:0)

根据我的经验,它会被执行两次,因为spark会将您的RDD划分为两个分区,每个分区都会传递给您的外部脚本。

答案 1 :(得分:0)

您的应用程序无法选择test.pl文件的原因是,该文件位于某个节点的位置。但是应用程序主服务器是在集群中的一个节点中创建的。如果文件不在该节点中那么多,它就无法选择该文件。

您应始终将文件保存在HDFS或S3中以访问外部文件。或者通过spark命令选项传递HDFS文件位置。