如何在将数据导入Spark时设置分区/节点的数量



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

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

有没有办法设置Spark用于加载处理数据的节点数量?这是我如何处理数据的一个例子:

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

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

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

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

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

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

dataframe.repartition(100)

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

1个1Go的文件,块大小为128M,将为您提供10项任务。我不确定你能不能改。

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

没有神奇的方法,你必须尝试,并使用webUI来查看生成了多少任务。

相关内容

  • 没有找到相关文章

最新更新