有关Apache Spark

时间:2019-01-17 15:51:55

标签: apache-spark

我正在尝试使用rdd.pipe()在Apache Spark上运行外部c ++脚本。我在文档中找不到足够的信息,所以我在这里询问。

使用rdd.pipe()时是否需要外部脚本在群集中的所有节点上可用?

如果我没有权限在群集的节点上安装任何组件,该怎么办?还有其他方法可以使脚本可供工作节点使用吗?

2 个答案:

答案 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”)。