【问题标题】:How to set the number of partitions/nodes when importing data into Spark将数据导入Spark时如何设置分区/节点数
【发布时间】:2016-04-08 11:10:15
【问题描述】:

问题:我想使用以下方法将数据从 S3 导入 Spark EMR:

data = sqlContext.read.json("s3n://.....")

有没有一种方法可以设置 Spark 用于加载处理数据的节点数?这是我如何处理数据的示例:

data.registerTempTable("table")
SqlData = sqlContext.sql("SELECT * FROM table")

上下文:数据不是太大,加载到Spark和查询都需要很长时间。我认为 Spark 将数据划分为太多节点。我希望能够手动设置。我知道在处理 RDD 和 sc.parallelize 时,我可以将分区数作为输入传递。另外,我见过repartition(),但我不确定它是否能解决我的问题。在我的示例中,变量 dataDataFrame

让我更准确地定义分区。定义一:通常称为“分区键”,其中选择并索引一列以加快查询速度(这不是我想要的)。定义二:(这是我关心的地方)假设你有一个数据集,Spark 决定将它分布在许多节点上,这样它就可以并行地对数据运行操作。如果数据大小太小,则可能会进一步减慢该过程。我如何设置该值

【问题讨论】:

  • 让我更精确地定义分区。定义一:通常称为“分区键”,选择一列并建立索引以加快查询速度。定义二:(这是我关心的地方)假设你有一个数据集,Spark 决定将它分布在许多节点上,这样它就可以并行地对数据运行操作。如果数据大小太小,则可能会进一步减慢该过程。如何设置该值?
  • 您正确区分了关系数据库中的表分区与 RDD 分区之间的区别。请参阅How to define partitioning of a Spark DataFrame?,它描述了如何进行 DataFrame 分区,如 RDD/分布式分区

标签: sql apache-spark database-partitioning pyspark-sql


【解决方案1】:

默认情况下,它分为 200 个集合。您可以通过在 sql 上下文 sqlContext.sql("set spark.sql.shuffle.partitions=10"); 中使用 set 命令来更改它。但是,您需要根据您的数据特征谨慎设置它。

【讨论】:

  • 那么你怎么知道设置它呢?什么“数据特征”?
【解决方案2】:

您可以在数据帧上调用repartition() 来设置分区。您甚至可以在创建 hive 上下文或传递给 spark-submit jar 之后设置 spark.sql.shuffle.partitions 这个属性:

spark-submit .... --conf spark.sql.shuffle.partitions=100

dataframe.repartition(100)

【讨论】:

    【解决方案3】:

    “输入”分区的数量由文件系统配置固定。

    1Go 的 1 个文件,块大小为 128M,将为您提供 10 个任务。我不确定您是否可以更改它。

    重新分区可能会非常糟糕,如果您有很多输入分区,这将在分区之间产生大量 shuffle(数据流量)。

    没有什么神奇的方法,一定要试试,用webUI看看生成了多少任务。

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      相关资源
      最近更新 更多