1. 在执行Sparksql操作orc类型的表时抛出:java.lang.IndexOutOfBoundsException 或 java.lang.NullPointerException
原因:分区或者表下存在空的orc文件。该BUG在Spark2.3.0之后才修复
解决方法:规避解决。修改ORC的默认分割策略为:hive.exec.orc.split.strategy=BI进行解决。Orc的分split有3种策略(ETL、BI、HYBIRD),默认是HYBIRD(混合模式,根据文件大小和文件个数自动选择ETL还是BI模式),BI模式是按照文件个数来分split。
2. 操作snappy压缩的表时抛出:java.lang.RuntimeException: native snappy library not available: this version of libhadoop was built without snappy support.
原因:是由于没有在java.library.path上加上snappy库
解决方法:修改spark-default.conf配置文件加上:
spark.executor.extraLibraryPath /data/Install/hadoop/lib/native
或者
spark.executor.extraJavaOptions -Djava.library.path=/data/Install/hadoop/lib/native
3. Spark-sql在执行时将一个很小的文件拆分成了20个task进行运行,导致运行速度太慢。
原因:是由于HaddopRDD生成过程中partitions是会拿参数mapreduce.job.maps或mapred.map.tasks(20)和spark默认分区数(2)做最大值比较,所以导致默认为20
解决方法:修改该参数就可以将task降下来。
4. 使用jdbc的方式连接到ThriftServer,可以执行类似与show tabls的等操作,但是不能执行select相关的操作:java.io.IOException: Failed to create local dir in /tmp/blockmgr-adb70127-0a28-4256-a205-c575acc74f9d/06.
原因:用户很久没使用ThriftServer导致系统清理了该上级目录或者用户根本就对该目录没有写权限
解决方法:重启ThriftServer和设置目录权限:spark.local.dir
5. 在Spark SQL中运行的SQL语句过于复杂的话,会出现 java.lang.StackOverflowError 异常
原因:这是因为程序运行的时候 Stack 大小大于 JVM 的设置大小
解决方法:通过在启动 Spark-sql 的时候加上 --driver-java-options “-Xss10m” 选项解决这个问题
6. INSERT INTO重复执行出现:
Unable to move source hdfs://bigdata05/tmp/hive-hduser1101_hive_2017-09-11_14-50-56_038_2358196375683362770-82/-ext-10000/part-00000 to destination hdfs://bigdata05/user/hive
原因:该问题是2.1.0的Bug,在Spark2.1.1中已经解决2.1.0。
解决方法:2.1.0规避办法INSERT OVERWRITE不带分区重复执行不会出现问题
7. 数据倾斜
详情参考Spark性能优化指南——高级篇 - 美团技术团队 (meituan.com)
错误汇总参考: