Scala 使用ApacheSpark在节点之间共享数据
以下是我如何启动Spark作业: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())
./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)”?