【问题标题】:Cannot connect/query from Presto on AWS EMR with Java JDBC无法使用 Java JDBC 从 AWS EMR 上的 Presto 连接/查询
【发布时间】:2019-11-19 10:30:34
【问题描述】:

如果我 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 execution query 和一个 java.net.SocketTimeoutException。我想知道是否需要设置任何其他配置或东西才能进行查询。

【问题讨论】:

  • 确保您的安全组没有阻止建立连接。
  • 我已经检查了 emr 集群的入站网络连接规则,但我不确定要添加什么规则或应该是什么端口号。
  • 默认情况下 Presto 在 8080 端口上运行。由于协议是基于 HTTP 的,您可以验证它是否适用于 curlwget 或 Web 浏览器
  • 已解决。防火墙阻止连接。只需要设置端口转发

标签: jdbc amazon-ec2 amazon-emr presto


【解决方案1】:

这可能是因为防火墙,它可能不允许您连接到服务器。您必须在 Master 组中创建入站规则。

  1. 为此,首先选择您的集群。
  2. 在“安全和访问”标题下,单击“Master 安全组”链接。
  3. 现在选择名为“ElasticMapReduce-master”的安全组,然后单击“编辑入站规则”。
  4. 在底部,单击“添加规则”,然后在类型中选择“所有 TCP”并在源字段中选择“我的 ip”或添加您要访问的 ip 地址。
  5. 点击保存规则。

再试一次。它会工作的!

【讨论】:

    猜你喜欢
    • 2018-02-08
    • 2017-06-15
    • 2020-05-10
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2019-10-25
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多