Scala 火花管示例

Scala 火花管示例,scala,streaming,pipe,apache-spark,Scala,Streaming,Pipe,Apache Spark,我是Spark的新手,正在尝试弄清楚管道方法是如何工作的。我在Scala中有以下代码 sc.textFile(hdfsLocation).pipe("preprocess.py").saveAsTextFile(hdfsPreprocessedLocation) hdfsLocation和hdfsPreprocessedLocation的值很好。作为证明,以下代码在命令行中工作 hadoop fs -cat hdfsLocation/* | ./preprocess.py | head 当我

我是Spark的新手,正在尝试弄清楚管道方法是如何工作的。我在Scala中有以下代码

sc.textFile(hdfsLocation).pipe("preprocess.py").saveAsTextFile(hdfsPreprocessedLocation)
hdfsLocation和hdfsPreprocessedLocation的值很好。作为证明,以下代码在命令行中工作

hadoop fs -cat hdfsLocation/* | ./preprocess.py | head
当我运行上面的Spark代码时,我得到以下错误

14/11/25 09:41:50 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.io.IOException: Cannot run program "preprocess.py": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
at org.apache.spark.rdd.PipedRDD.compute(PipedRDD.scala:119)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:262)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:229)
at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:262)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:229)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:62)
at org.apache.spark.scheduler.Task.run(Task.scala:54)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:177)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:135)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
... 12 more
但这也产生了同样的错误

我找不到一个通过管道将Spark与外部进程一起使用的好例子,所以我不确定我是否正确地执行了此操作。任何帮助都将不胜感激


谢谢

我不确定这是否是正确答案,因此我不会最终确定这一点,但在本地和群集模式下运行spark时,文件路径似乎不同。在没有--master的情况下运行spark时,管道命令的路径相对于本地计算机。使用--master运行spark时,管道命令的路径为/

更新:
这实际上是不对的。我正在使用SparkFiles.get()获取文件名。事实证明,在RDD上调用.pipe()时,命令字符串在驱动程序上求值,然后传递给工作者。因此,SparkFiles.get()不是获取文件名的适当方法。文件名应为.,因为SparkContext.addFile()应将该文件放在相对于每个辅助进程运行位置的。但我现在对.pipe很反感,因为我已经从代码中完全去掉了.pipe,而将.mapPartitions与我编写的PipeUtils对象结合起来。这实际上效率更高,因为我只需要为每个分区而不是每个示例产生一次脚本启动成本。

您能给我preprocess.py吗?我需要一些管道的例子。谢谢!
bin/spark-shell --files ./preprocess.py