Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 无法使用java连接到AWS EMR上的配置单元_Hadoop_Amazon Web Services_Hive_Emr - Fatal编程技术网

Hadoop 无法使用java连接到AWS EMR上的配置单元

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

我已经用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", "");
在《开发人员指南》中提到,在类路径中添加了与配置单元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。非常感谢,我会用这种方式试试。