scala - 如何在 Spark 中处理大引用数据

标签 scala apache-spark redis bigdata amazon-emr

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

UPD1:

  1. 平面数据是 S3 上按 128Mb 分区的 gzip 压缩 csv 文件。
  2. 它被读入数据集(合并是为了减少分区数量,以便在更少的节点上传播数据)

    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. 之后,我将从另一个数据集中进行查找。

所以在那种情况下,我想在每个执行者中复制引用 map 。一个问题是如何跨节点广播这么大的 map ,或者应该有什么更好的方法?可能不从一开始就使用 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

关于scala - 如何在 Spark 中处理大引用数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56014089/

相关文章:

scala - 根据包含列表元素的列值创建 bool 标志

mongodb - MongoDB 应该使用 Memcache 还是 Redis 进行缓存?

python - 加入一个庞大而庞大的 Spark 数据框

dataframe - 有没有办法限制 spark 数据帧类型中的字符串长度?

algorithm - 如何使用Redis检查人员的可用性

docker - OpenShift docker 注册表无法从 registry-1.docker.io 中提取图像

java - 异常处理标准

scala - 在 spark 中使用 partitionBy 和 coalesce

scala - 在 Scala 方法中自动委派给 val

mongodb - 使用 Scala 创建嵌套字段并将数据框存储到 MongoDB?