gpt4 book ai didi

scala - 使用 Apache Spark 在节点之间共享数据

转载 作者:行者123 更新时间:2023-12-02 03:28:44 25 4
gpt4 key购买 nike

以下是我启动 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(已经)分成多个部分,每个部分分布在几台计算机上。
  • 并且每个工作人员/任务读取文件的一部分。这很有用,因为您不需要自己管理哪个部分。

如果你在每个worker节点上复制了文件,你可以在所有任务中读取它:

val myRdd = sc.parallelize(1 to 100) // 100 tasks
val fileReadEveryWhere = myRdd.map( read("/my/file.txt") )

并在某处实现了 read(...) 的代码。

否则,您还可以使用一个[广播变量],它是驱动程序向所有工作人员发送的种子:

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),那么该文件应该在所有机器上:-\。在这种情况下,访问某些数据库或外部文件系统可能会更好。

关于scala - 使用 Apache Spark 在节点之间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28798402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com