我正在尝试使用rdd.pipe()在Apache Spark上运行外部c ++脚本。我在文档中找不到足够的信息,所以我在这里询问。
使用rdd.pipe()时是否需要外部脚本在群集中的所有节点上可用?
如果我没有权限在群集的节点上安装任何组件,该怎么办?还有其他方法可以使脚本可供工作节点使用吗?
答案 0 :(得分:1)
Apache Spark,有一个特殊的Rdd,pipedRdd,它提供对外部程序(例如基于CUDA的C ++程序)的调用,以实现更快的计算。
我要在这里添加一些小例子来解释。
Shell脚本:test.sh
#!/bin/sh
echo "Running shell script"
while read LINE; do
echo ${LINE}!
done
将rdd数据插入外壳脚本
val scriptPath = "/home/hadoop/test.sh"
val pipeRDD = dataRDD.pipe(scriptPath)
pipeRDD.collect()
现在创建scala程序以调用此管道RDD
val proc = Runtime.getRuntime.exec(Array(command))
new Thread("stderr reader for " + command) {
override def run() {
for(line <- Source.fromInputStream(proc.getErrorStream).getLines)
System.err.println(line)
}
}.start()
val lineList = List("hello","how","are","you")
new Thread("stdin writer for " + command) {
override def run() {
val out = new PrintWriter(proc.getOutputStream)
for(elem <- lineList)
out.println(elem)
out.close()
}
}.start()
火花RDD
val data = sc.parallelize(List("hi","hello","how","are","you"))
val scriptPath = "/root/echo.sh"
val pipeRDD = dataRDD.pipe(scriptPath)
pipeRDD.collect()
结果:
Array[String] = Array(Running shell script, hi!, Running shell script, hello!,
Running shell script, how!, Running shell script, are!, you!)
答案 1 :(得分:0)
毕竟,似乎外部脚本应该出现在所有执行者节点上。 一种方法是通过spark-submit(例如--files script.sh)传递脚本,然后您应该能够在rdd.pipe中引用该脚本(例如“ ./script.sh”)。