不能用Java JDBC从AWS EMR上的Presto连接查询。

问题描述 投票:1回答:1

如果我通过ssh连接到presto emr集群的主节点,我可以运行查询。然而,我希望能够在连接到emr集群的本地机器上从java源代码运行查询。我用默认配置设置了我的presto emr集群。

我已经尝试了端口转发,但似乎还是不行。当我创建连接时,我把它打印出来,它是 "com.facebook.presto.jdbc.PrestoConnection@XXXXXXX",但我仍然怀疑它是否真的连接了,因为我不能执行任何查询,而且它总是超时。

import java.net.URI;
import java.net.URISyntaxException;
import java.sql.*;

public class PrestoJDBC {
    // JDBC driver name and database URL
    static final String JDBC_DRIVER = "com.facebook.presto.jdbc.PrestoDriver";
    //static final String JDBC_DRIVER = "com.teradata.presto.jdbc42.Driver";

    static final String DB_URL = "jdbc:presto://ec2-XX-XX-XXX-XX.us-east-2.compute.amazonaws.com:8889/hive/default";

    //  Database credentials
    static final String USER = "hadoop";
    static final String PASS = "";

    public static void main(String[] args) throws URISyntaxException {
        Connection conn = null;
        Statement stmt = null;
        try{
            //STEP 2: Register JDBC driver
            Class.forName(JDBC_DRIVER);

            //STEP 3: Open a connection
            //conn = DriverManager.getConnection(DB_URL,USER,PASS);
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
            //STEP 4: Execute a query

            stmt = conn.createStatement();
            System.out.println(conn);
            String sql;
            sql = "select * from onedaytest where readOnly=true;";
            ResultSet rs = stmt.executeQuery(sql);

            //STEP 5: Extract data from result set
            while(rs.next()){

                //Display values
                System.out.println(rs.getString(3));
            }
            //STEP 6: Clean-up environment
            rs.close();
            stmt.close();

            conn.close();
        }catch(SQLException se){
            se.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(stmt!=null)
                    stmt.close();
            }catch(SQLException se2){
            }
            try{
                if(conn!=null)
                    conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("Done");
    }

}

我得到一个java.sql.SQLEXception:Error executing query,和一个java.net.SocketTimeoutException。我想知道是否有其他的配置或事情需要我设置才能查询。

jdbc amazon-ec2 amazon-emr presto
1个回答
0
投票

这可能是由于防火墙的原因,它可能不允许你连接到服务器。你必须在Master组中创建一个入站规则。

  1. 为此,首先选择你的集群。
  2. 在 "安全和访问 "标题下,点击 "Master的安全组 "的链接。
  3. 现在选择名称为 "ElasticMapReduce-master "的安全组,然后点击 "编辑入站规则"。
  4. 在底部点击 "Add Rule",然后在类型中选择 "All TCP",在源字段中选择 "my ip "或者添加你要访问的IP地址。
  5. 点击保存规则。

再试一次。会成功的!

© www.soinside.com 2019 - 2024. All rights reserved.