常见问题
-
通过 Hive Metastore 访问 Iceberg 表报错:
failed to get schema
或Storage schema reading not supported
在 Hive 的 lib/ 目录放上
iceberg
运行时有关的 jar 包。在
hive-site.xml
配置:metastore.storage.schema.reader.impl=org.apache.hadoop.hive.metastore.SerDeStorageSchemaReader
配置完成后需要重启Hive Metastore。
-
连接 Kerberos 认证的 Hive Metastore 报错:
GSS initiate failed
通常是因为 Kerberos 认证信息填写不正确导致的,可以通过以下步骤排查:
-
1.2.1 之前的版本中,Doris 依赖的 libhdfs3 库没有开启 gsasl。请更新至 1.2.2 之后的版本。
-
确认对各个组件,设置了正确的 keytab 和 principal,并确认 keytab 文件存在于所有 FE、BE 节点上。
hadoop.kerberos.keytab
/hadoop.kerberos.principal
:用于 Hadoop hdfs 访问,填写 hdfs 对应的值。hive.metastore.kerberos.principal
:用于 hive metastore。
-
尝试将 principal 中的 ip 换成域名(不要使用默认的
_HOST
占位符) -
确认
/etc/krb5.conf
文件存在于所有 FE、BE 节点上。
-
-
访问 HDFS 3.x 时报错:
java.lang.VerifyError: xxx
1.2.1 之前的版本中,Doris 依赖的 Hadoop 版本为 2.8。需更新至 2.10.2。或更新 Doris 至 1.2.2 之后的版本。
-
使用 KMS 访问 HDFS 时报错:
java.security.InvalidKeyException: Illegal key size
升级 JDK 版本到 >= Java 8 u162 的版本。或者下载安装 JDK 相应的 JCE Unlimited Strength Jurisdiction Policy Files。
-
查询 ORC 格式的表,FE 报错
Could not obtain block
或Caused by: java.lang.NoSuchFieldError: types
对于 ORC 文件,在默认情况下,FE 会访问 HDFS 获取文件信息,进行文件切分。部分情况下,FE 可能无法访问到 HDFS。可以通过添加以下参数解决:
"hive.exec.orc.split.strategy" = "BI"
其他选项:HYBRID(默认),ETL。
-
通过 JDBC Catalog 连接 SQLServer 报错:
unable to find valid certification path to requested target
请在
jdbc_url
中添加trustServerCertificate=true
选项。 -
通过 JDBC Catalog 连接 MySQL 数据库,中文字符乱码,或中文字符条件查询不正确
请在
jdbc_url
中添加useUnicode=true&characterEncoding=utf-8
注:1.2.3 版本后,使用 JDBC Catalog 连接 MySQL 数据库,会自动添加这些参数。
-
通过 JDBC Catalog 连接 MySQL 数据库报错:
Establishing SSL connection without server's identity verification is not recommended
请在
jdbc_url
中添加useSSL=true
-
连接 Hive Catalog 报错:
Caused by: java.lang.NullPointerException
如 fe.log 中有如下堆栈:
Caused by: java.lang.NullPointerException
at org.apache.hadoop.hive.ql.security.authorization.plugin.AuthorizationMetaStoreFilterHook.getFilteredObjects(AuthorizationMetaStoreFilterHook.java:78) ~[hive-exec-3.1.3-core.jar:3.1.3]
at org.apache.hadoop.hive.ql.security.authorization.plugin.AuthorizationMetaStoreFilterHook.filterDatabases(AuthorizationMetaStoreFilterHook.java:55) ~[hive-exec-3.1.3-core.jar:3.1.3]
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.getAllDatabases(HiveMetaStoreClient.java:1548) ~[doris-fe.jar:3.1.3]
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.getAllDatabases(HiveMetaStoreClient.java:1542) ~[doris-fe.jar:3.1.3]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_181]可以尝试在
create catalog
语句中添加"metastore.filter.hook" = "org.apache.hadoop.hive.metastore.DefaultMetaStoreFilterHookImpl"
解决。 -
通过 Hive Catalog 连接 Hive 数据库报错:
RemoteException: SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]
如果在 show databases
和 show tables
都是没问题的情况下,查询的时候出现上面的错误,我们需要进行下面两个操作:
- fe/conf、be/conf 目录下需放置 core-site.xml 和 hdfs-site.xml
- BE 节点执行 Kerberos 的 kinit 然后重启 BE ,然后再去执行查询即可.
-
如果创建 Hive Catalog 后能正常
show tables
,但查询时报java.net.UnknownHostException: xxxxx
可以在 CATALOG 的 PROPERTIES 中添加
'fs.defaultFS' = 'hdfs://<your_nameservice_or_actually_HDFS_IP_and_port>'
-
在hive上可以查到hudi表分区字段的值,但是在doris查不到。
doris和hive目前查询hudi的方式不一样,doris需要在hudi表结构的avsc文件里添加上分区字段,如果没加,就会导致doris查询partition_val为空(即使设置了hoodie.datasource.hive_sync.partition_fields=partition_val也不可以)
{
"type": "record",
"name": "record",
"fields": [{
"name": "partition_val",
"type": [
"null",
"string"
],
"doc": "Preset partition field, empty string when not partitioned",
"default": null
},
{
"name": "name",
"type": "string",
"doc": "名称"
},
{
"name": "create_time",
"type": "string",
"doc": "创建时间"
}
]
} -
Hive 1.x 的 orc 格式的表可能会遇到底层 orc 文件 schema 中列名为
_col0
,_col1
,_col2
... 这类系统列名,此时需要在 catalog 配置中添加hive.version
为 1.x.x,这样就会使用 hive 表中的列名进行映射。CREATE CATALOG hive PROPERTIES (
'hive.version' = '1.x.x'
); -
使用JDBC Catalog将MySQL数据同步到Doris中,日期数据同步错误。需要校验下MySQL的版本是否与MySQL的驱动包是否对应,比如MySQL8以上需要使用驱动com.mysql.cj.jdbc.Driver。
-
在Catalog中配置Kerberos时,如果报错
SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]
,那么需要将core-site.xml
文件放到"${DORIS_HOME}/be/conf"
目录下。如果访问HDFS报错
No common protection layer between client and server
,检查客户端和服务端的hadoop.rpc.protection
属性,使他们保持一致。<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
</configuration> -
在Catalog中配置Kerberos时,报错
Unable to obtain password from user
的解决方法:- 用到的principal必须在klist中存在,使用
klist -kt your.keytab
检查。 - 检查catalog配置是否正确,比如漏配
yarn.resourcemanager.principal
。 - 若上述检查没问题,则当前系统yum或者其他包管理软件安装的JDK版本存在不支持的加密算法,建议自行安装JDK并设置
JAVA_HOME
环境变量。
- 用到的principal必须在klist中存在,使用
-
查询配置了Kerberos的外表,遇到该报错:
GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos Ticket)
,一般重启FE和BE能够解决该问题。- 重启所有节点前可在
"${DORIS_HOME}/be/conf/be.conf"
中的JAVA_OPTS参数里配置-Djavax.security.auth.useSubjectCredsOnly=false
,通过底层机制去获取JAAS credentials信息,而不是应用程序。 - 在JAAS Troubleshooting中可获取更多常见JAAS报错的解决方法。
- 重启所有节点前可在
-
使用Catalog查询表数据时发现与Hive Metastore相关的报错:
Invalid method name
,需要设置hive.version
参数。CREATE CATALOG hive PROPERTIES (
'hive.version' = '1.x.x'
); -
BlockMissingExcetpion: Could not obtain block: BP-XXXXXXXXX No live nodes contain current block
可能的处理方式有:
- 通过
hdfs fsck file -files -blocks -locations
来查看具体该文件是否健康。 - 通过
telnet
来检查与 datanode 的连通性。 - 查看 datanode 日志。
如果出现以下错误:
org.apache.hadoop.hdfs.server.datanode.DataNode: Failed to read expected SASL data transfer protection handshake from client at /XXX.XXX.XXX.XXX:XXXXX. Perhaps the client is running an older version of Hadoop which does not support SASL data transfer protection
则为当前 hdfs 开启了加密传输方式,而客户端未开启导致的错误。使用下面的任意一种解决方案即可:
- 拷贝 hdfs-site.xml 以及 core-site.xml 到 be/conf 和 fe/conf 目录。(推荐)
- 在 hdfs-site.xml 找到相应的配置
dfs.data.transfer.protection
,并且在 catalog 里面设置该参数。
- 通过