通过Gateway访问Presto

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 本文介绍使用HAProxy反向代理实现通过Gateway节点访问Presto服务的方法。该方法也很容扩展到其他组件,如Impala等。

Gateway是与EMR集群处于同一个内网中的ECS服务器,可以使用Gateway实现负载均衡和安全隔离。用户可以通过:控制台页面>配置管理>概览>创建Gateway来创建对应集群的Gateway节点。

NOTE: Gateway节点默认已经安装了HAProxy服务,但没有启动。

普通集群

普通集群配置Gateway代理比较简单,只需要配置HAProxy反向代理,对EMR集群上Header节点的Presto Coodrinator的9090端口实现反向代理即可。配置步骤如下:

配置HAProxy

通过ssh登入Gateway节点,修改HAProxy的配置文件/etc/haproxy/haproxy.cfg。添加如下内容:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global

......

## 配置代理,将Gateway的9090端口映射到
## emr-header-1.cluster-xxxx的9090端口
listen prestojdbc :9090
    mode tcp
    option tcplog
    balance source
    server presto-coodinator-1 emr-header-1.cluster-xxxx:9090

保存退出,使用如下命令重启HAProxy服务:

 $> service haproxy restart

配置安全组

需要配置的规则如下:

方向 配置规则 说明
公网入 自定义TCP,开放9090端口 该端口用于HAProxy代理Header节点Coodinator端口

现在就可以通过ECS控制台删除Header节点的公网IP,在自己的客户机上通过Gateway访问Presto服务了。

高安全集群

EMR高安全集群中的Presto服务使用Kerberos服务进行认证,其中Kerberos KDC服务位于emr-header-1上,端口为88,同时支持TCP/UDP协议。 使用Gateway访问高安全集群中的Presto服务,需要同时对Presto Coodinator服务端口和Kerberos KDC实现代理。
另外,EMR Presto Coodinator集群默认使用keystore配置的CN为emr-header-1,只能内网使用,因此需要重新生成CN=emr-header-1.cluster-xxx的keystore。

HTTPs认证相关

创建服务端CN=emr-header-1.cluster-xxx的keystore:

[root@emr-header-1 presto-conf]# keytool -genkey -dname "CN=emr-header-1.cluster-xxx,OU=Alibaba,O=Alibaba,L=HZ, ST=zhejiang, C=CN" -alias server -keyalg RSA -keystore keystore -keypass 81ba14ce6084 -storepass 81ba14ce6084 -validity 36500

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore keystore -destkeystore keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

导出证书:

[root@emr-header-1 presto-conf]# keytool -export -alias server -file server.cer -keystore keystore -storepass 81ba14ce6084
存储在文件 <server.cer> 中的证书

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore keystore -destkeystore keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

制作客户端keystore:

[root@emr-header-1 presto-conf]# keytool -genkey -dname "CN=myhost,OU=Alibaba,O=Alibaba,L=HZ, ST=zhejiang, C=CN" -alias client -keyalg RSA -keystore client.keystore -keypass 123456 -storepass 123456 -validity 36500

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore client.keystore -destkeystore client.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

将证书导入到客户端keystore中:

[root@emr-header-1 presto-conf]# keytool -import -alias server -keystore client.keystore -file server.cer -storepass 123456
所有者: CN=emr-header-2.cluster-xxx, OU=Alibaba, O=Alibaba, L=HZ, ST=zhejiang, C=CN
发布者: CN=emr-header-2.cluster-xxx, OU=Alibaba, O=Alibaba, L=HZ, ST=zhejiang, C=CN
序列号: 4247108
有效期为 Thu Mar 01 09:11:31 CST 2018 至 Sat Feb 05 09:11:31 CST 2118
证书指纹:
     MD5:  75:2A:AA:40:01:5B:3F:86:8F:9A:DB:B1:85:BD:44:8A
     SHA1: C7:25:B9:AD:5F:FE:FC:05:8E:A0:24:4A:1C:AA:6A:8D:6C:39:28:16
     SHA256: DB:86:69:65:73:D5:C6:E2:98:7C:4A:3B:31:EF:70:80:F0:3C:3B:0C:14:94:37:9F:9C:22:47:EA:7E:1E:DE:8C
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 45 1D A9 C7 D5 4E BB CF   BD CE B4 5E E2 16 FB 2F  E....N.....^.../
0010: E9 5D 4A B6                                        .]J.
]
]

