Hadoop 无法使用java连接到AWS EMR上的配置单元
我已经用hive安装了AWS EMR群集。我想使用java从本地机器连接到hive thrift服务器。我尝试了以下代码-Hadoop 无法使用java连接到AWS EMR上的配置单元,hadoop,amazon-web-services,hive,emr,Hadoop,Amazon Web Services,Hive,Emr,我已经用hive安装了AWS EMR群集。我想使用java从本地机器连接到hive thrift服务器。我尝试了以下代码- Class.forName("com.amazon.hive.jdbc3.HS2Driver"); con = DriverManager.getConnection("jdbc:hive2://ec2XXXX.compute-1.amazonaws.com:10000/default","hadoop", ""); 在《开发人员指南》中提到,在类路径中添加了与配置单元j
Class.forName("com.amazon.hive.jdbc3.HS2Driver");
con = DriverManager.getConnection("jdbc:hive2://ec2XXXX.compute-1.amazonaws.com:10000/default","hadoop", "");
在《开发人员指南》中提到,在类路径中添加了与配置单元jdbc驱动程序相关的JAR。
但我在尝试连接时遇到异常。
我能够使用上述代码(使用不同的jdbc驱动程序)连接到简单hadoop集群上的hive服务器。
有人能告诉我我是否遗漏了什么吗?
是否可以使用配置单元jdbc从本地计算机连接到AWS EMR上的配置单元服务器?(注释中的合并答案)
配置单元正在端口10000上运行,但仅在本地运行,您必须创建到emr的ssh隧道 以下是针对配置单元0.13.1的 创建隧道
ssh -o ServerAliveInterval=10 -i path-to-key-file -N -L 10000:localhost:10000 hadoop@master-public-dns-name
连接到JDBC
jdbc:hive2://localhost:10000/default
您可以使用库JSch来使用代码
public static void portForwardForHive() {
try {
if(session != null && session.isConnected()) {
return;
}
JSch jsch = new JSch();
jsch.addIdentity(PATH_TO_SSH_KEY_PEM);
String host = REMOTE_HOST;
session = jsch.getSession(USER, host, 22);
// username and password will be given via UserInfo interface.
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.connect();
int assingedPort = session.setPortForwardingL(LPORT, RHOST, RPORT);
System.out.println("Port forwarding done for the post : " + assingedPort);
} catch (Exception e) {
System.out.println(e);
}
}
不确定你是否已经解决了这个问题,但它是EMR中的一个bug,刚刚咬了我一口 对于像您现在这样的直接jdbc连接,您必须在着色的uber jar中包含jdbc驱动程序。对于从dataframes中访问jdbc,您不能访问uber jar中的jar(另一个无关的bug),但必须在命令行中指定它(S3是保存它们的方便地方): --文件s3://mybucketJAR/postgresql-9.4-1201.jdbc4.jar 然而,即使在这之后,如果您特别试图访问蜂巢,您也会遇到另一个问题。Amazon构建了自己的jdbc驱动程序,其类层次结构与普通hive驱动程序(com.Amazon.hive.jdbc41.HS2Driver)不同,但是EMR集群在其标准路径(org.apache.hive.jdbc.HiveDriver)中包含了标准hive jdbc驱动程序 这会自动注册为能够处理jdbc:hive和jdbc:hive2 URL,因此当您尝试连接到一个hive URL时,它会首先找到并使用它—即使您专门注册了amazon URL。不幸的是,这一个与amazon的EMR构建的Hive不兼容 有两种可能的解决方案: 1:找到违规驾驶员并注销: Scala示例:
val jdbcDrv = Collections.list(DriverManager.getDrivers)
for(i <- 0 until jdbcDrv.size) {
val drv = jdbcDrv.get(i)
val drvName = drv.getClass.getName
if(drvName == "org.apache.hive.jdbc.HiveDriver") {
log.info(s"Deregistering JDBC Driver: ${drvName}")
DriverManager.deregisterDriver(drv)
}
}
val hiveCredentials = new java.util.Properties
hiveCredentials.setProperty("user", hiveDBUser)
hiveCredentials.setProperty("password", hiveDBPassword)
hiveCredentials.setProperty("driver", "com.amazon.hive.jdbc41.HS2Driver")
val conn = DriverManager.getConnection(hiveDBURL, hiveCredentials)
这是一个更“正确”的版本,因为它应该覆盖任何预注册的处理程序,即使它们具有完全不同的类层次结构。@FtoTheZ我在安全组中给出了0.0.0.0/0,我认为这应该允许从所有IP访问。我不认为我的EMR让我们在vpc中运行。我是EMR新手,我只是使用AWS教程()设置集群。您能告诉我如何知道我是否需要ssl证书吗?Hive正在端口10000上运行,但仅在本地运行,您必须创建到emr的ssh隧道。为此,您需要一个私钥文件pem,如@FtoTheZ所述。是的,我有一个私钥文件。那么,您的意思是,在尝试使用java连接到hive之前,我需要在java程序中创建到EMR的ssh隧道,然后使用hive jdbc?是的。这来自hive 0.13.1
ssh-o ServerAliveInterval=10-i密钥文件路径-N-L 10000:localhost:10000的文档hadoop@master-公共dns名称
并且您必须将它们连接到jdbc:hive2://localhost:10000/default@FtoTheZ-oh-ok。非常感谢,我会用这种方式试试。