我尝试了下面的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)为什么它执行了两次。?
如果它看起来太基础,请向我道歉。我试图理解最好,并想清除我的怀疑。
答案 0 :(得分:0)
根据我的经验,它会被执行两次,因为spark会将您的RDD划分为两个分区,每个分区都会传递给您的外部脚本。
答案 1 :(得分:0)
您的应用程序无法选择test.pl文件的原因是,该文件位于某个节点的位置。但是应用程序主服务器是在集群中的一个节点中创建的。如果文件不在该节点中那么多,它就无法选择该文件。
您应始终将文件保存在HDFS或S3中以访问外部文件。或者通过spark命令选项传递HDFS文件位置。