(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格式异常。
父主题: OmniOperator算子加速