将我的数据(假设表)传输到HDFS之后,我不知道如何复制我的数据(哪一部分去往哪个机器(节点))。
因此,运行Spark SQL查询的某些人说,您可以提示我数据偏斜。
但是我怎么知道我的数据是歪斜的,所以我可以给出提示?
答案 0 :(得分:2)
这实际上取决于您的数据质量以及如何使用这些数据。另外,取决于您的Spark如何实现算法。基本上,您可以使用SQL来使某些查询选择列之一作为键,例如user_name。 id等,然后通过查看是否存在巨大差异来进行分组。
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是数据偏斜问题。
关于解决Apache Spark中的数据偏斜问题的参考文献很少 1。http://silverpond.com.au/2016/10/06/balancing-spark.html 2。https://databricks.com/session/handling-data-skew-adaptively-in-spark-using-dynamic-repartitioning
答案 1 :(得分:-2)
在诸如HDFS之类的任何分布式系统中加载数据时,需要使用分区键进行加载。在这种情况下,如果某个分区键值的记录数比其他值多,则您的数据分布不均匀。即使您的数据略有倾斜,大多数情况下火花仍然可以正常工作,例如,在一个分区值中,您拥有90%的数据,而在另一个分区中,您拥有90%的数据,那么这对于大型数据集将是一个挑战。与另一项任务相比,您的一项任务会做更多的工作,并且火花将停留在一项任务中。因此数据分析是重要因素
为了处理数据Skegness,您需要均匀地划分数据,或者将使用迭代广播联接。 Databricks上有一篇很棒的文章。请检查Databricks的文本迭代广播连接。
——————————
默认情况下,为一个HDFS块创建一个分区。默认情况下为64 MB。从火花中读取数据时,如果您不打算为并行性提供任何参数,那么它将为每个块创建一个任务。举个例子,您有4个核心,分区是5。每个分区大约需要10分钟。因此4个内核将在4个分区上并行工作,并在10分钟内完成。然后,一旦一个空闲核心占用了最后一个分区,它将在接下来的10分钟内完成。所以更多的分区也不是很好。如果分区较少,那么如果您的大多数数据驻留在一个分区中,那么一项并行性将更少,并且数据倾斜可能会发生,并且一项任务的工作量将超过另一项。