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(),但我不确定它是否能解决我的问题。在我的示例中,变量data是 a 。DataFrame

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

4

3 回答 3

12

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

于 2016-01-05T09:09:26.463 回答
8

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

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

或者

dataframe.repartition(100)
于 2016-06-20T10:31:28.047 回答
1

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

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

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

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

于 2017-10-20T10:21:34.047 回答