Spark作业提交Yarn运行读取HDFS Excel行数少于本地运行问题求助
问题根因梳理
- Yarn模式下Excel行数缺失和HDFS块读取无关,是
com.crealytics:spark-excel_2.11:0.13.1版本的分布式分片逻辑bug导致:Excel属于非分片友好的行存储格式,该版本默认会按executor核数拆分文件分片,但不会处理跨分片的行合并,只有包含完整行的分片会被计数,你看到的12条就是首个分片内的完整行数。 - Local模式能读全量是因为计算全部在driver端执行,不会拆分文件分片,自然不会出现行丢失;抛出的JDBC异常是Simba Impala JDBC驱动不支持你代码中调用的特定JDBC特性,和Excel读取逻辑无关。
可行解决方案
1. 修复Yarn模式Excel行缺失问题
优先选择第一个方案:
- 升级spark-excel依赖到适配Scala2.11、Spark2.x的兼容修复版,将提交命令中
--packages参数的包版本替换为com.crealytics:spark-excel_2.11:0.14.0即可,该版本已修复分布式分片读取的行丢失问题。 - 若无法升级依赖,读取Excel时强制关闭分片逻辑,添加配置项
option("partitionSize", Long.MaxValue)让全量文件内容在单个分片内读取,参考代码:
val excelDf = spark.read.format("com.crealytics.spark.excel") .option("header", "true") .option("partitionSize", Long.MaxValue) .load("hdfs://your_excel_file_path")
2. 修复Local模式JDBC报错
- 检查代码中JDBC调用配置,移除
ResultSet.TYPE_SCROLL_INSENSITIVE、autoCommit=false这类Simba驱动不支持的参数。 - 替换为和集群Impala版本匹配的官方JDBC4.2驱动包,即可解决特性不兼容问题。
3. 提交命令优化
你当前提交命令中--driver-class-path和--jars重复配置了JDBC包,Yarn模式下--jars会自动将包分发到executor并加入driver类路径,重复配置容易触发类冲突,优化后提交命令参考:
spark2-submit --master yarn --deploy-mode client --num-executors 5 --executor-memory 5G --executor-cores 5 --driver-memory 8G --class com.test.Main --packages com.crealytics:spark-excel_2.11:0.14.0 --jars /test/ImpalaJDBC41.jar,/test/TCLIServiceClient.jar /test/test-1.0-SNAPSHOT.jar
内容的提问来源于stack exchange,提问作者Zdev
相关产品推荐
相关产品推荐

