Apache spark 如何知道我的数据是倾斜的?

Apache spark 如何知道我的数据是倾斜的?,apache-spark,hadoop,apache-spark-sql,hdfs,Apache Spark,Hadoop,Apache Spark Sql,Hdfs,将数据(假设表)传输到HDFS后,我不知道如何复制数据(哪个部分到哪个机器(节点)) 所以,运行sparksql查询有人说您可以向Spark提示我的数据是倾斜的 但我怎么知道我的数据是倾斜的,这样我就可以给spark提示了 当您在任何分布式系统(如HDFS)中加载数据时,您可以使用w.r.t分区键加载数据。在这种情况下,如果某个分区键值的记录数比其他值多,则数据分布不均匀。大多数情况下,即使数据稍微倾斜,spark也能很好地工作,但例如,在一个分区值中,您拥有90%的数据,而另一个分区值拥有10

将数据(假设表)传输到HDFS后,我不知道如何复制数据(哪个部分到哪个机器(节点))

所以,运行sparksql查询有人说您可以向Spark提示我的数据是倾斜的


但我怎么知道我的数据是倾斜的,这样我就可以给spark提示了

当您在任何分布式系统(如HDFS)中加载数据时,您可以使用w.r.t分区键加载数据。在这种情况下,如果某个分区键值的记录数比其他值多,则数据分布不均匀。大多数情况下,即使数据稍微倾斜,spark也能很好地工作,但例如,在一个分区值中,您拥有90%的数据,而另一个分区值拥有10%的数据,这对于大型数据集来说将是一个挑战。你的一项任务将比另一项任务做更多的工作,火花将停留在一项任务中。因此,数据分析是一个重要的因素

为了处理数据skegeness,您需要对数据进行均匀分区,或者使用迭代广播连接。这篇文章中有一篇来自Databricks的优秀文章。请用文本检查Databricks

---------


默认情况下,为一个HDF块创建一个分区。默认情况下是64MB。从spark读取数据时,如果您不打算为并行性提供任何参数,那么它将为每个块创建一个任务。举个例子,你有4个核,分区是5。每个分区大约需要10分钟,因此4个内核将在4个分区上并行工作,并在10分钟内完成。然后,最后一个分区将在接下来的10分钟内完成,一旦它被一个空闲内核占用。所以更多的分区也不好。在分区较少的情况下,如果大部分数据位于一个分区中,并且一个任务比另一个任务要做更多的工作,那么并行性就会降低,并且可能会发生数据倾斜。

这实际上取决于您的数据质量以及您希望如何使用这些数据。此外,这取决于你的火花如何实现算法。基本上,您可以使用SQL使一些查询选择其中一列作为键,例如user\u name。以此类推,通过观察是否存在巨大差异来分组

For example if have such case 
select count(distinct(user_name)) from your table group by user_id 

count           username 
199999999999      abc123
12                abc124
6                 abc121
检查上面的示例,用户名abc123是数据倾斜问题

关于在ApacheSpark中解决数据倾斜问题的参考文献很少 1.
2.

Hello Chandan,我明白了,现在当我没有分区时会发生什么,在这种情况下,不存在数据倾斜的问题?我在我的回答中添加了几点。请检查128MB是新的默认块大小。可以使用glom方法查看spark上的每个分区计数