中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

(24.0.RC1已下线)基于ORC社区发布的Release版本,partition字段为特殊字符会导致HDFS URL解析错误的解决方法

问题现象描述

执行OmniOperator作业的时候,如果ORC/Parquet格式的Hive数据集设置了partition字段,并且partition字段为string、char或者varchar类型,其中内容包含1个或多个特殊字符,例如!#$%&()*+,-./:;<=>?@[\]^_`{|}~等,作业会执行失败,有如下错误日志,并且作业没有执行结果。

错误日志1:文件不存在

1
2
3
4
ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
org.apache.spark.util.TaskCompletionListenerException: delete nullptr error for reader

Previous exception in task: Can't open/user/hive/warehouse/tpcds_bin_ partitioned_decimal_orc_2.db/partition_null_varchar/c_varchar=7893456=bbb/000000_0. status code: 2, message: File does not exist: /user/hive/warehouse/tpcds_bin_partioned_decimal_orc_2.db/partition_null_varchar/c_varchar=7893456=bbb/000000_0

错误日志2:ORC格式下HDFS URL格式错误

1
2
3
4
ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
org.apache.spark.util.TaskCompletionListenerException: delete nullptr error for reader

Previous exception in task: Malformed URL: hdfs: //server1:9000/user/hive/warehouse/tpcds_bin_partitioned_decimal_orc_2.db/partition_null_varchar/c_varchar=3333|bbb/000000_0

错误日志3:Parquet格式下HDFS URL格式错误

1
2
3
Previous exception in task: IOError: Invalid: Cannot parse URI: 'hdfs://server1:9000/user/hive/warehouse/mytest.db/partition_null_varchar/c_varchar=1233456|/000000_0'
/home/code/arrow/cpp/src/arrow/filesystem/filesystem.cc:750  ParseFileSystemUri(uri_string)
	com.huawei.boostkit.spark.jni.ParquetColumnarBatchJniReader.initializeReader(Native Method)

关键过程、根本原因分析

这是开源ORC/Arrow组件依赖的第三方库uriparser的一个BUG

  • Spark引擎侧传入Native ORC的HDFS URL被ORC的OrcHdfsFile.cc进行多余转义,接着利用HDFS C++客户端libhdfspp向服务端请求后,HDFS服务端返回文件不存在。
  • Native ORC使用了HDFS C++客户端libhdfspp,而后者利用第三方依赖uriparser2进行URL解析,如果URL包含特殊字符,例如|,{,},[,],<,>,'等,会解析失败导致返回HDFS URL格式异常。
  • 同样的,Arrow也依赖了uriparser解析URL,因此Native Parquet也不支持特殊字符,会解析失败导致返回HDFS URL格式异常。

结论、解决方案及效果