簡體   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