是否信任此证书? [否]:  是
证书已添加到密钥库中

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore client.keystore -destkeystore client.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

将生成的文件拷贝到客户端:

$> scp root@xxx.xxx.xxx.xxx:/etc/ecm/presto-conf/client.keystore ./

Kerberos认证相关

添加客户端用户principal:

[root@emr-header-1 presto-conf]# sh /usr/lib/has-current/bin/hadmin-local.sh /etc/ecm/has-conf -k /etc/ecm/has-conf/admin.keytab
[INFO] conf_dir=/etc/ecm/has-conf
Debug is  true storeKey true useTicketCache false useKeyTab true doNotPrompt true ticketCache is null isInitiator true KeyTab is /etc/ecm/has-conf/admin.keytab refreshKrb5Config is true principal is kadmin/EMR.xxx.COM@EMR.xxx.COM tryFirstPass is false useFirstPass is false storePass is false clearPass is false
Refreshing Kerberos configuration
principal is kadmin/EMR.xxx.COM@EMR.xxx.COM
Will use keytab
Commit Succeeded

Login successful for user: kadmin/EMR.xxx.COM@EMR.xxx.COM
enter "cmd" to see legal commands.
HadminLocalTool.local: addprinc -pw 123456 clientuser
Success to add principal :clientuser
HadminLocalTool.local: ktadd -k /root/clientuser.keytab clientuser
Principal export to keytab file : /root/clientuser.keytab successful .
HadminLocalTool.local: exit

将生成的文件拷贝到客户端:

$> scp root@xxx.xxx.xxx.xxx:/root/clientuser.keytab ./
$> scp root@xxx.xxx.xxx.xxx:/etc/krb5.conf ./

修改拷贝到客户端的krb5.conf文件,修改如下两处:

[libdefaults]
    kdc_realm = EMR.xxx.COM
    default_realm = EMR.xxx.COM
    # 改成1,使客户端使用TCP协议与KDC通信(因为HAProxy不支持UDP协议)
    udp_preference_limit = 1 
    kdc_tcp_port = 88
    kdc_udp_port = 88
    dns_lookup_kdc = false

[realms]
    EMR.xxx.COM = {
        # 设置为Gateway的外网IP
        kdc = xxx.xxx.xxx.xxx:88
    }

修改客户端主机的hosts文件,添加如下内容:

#  gateway ip
xxx.xxx.xxx.xxx emr-header-1.cluster-xxx

配置Gateway HAProxy

通过SSH登入到Gateway节点,修改/etc/haproxy/haproxy.cfg。添加如下内容:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global

......
listen prestojdbc :7778
    mode tcp
    option tcplog
    balance source
    server presto-coodinator-1 emr-header-1.cluster-xxx:7778

listen kdc :88
    mode tcp
    option tcplog
    balance source
    server emr-kdc emr-header-1:88

保存退出,使用如下命令重启HAProxy服务:

 $> service haproxy restart

配置安全组规则

需要配置的规则如下:

方向 配置规则 说明
公网入 自定义UDP,开放88端口 该端口用户HAProxy代理Header节点上的KDC
公网入 自定义TCP,开放88端口 该端口用户HAProxy代理Header节点上的KDC
公网入 自定义TCP,开放7778端口 该端口用于HAProxy代理Header节点Coodinator端口

现在就可以通过ECS控制台删除Header节点的公网IP,在自己的客户机上通过Gateway访问Presto服务了。

使用JDBC访问Presto示例

废话不说,直接上代码:

try {
   
    Class.forName("com.facebook.presto.jdbc.PrestoDriver");
} catch(ClassNotFoundException e) {
   
    LOG.error("Failed to load presto jdbc driver.", e);
    System.exit(-1);
}

