scala - 如何在 Spark 中处理大参考数据
问题描述
我有大数据集(比如说 4gb),用作处理另一个大数据集(100-200gb)的参考源我有 30 个执行器的集群,可以在 10 个节点上执行此操作。所以对于每个执行者我都有自己的jvm,对吧?每次它加载整个参考数据集。而且耗时长,效率低。如果有什么好的方法来处理这个?目前我将数据存储在 s3 aws 并使用 emr 运行所有内容。使用我可以即时查询的更优雅的存储,或者将例如 redis 作为我的集群的一部分并推送数据而不是查询它可能会更好吗?
UPD1:
- 平面数据是 S3 上按 128Mb 分区的 gzip 压缩 csv 文件。
- 它被读入数据集(coalesce 是为了减少分区数量,以便在更少的节点上传播数据)
val df = sparkSession.sqlContext.read.format("com.databricks.spark.csv")
.option("header", "false")
.schema(schema)
.option("delimiter", ",")
.load(path)
.coalesce(3)
.as[SegmentConflationRef]
- 比我需要将平面数据转换为有序分组列表并放入一些键值存储,在这种情况下是内存映射。
val data: Seq[SegmentConflationRef] = ds.collect()
val map = mutable.Map[String, Seq[SegmentConflationRef]]()
data.groupBy(_.source_segment_id).map(c => {
map += (c._1 -> c._2.sortBy(_.source_start_offset_m))
})
- 之后,我将从另一个数据集进行查找。
因此,在这种情况下,我希望在每个执行程序中复制参考映射。一个问题是如何跨节点广播如此大的地图,或者应该有什么更好的方法?可能不是从一开始就使用 Spark 并在每个执行程序中从 hdfs 本地加载数据?
解决方案
遗憾的是,Apache Spark 并不是解决任何问题的即插即用解决方案。
首先,您必须大致了解 Apache Spark 的工作原理。然后,您必须使用 Spark UI 来监控并查看为什么您的流程不是最佳的。此页面上链接的官方文档通常是一个好的开始:
https://spark.apache.org/docs/latest/index.html
真正有用的是学习使用 Spark Web UI!一旦您了解了每条信息的含义,您就会知道应用程序的瓶颈在哪里。本文涵盖 Spark Web UI 的基本组件:https ://databricks.com/blog/2015/06/22/understanding-your-spark-application-through-visualization.html
推荐阅读
- java - 尝试从 Java EE 应用程序使用 SOAP WS 时出现 401 Unauthorized
- javascript - 结构化 JSON 项目的正则表达式匹配
- java - 未执行while循环的继续指令
- html - 如何在 html 内部重定向页面一次?
- rdf - 拆分 n-quads 文件中包含的所有不同图形
- mysql - 选择未订购或无订单且状态为成功的产品
- python - 如何使用 yticks() 设置 yticks 的数量
- reactjs - 如何在 iOS 上的 React Native 中的 ImageBackground 上的父视图内显示文本元素?
- go - 如何在 go-xorm 中为 postgres 声明外键关系?
- java - 如何将 System.currentTimeMillis 转换为时间格式?(HH:MM:SS)