Zeppelin 连接 Hive: Required field 'serverProtocolVersion' is unset!
在使用 Zeppelin 连接 Hive 的过程中,你可能会遇到一个错误信息:“Required field 'serverProtocolVersion' is unset! Struct:TO”。这个错误通常出现在 Zeppelin 尝试连接 Hive 时,由于某种原因无法正确获取到 Hive 服务器的版本信息而产生。
错误现象
当你尝试在 Zeppelin 中运行一个连接到 Hive 的代码段时,可能会遇到以下错误信息:
ERROR [2021-01-01 00:00:00,000] [ZeppelinServer] - websocket error
java.lang.RuntimeException: Required field 'serverProtocolVersion' is unset! Struct:TOperationHandle(hasResultSet:true, modifiedRowCount:0, operationType:EXECUTE_STATEMENT, operationId:THandleIdentifier(guid:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], secret:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))
at org.apache.hive.jdbc.Utils.verifySuccess(Utils.java:256)
at org.apache.hive.jdbc.Utils.verifySuccessWithInfo(Utils.java:242)
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:248)
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:355)
at org.apache.zeppelin.jdbc.JDBCInterpreter.executeSql(JDBCInterpreter.java:593)
at org.apache.zeppelin.jdbc.JDBCInterpreter.interpret(JDBCInterpreter.java:769)
at org.apache.zeppelin.interpreter.LazyOpenInterpreter.interpret(LazyOpenInterpreter.java:97)
at org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer$InterpretJob.jobRun(RemoteInterpreterServer.java:839)
at org.apache.zeppelin.scheduler.Job.run(Job.java:188)
at org.apache.zeppelin.scheduler.FIFOScheduler$1.run(FIFOScheduler.java:140)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
原因解释
这个错误通常是由于 Zeppelin 和 Hive 之间的兼容性问题引起的。Zeppelin 需要正确获取 Hive 服务器的版本信息,以便与其进行交互。然而,在某些情况下,Zeppelin 无法正确获取到该信息,导致错误的产生。
解决方案
要解决这个问题,有几个可能的解决方案:
1. 检查 Hive 服务器的运行状态
首先,确保 Hive 服务器正在运行,并且可以通过网络访问。你可以通过尝试在命令行或其他工具中连接到 Hive 服务器,以验证其正常运行。如果 Hive 服务器无法访问,你可能需要检查网络设置或重新启动服务器。
2. 检查 zeppelin-site.xml 配置文件
在 Zeppelin 的配置文件 conf/zeppelin-site.xml
中,确保已正确配置了 Hive 相关的属性。具体来说,你需要检查以下属性是否正确配置:
<property>
<name>zeppelin.jdbc.driver.name</name>
<value>org.apache.hive.jdbc.HiveDriver</value>
<description>The JDBC driver class name for Hive</description>
</property>
<property>
<name>zeppelin.jdbc.url</name>
<value>jdbc:hive2://localhost:10000/default</value>
<description>The JDBC URL for connecting to Hive</description>
</property>
<property>
<name>zeppelin.jdbc.user</name>
<value>your_hive_username</value>
<description>The username for connecting to Hive</description>
</property>
<property>
<name>zeppelin.jdbc.password</name>
<value>your_hive_password</value>
<description>The password for connecting to Hive</description>
</property>
请确保以上配置正确,并替换 your_hive_username
和 your_hive_password
为你自己的 Hive 用户名和密码。
3. 更新 Zeppelin 版本
在某些