首页 > 解决方案 > Phoenix/HBase 在 Windows 上抛出 NoSuchMethodError: sun.misc.Unsafe.putLong

问题描述

我们的产品使用 Phoenix JDBC 驱动连接 HBase,在 Linux 上运行良好。我想在 Windows 上运行它,但连接失败。

我尝试从 IntelliJ Idea 的数据库连接,但由于同样的错误而失败。我曾经在 Idea 中连接到另一个 HBase 安装,该安装在 7 月份在那里运行良好。但它也因同样的错误而失败。

2020-11-18 11:36:54,835 [ 119005]   INFO - .DatabaseConnectionEstablisher - Connecting to: jdbc:phoenix:dev.internal:2181:/hbase-unsecure 
2020-11-18 11:36:57,362 [ 121532]   WARN - .DatabaseConnectionEstablisher - Connecting to: jdbc:phoenix:dev.internal:2181:/hbase-unsecure 
2020-11-18 11:36:57,364 [ 121534]   WARN - .DatabaseConnectionEstablisher - [08004][103] ERROR 103 (08004): Unable to establish connection. 
2020-11-18 11:36:57,368 [ 121538]   WARN - ic.GenericDatabaseErrorHandler - ERROR 103 (08004): Unable to establish connection. 

java.sql.SQLException: ERROR 103 (08004): Unable to establish connection.
at org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:542)
at org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:150)
at org.apache.phoenix.query.ConnectionQueryServicesImpl.openConnection(ConnectionQueryServicesImpl.java:460)
at org.apache.phoenix.query.ConnectionQueryServicesImpl.access$400(ConnectionQueryServicesImpl.java:292)
at  at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:76)
at org.apache.phoenix.query.ConnectionQueryServicesImpl.init(ConnectionQueryServicesImpl.java:3077)
at org.apache.phoenix.jdbc.PhoenixDriver.getConnectionQueryServices(PhoenixDriver.java:255)
at org.apache.phoenix.jdbc.PhoenixEmbeddedDriver.createConnection(PhoenixEmbeddedDriver.java:142)
at org.apache.phoenix.jdbc.PhoenixDriver.connect(PhoenixDriver.java:221)

Caused by: java.lang.NoSuchMethodError: 'void sun.misc.Unsafe.putLong(java.lang.Object, int, long)'
at org.apache.hadoop.hbase.util.UnsafeAccess.putLong(UnsafeAccess.java:248)
at org.apache.hadoop.hbase.util.Bytes$ConverterHolder$UnsafeConverter.putLong(Bytes.java:1489)
at org.apache.hadoop.hbase.util.Bytes.putLong(Bytes.java:788)
at org.apache.hadoop.hbase.client.ClientIdGenerator.generateClientId(ClientIdGenerator.java:51)
at org.apache.hadoop.hbase.client.PerClientRandomNonceGenerator.<init>(PerClientRandomNonceGenerator.java:37)
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.<init>(ConnectionManager.java:698)
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.<init>(ConnectionManager.java:649)

反编译的ideasun.misc.Unsafe有:

@Deprecated
public void putLong(Object o, int offset, long x) {
    putLong(o, (long)offset, x);
}

环境:

OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

Idea中的类路径:

在此处输入图像描述

echo %HADOOP_HOME%
C:\dev\core\jdbc\winutils

echo %PATH%
C:\WINDOWS\system32;C:\dev\core\jdbc\winutils\bin;

JDBC 文件夹:

16.11.2020  17:05    <DIR>          winutils
08.07.2020  12:43            20 764 hbase-annotations-1.1.0.jar
08.07.2020  12:43         1 239 829 hbase-client-1.1.0.jar
08.07.2020  12:43           523 263 hbase-common-1.1.0.jar
08.07.2020  12:23           489 884 log4j-1.2.17.jar
17.12.2019  07:12       109 750 805 phoenix-4.15.0-HBase-1.5-client.jar
08.07.2020  12:16         3 074 133 phoenix-core-4.4.0-HBase-1.1.jar
08.07.2020  12:35        55 186 484 phoenix-shaded-4.4.0-HBase-1.1-1.jar
08.07.2020  12:48           533 455 protobuf-java-2.5.0.jar
08.07.2020  12:21            25 962 slf4j-api-1.6.4.jar
08.07.2020  12:21             8 869 slf4j-log4j12-1.7.5.jar
08.07.2020  12:50           792 964 zookeeper-3.4.6.jar

如何解决?

标签: javahbasephoenix

解决方案


我需要thin:url=http://在主机名(或 IP)之前添加来解决这个问题。

我在 DBeaver Windows 客户端中遇到了类似的错误,问题是 jdbc URL 构造错误。我正在使用从 Phoenix 安装目录获取的瘦客户端 jar。

如果没有添加 jdbc URL,则缺少此部分。


推荐阅读