繁体   English   中英

如何在Spark中处理大参考数据

[英]How to handle big reference data in Spark

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

UPD1:

  1. 平面数据是在S3上以gzip压缩的csv文件,并以128Mb分配。
  2. 它被读入数据集(coalesce用于减少分区数,以便将数据分散到更少的节点上)

    val df = sparkSession.sqlContext.read.format("com.databricks.spark.csv")
          .option("header", "false")
          .schema(schema)
          .option("delimiter", ",")
          .load(path)
          .coalesce(3)
          .as[SegmentConflationRef]

  1. 比我需要将平面数据转换为有序的分组列表并放入一些键值存储(在这种情况下为内存映射)。
    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))
    })
  1. 之后,我将从另一个数据集中进行查找。

因此,在这种情况下,我希望在每个执行程序中都复制参考映射。 一个问题是如何在节点之间广播如此大的地图,或者什么是更好的方法? 可能不是一开始就使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM