MaxCompute如何访问Hologres

本文为您介绍MaxCompute如何访问Hologres。

背景信息

Hologres是阿里云实时交互式分析产品。Hologres具备高并发地实时写入和查询数据的能力,同时支持数据无需迁移就能高性能加速分析MaxCompute数据,通过联邦分析Hologres实时数据与MaxCompute离线数据,实现离线实时一体化的数据仓库产品解决方案。您可以使用MaxCompute和Hologres的组合方案,来满足大规模离线分析、实时运营分析、交互式查询等多业务场景。

前提条件

  • 已准备MaxCompute相应的环境。

  • 已开通DataWorks服务。

    开通DataWorks服务的操作指导,请参见开通DataWorks服务

  • 已开通Hologres服务并连接HoloWeb。

    开通Hologres并连接HoloWeb的操作指导,请参见开通Hologres连接HoloWeb并执行查询

  • 已下载PostgreSQL的JDBC驱动包。

    本实践使用的是postgresql-42.2.16.jar驱动包,并且将该JAR包存放在Linux的/home/postgreSQL路径下。您可以通过PostgreSQL驱动官网下载。

MaxCompute SQL外部表方式访问Hologres

  1. Hologres管理控制台,选择目标实例并创建Hologres数据库mc_db_holo

    创建Hologres数据库的操作指导,请参见创建Hologres数据库创建Hologres数据库

  2. HoloWeb开发界面的mc_db_holo数据库下,执行如下语句创建Hologres表mc_sql_holo并插入数据。

    创建Hologres表的操作指导,请参见创建Hologres表创建表并插入数据

    CREATE TABLE mc_sql_holo(
            id INTEGER,
            name TEXT
    );
    
    INSERT INTO mc_sql_holo VALUES
            (1,'zhangsan'),
            (2,'lisi'),
            (3,'wangwu')
    ;
  3. RAM访问控制台创建RAM角色AliyunOdpsHoloRole并修改信任策略配置内容。

    创建RAM角色并修改信任策略配置内容的操作指导,请参见创建RAM角色

    说明

    本实践创建的RAM角色可信实体类型为阿里云账号

  4. 添加AliyunOdpsHoloRoleRAM角色至Hologres实例并授权。

    添加RAM角色至Hologres实例并授权的操作指导,请参见添加RAM角色至Hologres实例并授权

  5. 在MaxCompute客户端,按照如下语句创建Hologres外部表mc_externaltable_holo

    create external table if not exists mc_externaltable_holo
    (
        id int ,
        name string
    )
    stored by 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    with serdeproperties (
      'odps.properties.rolearn'='acs:ram::13969******5947:role/aliyunodpsholorole')
    LOCATION 'jdbc:postgresql://hgprecn-cn-2r42******-cn-hangzhou-internal.hologres.aliyuncs.com:80/mc_db_holo?currentSchema=public&useSSL=false&table=mc_sql_holo/'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
      'odps.federation.jdbc.colmapping'='id:id,name:name'
    );
    说明

    创建外部表参数说明,请参见Hologres外部表

  6. 创建完成后,在MaxCompute客户端执行如下语句,获取Hologres外部表的数据。

    set odps.sql.split.hive.bridge=true;
    set odps.sql.hive.compatible=true;
    select * from mc_externaltable_holo limit 10;
    说明

    SET操作的属性说明,详情请参见SET操作

    结果如下所示:

    +----+----------+
    | id | name     |
    +----+----------+
    | 1  | zhangsan |
    | 2  | lisi     |
    | 3  | wangwu   |
    +----+----------+
  7. 在MaxCompute客户端执行如下语句,写数据至Hologres外部表。

    set odps.sql.split.hive.bridge=true;
    set odps.sql.hive.compatible=true;
    insert into mc_externaltable_holo values (4,'alice');
  8. HoloWeb开发界面,查询Hologres表mc_sql_holo中数据。

    查询Hologres表数据

    select * from mc_sql_holo;

MaxCompute Spark访问Hologres:Local提交模式

  1. HoloWeb开发界面的mc_db_holo数据库下,执行如下语句创建Hologres表mc_jdbc_holo

    创建Hologres表的操作指导,请参见创建Hologres表

    CREATE TABLE mc_jdbc_holo(
            id INTEGER,
            name TEXT
    );
  2. 在Linux操作系统的/home/pythoncode路径下,新建Python文件holo_local.py

    Python脚本内容如下所示:

    from pyspark.sql import SparkSession
    
    spark = SparkSession \
                .builder \
                .appName("Spark_local") \
                .config("spark.eventLog.enabled","false") \
                .getOrCreate()
    
    jdbcDF = spark.read.format("jdbc"). \
                options(
                url='jdbc:postgresql://hgprecn-cn-2r42******-cn-hangzhou.hologres.aliyuncs.com:80/mc_db_holo',
                dbtable='mc_jdbc_holo',
                user='LTAI5tJE8fuerxXdPPB****',
                password='Okr2kbBKueR3uRaHaBiUHw4r6****',
                driver='org.postgresql.Driver').load()
    
    jdbcDF.printSchema()

    脚本内容参数说明如下所示:

    • url:使用Spark的JDBC连接方式,驱动为postgresql

      • hgprecn-cn-2r42******-cn-hangzhou.hologres.aliyuncs.com:80:Hologres实例的公网访问域名。获取方式,请参见实例配置

      • mc_db_holo:连接的Hologres数据库名称。本实践命名为mc_db_holo

    • dbtable:Hologres源表名称。本实践命名为mc_jdbc_holo

    • user:阿里云账号或RAM用户的AccessKey ID。您可以进入AccessKey管理页面获取AccessKey ID。

    • password:AccessKey ID对应的AccessKey Secret。您可以进入AccessKey管理页面获取AccessKey Secret。

    • driver:PostgreSQL驱动,固定值为org.postgresql.Driver

  3. 在Linux系统任意目录下,使用spark-submit提交本地作业。

    spark-submit --master local --driver-class-path /home/postgreSQL/postgresql-42.2.16.jar --jars /home/postgreSQL/postgresql-42.2.16.jar /home/pythoncode/holo_local.py

    查看Spark打印日志,打印Schema信息与Hologres中创建的mc_jdbc_holo表一致,即访问成功。Local

MaxCompute Spark访问Hologres:Cluster提交模式

  1. HoloWeb开发界面的mc_db_holo数据库下,执行如下语句创建Hologres表mc_jdbc_holo

    创建Hologres表的操作指导,请参见创建Hologres表

    CREATE TABLE mc_jdbc_holo(
            id INTEGER,
            name TEXT
    );
  2. 在Linux操作系统的/home/pythoncode路径下,新建Python文件holo_yarncluster.py

    Python脚本内容如下所示:

    from pyspark.sql import SparkSession
    
    spark = SparkSession \
                .builder \
                .appName("Spark_yarn") \
                .getOrCreate()
    
    jdbcDF = spark.read.format("jdbc"). \
                options(
                url='jdbc:postgresql://hgprecn-cn-2r42******-cn-hangzhou-internal.hologres.aliyuncs.com:80/mc_db_holo',
                dbtable='mc_jdbc_holo',
                user='LTAI5tJE8fuerxXdPPB****',
                password='Okr2kbBKueR3uRaHaBiUHw4r6****',
                driver='org.postgresql.Driver').load()
    
    jdbcDF.printSchema()

    脚本内容参数说明如下所示:

    • url:使用Spark的JDBC连接方式,驱动为postgresql

      • hgprecn-cn-2r42******-cn-hangzhou-internal.hologres.aliyuncs.com:80:Hologres实例的经典网络访问域名。获取方式,请参见实例配置

      • mc_db_holo:连接的Hologres数据库名称。本实践命名为mc_db_holo

    • dbtable:Hologres源表名称。本实践命名为mc_jdbc_holo

    • user:阿里云账号或RAM用户的AccessKey ID。您可以进入AccessKey管理页面获取AccessKey ID。

    • password:AccessKey ID对应的AccessKey Secret。您可以进入AccessKey管理页面获取AccessKey Secret。

    • driver:PostgreSQL驱动,固定值为org.postgresql.Driver

  3. 配置MaxCompute Spark客户端解压目录/home/spark2.4.5/spark-2.4.5-odps0.33.2/conf下的spark-defaults.conf文件。

    #需配置以下配置项
    spark.hadoop.odps.project.name = <MaxCompute_Project_Name>
    spark.hadoop.odps.end.point = <Endpoint>
    spark.hadoop.odps.runtime.end.point = <VPC_Endpoint>
    spark.hadoop.odps.access.id = <AccessKey_ID>
    spark.hadoop.odps.access.key = <AccessKey_Secret>
    
    spark.hadoop.odps.cupid.trusted.services.access.list = <Hologres_Classic_Network>
    
    #以下内容保持不变
    spark.master = yarn-cluster
    spark.driver.cores = 2
    spark.driver.memory = 4g
    
    spark.dynamicAllocation.shuffleTracking.enabled = true
    spark.dynamicAllocation.shuffleTracking.timeout = 20s
    spark.dynamicAllocation.enabled = true
    spark.dynamicAllocation.maxExecutors = 10
    spark.dynamicAllocation.initialExecutors = 2
    spark.executor.cores = 2
    spark.executor.memory = 8g
    
    spark.eventLog.enabled = true
    spark.eventLog.overwrite = true
    spark.eventLog.dir = odps://admin_task_project/cupidhistory/sparkhistory
    
    spark.sql.catalogImplementation = hive
    spark.sql.sources.default = hive

    配置文件参数说明如下所示:

    • MaxCompute_Project_Name:待访问MaxCompute项目的名称。

      此处为MaxCompute项目名称,非工作空间名称。您可以登录MaxCompute控制台,左上角切换地域后,在左侧导航栏选择工作区 > 项目管理,查看MaxCompute项目名称。

    • AccessKey_ID:具备目标MaxCompute项目访问权限的AccessKey ID。

      您可以进入AccessKey管理页面获取AccessKey ID。

    • AccessKey_Secret:AccessKey ID对应的AccessKey Secret。

      您可以进入AccessKey管理页面获取AccessKey Secret。

    • Endpoint:MaxCompute项目所属地域的公网Endpoint。

      各地域的公网Endpoint信息,请参见各地域Endpoint对照表(公网连接方式)

    • VPC_Endpoint:MaxCompute项目所属地域的VPC网络的Endpoint。

      各地域的VPC网络Endpoint信息,请参见各地域Endpoint对照表(阿里云VPC网络连接方式)

    • Hologres_Classic_Network:Hologres经典网络类型。配置此项主要是为了在MaxCompute安全运行沙箱环境中,开启到对应Hologres实例的网络策略,否则MaxCompute集群无法访问外部服务。

  4. 在Linux系统任意目录下,使用spark-submit提交作业。

    spark-submit --master yarn-cluster --driver-class-path /home/postgreSQL/postgresql-42.2.16.jar --jars /home/postgreSQL/postgresql-42.2.16.jar /home/pythoncode/holo_yarncluster.py

    提交后可以查看Spark打印日志,作业正常完成会打印作业的Logview以及Spark-UI的Jobview链接地址,可供开发者进一步诊断作业。

    • 作业的Logview链接地址。Logview

    • Spark-UI的Jobview链接地址。Jobview

  5. 打开Logview链接,如果作业执行状态为success,选择Job Details > master-0 > StdOut,查看jdbcDF.printSchema()的返回结果。

    Logview

    查看Stdout,打印的Schema信息与Hologres中创建的mc_jdbc_holo表一致,即访问成功。StdOut

    说明

    您也可以打开Spark-UI的Jobview链接地址,进行作业的查看与诊断。

