Scala 使用ApacheSpark在节点之间共享数据

Scala 使用ApacheSpark在节点之间共享数据,scala,apache-spark,Scala,Apache Spark,以下是我如何启动Spark作业: ./bin/spark-submit \ --class MyDriver\ --master spark://master:7077 \ --executor-memory 845M \ --deploy-mode client \ ./bin/SparkJob-0.0.1-SNAPSHOT.jar 类MyDriver使用以下方法访问spark上下文: val sc = new SparkContext(new SparkConf())

以下是我如何启动Spark作业:

./bin/spark-submit \
  --class MyDriver\
  --master spark://master:7077 \
  --executor-memory 845M \
  --deploy-mode client \
  ./bin/SparkJob-0.0.1-SNAPSHOT.jar
MyDriver
使用以下方法访问spark上下文:

val sc = new SparkContext(new SparkConf())

val dataFile= sc.textFile("/data/example.txt", 1)
为了在集群中运行此功能,我将文件
“/data/example.txt”
复制到集群中的所有节点。是否存在使用Spark在节点之间共享此数据文件而无需手动复制它们的机制?我想我不能在这种情况下使用广播变量

更新:

一个选项是有一个专用的文件服务器来共享要处理的文件:
val dataFile=sc.textFile(“http://fileserver/data/example.txt“,1)

sc.textFile(“/some/file.txt”)
读取hdfs中分发的文件,即:

  • /some/file.txt
    已经分为多个部分,每个部分分布在几台计算机上
  • 每个工人/任务读取文件的一部分。这很有用,因为您不需要自己管理哪个部分
如果已复制每个工作节点上的文件,则可以在所有任务中读取该文件:

val myRdd = sc.parallelize(1 to 100) // 100 tasks
val fileReadEveryWhere = myRdd.map( read("/my/file.txt") )
并在某处实现
读取(…)
的代码

否则,您也可以使用[broadcast variable],该变量是从驱动程序到所有工作程序的种子:

val myObject = read("/my/file.txt")  // obj instantiated on driver node
val bdObj = sc.broadcast(myObject) 

val myRdd = sc.parallelize(1 to 100)
              .map{ i => 
                // use bdObj in task i, ex:
                bdObj.value.process(i)
              } 
在这种情况下,
myObject
应该是可序列化的,最好不要太大


此外,方法
read(…)
在驱动程序机器上运行。因此,您只需要驱动程序上的文件。但如果您不知道它是哪台机器(例如,如果您使用
spark submit
),则该文件应位于所有机器上:-\。在这种情况下,最好访问一些数据库或外部文件系统。

它不在Spark内部,但如果您运行Apache Hadoop,则HDFS允许您一次摄取一个数据文件,并使集群中的所有节点都可以访问相同的文件URI。@Jeremy Beard代替HDFS,我可以使用http并使用以下命令在节点之间共享该文件:“val dataFile=sc.textFile(“,1)”?