问题:我想使用将数据从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()
,但我不确定它是否能解决我的问题。在我的示例中,变量data
是DataFrame
。
让我更精确地定义分区。定义一:通常被称为"分区键",其中一列被选择并索引以加快查询速度(这不是我想要的)。定义二:(这就是我担心的地方)假设你有一个数据集,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来查看生成了多少任务。