我有一个大数据集(比如说4GB),用作处理另一个大数据集(100-200GB)的参考源 我有30个执行程序的群集,可在10个节点上执行此操作。 所以对于每个执行者我都有自己的jvm,对吗?每次加载整个参考数据集。而且它需要很长时间并且效率很低。是否有什么好的方法可以解决这个问题?目前,我正在s3 aws上存储数据,并使用emr运行所有内容。可以使用更优雅的存储来进行查询,或者例如将redis作为集群的一部分启动并推送数据,而不是查询它,这可能是个好习惯吗?
UPD1:
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本地加载数据吗?
答案 0 :(得分:2)
遗憾的是,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