本文为您介绍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角色
    说明 本实践创建的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;
    set odps.sql.jobconf.odps2=true;
    set odps.sql.jobconf.odps2.enforce=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. 在目标业务流程下,右键选择MaxCompute > 数据开发 > 新建 > 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链接地址,进行作业的查看与诊断。