【问题标题】:Equivalent of Distributed Cache in Spark? [duplicate]相当于 Spark 中的分布式缓存? [复制]
【发布时间】:2015-09-11 09:37:26
【问题描述】:

在 Hadoop 中,您可以使用分布式缓存在每个节点上复制只读文件。在 Spark 中这样做的等效方法是什么?我知道广播变量,但这仅适用于变量,而不适用于文件。

【问题讨论】:

  • 为什么可以在列表或地图中加载文件然后广播??

标签: java scala hadoop apache-spark


【解决方案1】:

看看 SparkContext.addFile()

在每个节点上添加要与此 Spark 作业一起下载的文件。传递的路径可以是本地文件、HDFS(或其他 Hadoop 支持的文件系统)中的文件,也可以是 HTTP、HTTPS 或 FTP URI。要在 Spark 作业中访问文件,请使用 SparkFiles.get(fileName) 查找其下载位置。

如果 recursive 选项设置为 true,则可以给出一个目录。目前只有 Hadoop 支持的文件系统支持目录。

【讨论】:

  • 它是否也适用于亚马逊的 S3?
  • 不是 100% 确定,但我相信它会(现在无法测试)。 Spark 正在回退到 Hadoop 的非 http/ftp URI 路径:github.com/apache/spark/blob/…,我认为它确实可以处理 S3 URI。
【解决方案2】:

如果您的文件是文本文件,位于 HDFS 中,那么,您可以使用:

textFile("<hdfs-path>") of "SparkContext"。

此调用将为您提供一个 RDD,您可以通过使用该 RDD 的方法:“persist()”来跨节点保留它。

此方法可以将文件数据(序列化/反序列化)保存在 MEMORY/DISK 中。

参考:

http://spark.apache.org/docs/latest/programming-guide.html#which-storage-level-to-choose

【讨论】:

  • 这不会将文件放在每个节点上。它跨节点分发。
  • @TheArchetypalPaul:是的,你是对的。我忽略了需求并建议使用persist(),它只处理RDD的单个分区,而不是在集群中的每个节点上复制整个文件。
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多