MaxCompute Spark访问Hologres:DataWorks提交模式

  1. HoloWeb开发界面的mc_db_holo数据库下,执行如下语句创建Hologres表mc_jdbc_holo

    创建Hologres表的操作指导,请参见创建Hologres表

    CREATE TABLE mc_jdbc_holo(
            id INTEGER,
            name TEXT
    );
  2. 配置MaxCompute Spark客户端解压目录/home/spark2.4.5/spark-2.4.5-odps0.33.2/conf下的spark-defaults.conf文件。

    #需配置以下配置项
    spark.hadoop.odps.project.name = <MaxCompute_Project_Name>
    spark.hadoop.odps.end.point = <Endpoint>
    spark.hadoop.odps.runtime.end.point = <VPC_Endpoint>
    spark.hadoop.odps.access.id = <AccessKey_ID>
    spark.hadoop.odps.access.key = <AccessKey_Secret>
    
    spark.hadoop.odps.cupid.trusted.services.access.list = <Hologres_Classic_Network>
    
    #以下内容保持不变
    spark.master = yarn-cluster
    spark.driver.cores = 2
    spark.driver.memory = 4g
    
    spark.dynamicAllocation.shuffleTracking.enabled = true
    spark.dynamicAllocation.shuffleTracking.timeout = 20s
    spark.dynamicAllocation.enabled = true
    spark.dynamicAllocation.maxExecutors = 10
    spark.dynamicAllocation.initialExecutors = 2
    spark.executor.cores = 2
    spark.executor.memory = 8g
    
    spark.eventLog.enabled = true
    spark.eventLog.overwrite = true
    spark.eventLog.dir = odps://admin_task_project/cupidhistory/sparkhistory
    
    spark.sql.catalogImplementation = hive
    spark.sql.sources.default = hive

    配置文件参数说明如下所示:

    • MaxCompute_Project_Name:待访问MaxCompute项目的名称。

      此处为MaxCompute项目名称,非工作空间名称。您可以登录MaxCompute控制台,左上角切换地域后,在左侧导航栏选择工作区 > 项目管理,查看MaxCompute项目名称。

    • AccessKey_ID:具备目标MaxCompute项目访问权限的AccessKey ID。

      您可以进入AccessKey管理页面获取AccessKey ID。

    • AccessKey_Secret:AccessKey ID对应的AccessKey Secret。

      您可以进入AccessKey管理页面获取AccessKey Secret。

    • Endpoint:MaxCompute项目所属地域的公网Endpoint。

      各地域的公网Endpoint信息,请参见各地域Endpoint对照表(公网连接方式)

    • VPC_Endpoint:MaxCompute项目所属地域的VPC网络的Endpoint。

      各地域的VPC网络Endpoint信息,请参见各地域Endpoint对照表(阿里云VPC网络连接方式)

    • Hologres_Classic_Network:Hologres经典网络类型。配置此项主要是为了在MaxCompute安全运行沙箱环境中,开启到对应Hologres实例的网络策略,否则MaxCompute集群无法访问外部服务。

  3. 登录DataWorks控制台

  4. 在左侧导航栏,单击工作空间列表

  5. 工作空间列表页面,单击相应工作空间后操作列的快速进入 > 数据开发

  6. 新建PostgreSQL JDBC资源以及ODPS Spark节点。

    1. 在目标业务流程下,右键选择 新建资源 > MaxCompute > File,在弹出的新建资源对话框,上传PostgreSQL JDBC的JAR包文件后,单击新建

      新建资源

      说明
    2. 在目标业务流程下,右键选择新建资源 > MaxCompute > Python,在新建资源对话框,填写资源名称后,单击新建

      本实践将资源名称命名为read_holo.py新建资源

    3. 按照如下脚本内容,编写read_holo.py,并单击保存

      from pyspark.sql import SparkSession
      
      spark = SparkSession \
                  .builder \
                  .appName("Spark") \
                  .getOrCreate()
      
      jdbcDF = spark.read.format("jdbc"). \
                  options(
                  url='jdbc:postgresql://hgprecn-cn-2r42******-cn-hangzhou-internal.hologres.aliyuncs.com:80/mc_db_holo',
                  dbtable='mc_jdbc_holo',
                  user='LTAI5tJE8fuerxXdPPB****',
                  password='Okr2kbBKueR3uRaHaBiUHw4r6****',
                  driver='org.postgresql.Driver').load()
      
      jdbcDF.printSchema()

      脚本内容参数说明如下所示:

      • url:使用Spark的JDBC连接方式,驱动为postgresql

        • hgprecn-cn-2r42******-cn-hangzhou.hologres.aliyuncs.com:80:Hologres实例的公网访问域名。获取方式,请参见实例配置

        • mc_db_holo:连接的Hologres数据库名称。本实践命名为mc_db_holo

      • dbtable:Hologres源表名称。本实践命名为mc_jdbc_holo

      • user:阿里云账号或RAM用户的AccessKey ID。您可以进入AccessKey管理页面获取AccessKey ID。

      • password:AccessKey ID对应的AccessKey Secret。您可以进入AccessKey管理页面获取AccessKey Secret。

      • driver:PostgreSQL驱动,固定值为org.postgresql.Driver

    4. 在目标业务流程下,右键选择新建节点 > ODPS Spark,在新建节点对话框,填写节点名称后,单击确认

      新建节点

    5. 按照下图指引,配置spark_read_holo

      参数配置

      • 配置项spark.hadoop.odps.cupid.trusted.services.access.list

      • 配置项取值hgprecn-cn-2r42******-cn-hangzhou-internal.hologres.aliyuncs.com:80。Hologres经典网络类型。

        说明

        配置此项主要是为了在MaxCompute安全运行沙箱环境中,开启到对应Hologres实例的网络策略,否则MaxCompute集群无法访问外部服务。

  7. 在目标业务流程画板,右键选择spark_read_holo > 运行节点

    作业运行后,将会打印作业日志,其中包含MaxCompute作业的诊断信息、Logview链接地址、Spark-UI的Jobview链接地址等。Logview链接地址

  8. 打开Logview链接,如果作业执行状态为success,选择Job Details > master-0 > StdOut,查看jdbcDF.printSchema()的返回结果。

    Logview

    查看Stdout,打印的Schema信息与Hologres中创建的mc_jdbc_holo表一致,即访问成功。StdOut

    说明

    您也可以打开Spark-UI的Jobview链接地址,进行作业的查看与诊断。