Connection connection = null;
Statement statement = null;
try {
   
    String url = "jdbc:presto://emr-header-1.cluster-59824:7778/hive/default";
    Properties properties = new Properties();
    properties.setProperty("user", "hadoop");
    // https相关配置
    properties.setProperty("SSL", "true");
    properties.setProperty("SSLTrustStorePath", "resources/59824/client.keystore");
    properties.setProperty("SSLTrustStorePassword", "123456");
    // Kerberos相关配置
    properties.setProperty("KerberosRemoteServiceName", "presto");
    properties.setProperty("KerberosPrincipal", "clientuser@EMR.59824.COM");
    properties.setProperty("KerberosConfigPath", "resources/59824/krb5.conf");
    properties.setProperty("KerberosKeytabPath", "resources/59824/clientuser.keytab");
    // 创建连接对象
    connection = DriverManager.getConnection(url, properties);
    // 创建Statement对象
    statement = connection.createStatement();
    // 执行查询
    ResultSet rs = statement.executeQuery("select * from table1");
    // 获取结果
    int columnNum = rs.getMetaData().getColumnCount();
    int rowIndex = 0;
    while (rs.next()) {
   
        rowIndex++;
        for(int i = 1; i <= columnNum; i++) {
   
            System.out.println("Row " + rowIndex + ", Column " + i + ": " + rs.getString(i));
        }
    }
} catch(SQLException e) {
   
    LOG.error("Exception thrown.", e);
} finally {
   
    // 销毁Statement对象
    if (statement != null) {
   
        try {
   
            statement.close();
            } catch(Throwable t) {
   
              // No-ops
            }
    }
   // 关闭连接
   if (connection != null) {
   
          try {
   
           connection.close();
       } catch(Throwable t) {
   
         // No-ops
       }
    }
}

小结

本文介绍使用HAProxy反向代理实现通过Gateway节点访问Presto服务的方法。该方法也很容扩展到其他组件,如Impala等。

相关实践学习
基于EMR Serverless StarRocks一键玩转世界杯
基于StarRocks构建极速统一OLAP平台
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
目录
相关文章
|
1月前
|
监控 负载均衡 API
Apache Apisix轻松打造亿级流量Api网关
Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上行、灰度发布、熔断、鉴权、可观测等丰富的流量管理功能。适用于处理传统南北向流量、服务间东西向流量及 k8s 入口控制。Airflow 是一个可编程、调度和监控的工作流平台,基于有向无环图 (DAG) 定义和执行任务,提供丰富的命令行工具和 Web 管理界面,方便系统运维和管理。
Apache Apisix轻松打造亿级流量Api网关
|
4月前
|
缓存
EMR Remote Shuffle Service实践问题之Mapper的首次PushData请求如何解决
EMR Remote Shuffle Service实践问题之Mapper的首次PushData请求如何解决
|
6月前
|
资源调度 分布式计算 Hadoop
实时计算 Flink版产品使用问题之yarn session模式中启动的任务链接是http IP,想把IP映射为主机hadoop,该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之如何配置server-id
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
DataWorks 大数据 API
DataWorks常见问题之弹内API 服务不可用Server unreachable如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
安全
将云数据仓库ADB的Solr集群的host更改为公网地址
将云数据仓库ADB的Solr集群的host更改为公网地址
85 3
|
API Apache 数据安全/隐私保护
Apache ZooKeeper - 使用原生的API操作ZK_ACL权限
Apache ZooKeeper - 使用原生的API操作ZK_ACL权限
113 0
|
设计模式 缓存 Dubbo
Apache ShenYu 网关正式支持 Dubbo3 服务代理
本文介绍了如何通过 Apache ShenYu 网关访问 Dubbo 服务,主要内容包括从简单示例到核心调用流程分析,并对设计原理进行了总结。
967 9
Apache ShenYu 网关正式支持 Dubbo3 服务代理
|
分布式数据库 Hbase 分布式计算
hbase_异常_02_hbase无法访问16010端口
一、异常现象 上一个异常解决了之后,已经能正常启动hbase了,也能正常使用hbase shell  ,但是无法通过浏览器访问 16010端口。   二、异常原因 1.原因一 hbase 1.0 以后的版本,默认端口是 16010 ,需要自己手动配置管理web端口 2.原因二 hadoop和hbase版本不对。
4392 0
|
Java 分布式数据库 调度
HBase rpc框架介绍
HBase的rpc框架有比较好的分层,便于在不同层次上进行实现优化和功能扩展。
1362 0
HBase rpc框架介绍