Hive初始化元数据常见报错

Hive初始化元数据常见报错

清泓
2022-05-17 / 0 评论 / 1,886 阅读 / 7029字 / 正在检测是否收录...

Hive初始化元数据常见报错

  总结一些Hive初始化元数据常见的报错,方便以后的查找


Hive必要配置

  这篇博客主要记录初始化元数据常见的报错,这里只列出Hive必要的配置

修改hive-site.xml文件

  <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <!--连接地址 master处可为主机名或Ip hive为hive在元数据库中的库名-->
      <!--createDatabaseIfNotExist=true 当数据库不存在时创建-->
      <!--useSSL=false MySQL在高版本需要指明是否进行SSL连接-->
      <!--Xml文件中不能使用&,要使用他的转义&amp;来代替-->
      <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
  </property>

  <property>
      <name>javax.jdo.option.ConnectionDriverName</name>
      <!--连接驱动-->
      <value>com.mysql.jdbc.Driver</value>
  </property>

  <property>
      <name>javax.jdo.option.ConnectionUserName</name>
      <!--连接数据库用户名-->
      <value>root</value>
  </property>

  <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <!--连接数据库密码-->
      <value>123456</value>
  </property>

获取Mysql驱动

cp mysql-connector-java.jar ${HIVE_HOME}/lib/

初始化元数据

schematool -initSchema -dbType mysql

常见错误

  以下错误是根据我自己遇到的解决之后整理,如果你用了以下方法还解决不了,欢迎私信交流,解决之后我也会更新到下面
  

错误一

org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version.

解决方案

1.检查hive-site.xml的配置

  大部分报这个错的都是配置写的有问题,尤其是连接地址那部分的大小写,还有就是数据库连接的用户名密码

2.检查用于连接的用户是否有远程登陆的权限

1.png
我这里用于连接的是root,如果host处不是%,那么就没有远程登陆权限

mysql> grant all privileges on *.* to 'root'@'xx' identified by 'xx';

mysql> flush privileges;

 

错误二

[ERROR] Terminal initialization failed; falling back to unsupported
java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected

2.png

解决方案

  出现此种错误应该是jar版本包冲突了,启动hive的时候,由于hive依赖hadoop,启动hive,会将hadoop的配置以及jar包等等导入到hive中,导致jar包版本冲突

  对于这个错误,把${HADOOP_HOME}/share/hadoop/yarn/lib/jline-0.9.94.jar这个文件删除就可以了

rm ${HADOOP_HOME}/share/hadoop/yarn/lib/jline*.jar

 

错误三

  有时候,由于你不是用的root用户进行安装会导致一些临时文件或者目录没有权限的问题

Logging initialized using configuration in file:/opt/apache-hive-2.3.5-bin/conf/hive-log4j2.properties Async: true
Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        at org.apache.hadoop.fs.Path.initialize(Path.java:254)
        at org.apache.hadoop.fs.Path.<init>(Path.java:212)
        at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:659)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:582)
        at org.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:549)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:750)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:686)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:239)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        at java.net.URI.checkPath(URI.java:1823)
        at java.net.URI.<init>(URI.java:745)
        at org.apache.hadoop.fs.Path.initialize(Path.java:251)

解决方案

  这时候就需要配置一下临时文件目录,而且hive的管理用户拥有访问这些目录的权限,我习惯配置在hive的安装目录下,你也可以按照自己的需求配置,但是要注意你要拥有访问这些目录的权限

  修改hive-site.xml文件,添加以下配置

    <property>
          <name>hive.exec.scratchdir</name>
          <!--指定Hive的数据临时文件目录-->
          <value>/usr/local/src/hive/tmp</value>
    </property>

    
    <property>
          <name>hive.server2.logging.operation.log.location</name>
          <value>/usr/local/src/hive/tmp/logs</value>
    </property>

    <property>
          <name>hive.downloaded.resources.dir</name>
          <!--下载资源目录-->
          <value>/usr/local/src/hive/tmp/resources</value>
    </property>

错误四

  由于缺失mysql的依赖,连接不上数据库

org.apache.hadoop.hive.metastore.HiveMetaException: 
Failed to load driver Underlying cause: java.lang.ClassNotFoundException : com.mysql.jdbc.Driver Use --verbose for detailed stacktrace. 
*** schemaTool failed

  对于这个问题,需要下载一个对应版本的mysql-connector.jar 然后放到hive的lib目录。要下载对应版本的依赖,不然还是可能连接不上

关于缺少连接mysql依赖的其他报错信息

[root@master apache-hive-3.1.2-bin]# bin/schematool -initSchema -dbType mysql -verbos
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/export/server/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/export/server/hadoop-3.3.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL: jdbc:mysql:h1//:3306/hive3?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: root
org.apache.hadoop.hive.metastore.HiveMetaException: Failed to load driver
Underlying cause: java.lang.ClassNotFoundException : com.mysql.jdbc

解决方案:

  将驱动重命名成 mysql-connector-java.jar,然后放到/usr/share/java和$JAVA_HOME/lib 这两个目录,有些版本一定要重命名成mysql-connector-java.jar,否则可能会找不大驱动。如果还是不行,那就检查一下驱动版本。
  

错误五

  初始化的时候连接数据库被拒绝

org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version.
Underlying cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : 
Access denied for user 'hive'@'%' to database 'hive'
SQL Error code: 1044
Use --verbose for detailed stacktrace.
*** schemaTool failed ***

这个是由于mysql 的hive用户没有访问hive这个库的权限,可以参考错误1进行检查
  

错误六

  在使用hive元数据服务方式访问hive时,使用jdbc连接到mysql时提示错误:

java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

3.png
  如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启。

解决方案

  在hive-site.xml jdbcURL处配置

&amp;allowPublicKeyRetrieval=true&useSSL=false
2

打赏

评论

博主关闭了当前页面的评论