Apache spark 确定Spark中数据倾斜的原因
我正在调查一个Spark SQL作业(Spark 1.6.0),由于200个分区中的数据严重倾斜,该作业的性能很差,大多数数据位于1个分区中: 我想知道的是…Spark UI中是否有任何东西可以帮助我了解更多关于数据如何分区的信息?从这里看,我不知道数据帧是在哪些列上分区的。我怎么才能知道呢?(除了查看代码之外,我想知道日志和/或UI中是否有任何东西可以帮助我)Apache spark 确定Spark中数据倾斜的原因,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,我正在调查一个Spark SQL作业(Spark 1.6.0),由于200个分区中的数据严重倾斜,该作业的性能很差,大多数数据位于1个分区中: 我想知道的是…Spark UI中是否有任何东西可以帮助我了解更多关于数据如何分区的信息?从这里看,我不知道数据帧是在哪些列上分区的。我怎么才能知道呢?(除了查看代码之外,我想知道日志和/或UI中是否有任何东西可以帮助我) 其他详细信息,这是使用Spark的DataFrameAPI,Spark版本1.6。底层数据以拼花地板格式存储。Spark UI和日志对
其他详细信息,这是使用Spark的DataFrameAPI,Spark版本1.6。底层数据以拼花地板格式存储。Spark UI和日志对此没有太大帮助。Spark使用算法作为几乎所有内容的默认值。正如您在这里看到的,这基本上回收了Java
hashCode
方法
我建议如下:
- 尝试通过采样和打印RDD或数据帧的内容进行调试。查看键的数据分布(即低方差或低基数)是否存在明显问题
- 如果这是无效的,您可以从日志和UI返回,以计算有多少分区。您可以使用spark找到数据的
,然后取模以查看冲突是什么hashCode
- 看看有没有更好的钥匙可以用
- 看看是否可以改进键的
功能(Java中的默认功能不是很好)hashCode
- 查看是否可以通过执行初始分散/聚集步骤来分两步处理数据,以强制执行一些并行性并减少该分区的处理开销。这可能是最棘手的优化,以获得正确的那些提到这里。基本上,使用随机数生成器对数据进行一次分区,强制数据进行一些初始并行组合,然后使用自然分区器将其再次推送,以获得最终结果。这要求应用的操作是可传递的和关联的。这种技术在网络上运行两次,因此非常昂贵,除非数据实际上是高度倾斜的