本文介绍MaxCompute如何访问Hologres。
背景信息
Hologres是阿里云实时交互式分析产品。Hologres具备高并发地实时写入和查询数据的能力,同时支持数据无需迁移就能高性能加速分析MaxCompute数据,通过联邦分析Hologres实时数据与MaxCompute离线数据,实现离线实时一体化的数据仓库产品解决方案。可以使用MaxCompute和Hologres的组合方案,来满足大规模离线分析、实时运营分析、交互式查询等多业务场景。
-
MaxCompute SQL外部表的方式访问Hologres,详情请参见MaxCompute SQL外部表方式访问Hologres。
-
MaxCompute Spark方式访问Hologres,如下所示。
前提条件
-
已准备MaxCompute相应的环境。
-
已开通MaxCompute服务并创建Hologres外部表的目标MaxCompute项目。
开通MaxCompute服务以及创建MaxCompute项目的操作指导,请参见开通MaxCompute和创建MaxCompute项目。
-
已安装MaxCompute客户端。
安装MaxCompute客户端的操作指导,请参见安装并配置MaxCompute客户端。
-
已搭建MaxCompute Spark开发环境。
本实践的MaxCompute Spark开发环境搭建在Linux操作系统下,使用的是Spark2.4.5发布包。具体的操作指导,请参见搭建MaxCompute Spark开发环境。
-
-
已开通DataWorks服务。
开通DataWorks服务的操作指导,请参见开通DataWorks服务。
-
已开通Hologres服务并连接HoloWeb。
开通Hologres并连接HoloWeb的操作指导,请参见开通Hologres和连接HoloWeb并执行查询。
-
已下载PostgreSQL的JDBC驱动包。
本实践使用的是
postgresql-42.2.16.jar驱动包,并且将该JAR包存放在Linux的/home/postgreSQL路径下。
MaxCompute SQL外部表方式访问Hologres
-
在Hologres管理控制台,选择目标实例并创建Hologres数据库
mc_db_holo。创建Hologres数据库的操作指导,请参见创建Hologres数据库。 -
在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') ; -
在RAM访问控制台创建RAM角色
AliyunOdpsHoloRole并修改信任策略配置内容。创建RAM角色并修改信任策略配置内容的操作指导,请参见创建RAM角色。
说明本实践创建的RAM角色可信实体类型为阿里云账号。
-
添加
AliyunOdpsHoloRoleRAM角色至Hologres实例并授权。添加RAM角色至Hologres实例并授权的操作指导,请参见添加RAM角色至Hologres实例并授权。
-
在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外部表。
-
创建完成后,在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 | +----+----------+ -
在MaxCompute客户端执行如下语句,写数据至Hologres外部表。
set odps.sql.split.hive.bridge=true; set odps.sql.hive.compatible=true; insert into mc_externaltable_holo values (4,'alice'); -
在HoloWeb开发界面,查询Hologres表
mc_sql_holo中数据。select * from mc_sql_holo;
MaxCompute Spark访问Hologres:Local提交模式
-
在HoloWeb开发界面的
mc_db_holo数据库下,执行如下语句创建Hologres表mc_jdbc_holo。创建Hologres表的操作指导,请参见创建Hologres表。
CREATE TABLE mc_jdbc_holo( id INTEGER, name TEXT ); -
在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='LTAI****************', password='********************', 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。
-
-
在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表一致,即访问成功。
MaxCompute Spark访问Hologres:Cluster提交模式
-
在HoloWeb开发界面的
mc_db_holo数据库下,执行如下语句创建Hologres表mc_jdbc_holo。创建Hologres表的操作指导,请参见创建Hologres表。
CREATE TABLE mc_jdbc_holo( id INTEGER, name TEXT ); -
在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='LTAI****************', password='********************', 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。
-
-
配置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。
-
Endpoint:MaxCompute项目所属地域的公网Endpoint。
各地域的公网Endpoint信息,请参见公网 Endpoint。
-
VPC_Endpoint:MaxCompute项目所属地域的VPC网络的Endpoint。
各地域的VPC网络Endpoint信息,请参见VPC Endpoint。
-
Hologres_Classic_Network:Hologres经典网络类型。配置此项主要是为了在MaxCompute安全运行沙箱环境中,开启到对应Hologres实例的网络策略,否则MaxCompute集群无法访问外部服务。
-
-
在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链接地址。
22/04/07 10:10:11 INFO Client: Submitting application application_1xxx_1600131562 to ResourceManager 22/04/07 10:10:11 INFO YarnClientImpl: post: local resource scheme: tempresource, path: /2a7de2c1e7f051b656591322941157a.jar 22/04/07 10:10:11 INFO YarnClientImpl: post: local resource scheme: tempresource, path: /6e483606b633aaf08f4a7e6bfbe98116.zip 22/04/07 10:10:11 INFO YarnClientImpl: post: local resource scheme: tempresource, path: /22489af297da5c56d2ce533c9dc0d259.py 22/04/07 10:10:11 INFO YarnClientImpl: post: local resource scheme: tempresource, path: /b2d6ef4c6f6dc428b9c5bd38aacfb7f1.zip 22/04/07 10:10:11 INFO YarnClientImpl: post: local resource scheme: tempresource, path: /b6fc4b0a15046d1168b70e10b09ca334.zip 22/04/07 10:10:11 INFO YarnClientImpl: post: local resource scheme: tempresource, path: /b5348e4c57f3d598043621739a41ed82.zip 22/04/07 10:10:11 INFO SubmitJobUtil: submitting CupidTask with ALIYUN type, operator: startam 22/04/07 10:10:11 INFO YarnClientImpl: transformAppCtxAndStartAM instance id 20220407021011976ggjr01ms2 22/04/07 10:10:12 INFO YarnClientImplUtil: logview url: http://logview.odps.aliyun.com/logview/?h=http://service.cxxx.aliyun.com/api&p=xxx&i=2022xxx 011976ggjr01ms2&token=dTFGWXZBSkEvNW84UVdVdUhVZm5V0YzcEVVPSxPRFBTX09CTzpwNF8yODAzMTY1MzI0NjY2ODI1MTIsMTY0OTU1NjYxMix7IlN0YXRlbWVudCI6W3siQWN0aW9uIjpbIm9kcHM6UijpbIm9kcHM6UmVhZCJdLCJFZmZlY3QiOiJBbGxvdyIsIlJlc291cmNlIjpbImFjczoiOiJhY3M6b2RwczoqOioiXX1dLCJWZXJzaW9uIjoiMSJ9 iJBbGxvdyIsIlJlc291cmNlIjpbImFjczoiOiJhY3M6b2RwczoqOioiXX1dLCJWZXJzaW9uIjoiMSJ9xxx 22/04/07 10:10:12 INFO CupidUtil: CupidTask status changed: Ready, expecting next status: Waiting/Running/Success -
Spark-UI的Jobview链接地址。
client token: N/A diagnostics: N/A ApplicationMaster host: 33.xxx.xxx.2 ApplicationMaster RPC port: 8xxx queue: queue start time: 1649297412218 final status: SUCCEEDED tracking URL: http://jobview.odps.aliyun.com/proxyview/jobview/?h=http://service.cn-hangzhou.maxcompute.aliyun.com/api&p=xxx&i=2022xxx1976ggjr01ms2&t=spark&id=application_1649xxxxxxxxx9_16001315628&metaname=2022xxxx-xxxxx1976ggjr01ms2&token=cXNmL3dvZFFlемY0aTF4MVpDTCe9WczY5K2k4PSxPRFBTX09CTzpwNF8yODAzMTY1MzI0NjY2ODI1MTlsMTY0OTU1NjY4OCx7IlN0YXRlbWVudCI6W3siQWN0aW9uIjpbIM9kcHM6KiJdLCJFZmZlY3QiOiJBbGxvdyIsIlJlc291cmNlIjpbImFjczpvZHBzOio6KjoqIl19XSwiVmVyc2lvbiI6IjEifQ== user: user
-
-
打开Logview链接,如果作业执行状态为success,选择,查看
jdbcDF.printSchema()的返回结果。查看Stdout,打印的Schema信息与Hologres中创建的
mc_jdbc_holo表一致,即访问成功。root |-- id: integer (nullable = true) |-- name: string (nullable = true)说明您也可以打开Spark-UI的Jobview链接地址,进行作业的查看与诊断。
MaxCompute Spark访问Hologres:DataWorks提交模式
-
在HoloWeb开发界面的
mc_db_holo数据库下,执行如下语句创建Hologres表mc_jdbc_holo。创建Hologres表的操作指导,请参见创建Hologres表。
CREATE TABLE mc_jdbc_holo( id INTEGER, name TEXT ); -
配置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。
-
Endpoint:MaxCompute项目所属地域的公网Endpoint。
各地域的公网Endpoint信息,请参见公网 Endpoint。
-
VPC_Endpoint:MaxCompute项目所属地域的VPC网络的Endpoint。
各地域的VPC网络Endpoint信息,请参见VPC Endpoint。
-
Hologres_Classic_Network:Hologres经典网络类型。配置此项主要是为了在MaxCompute安全运行沙箱环境中,开启到对应Hologres实例的网络策略,否则MaxCompute集群无法访问外部服务。
-
-
登录DataWorks控制台。
-
在左侧导航栏,单击工作空间列表。
-
在工作空间列表页面,单击相应工作空间后操作列的快速进入 > 数据开发。
-
新建PostgreSQL JDBC资源以及ODPS Spark节点。
-
在目标业务流程下,右键选择,在弹出的新建资源对话框,上传PostgreSQL JDBC的JAR包文件后,单击新建。
说明-
DataWorks业务流程创建,详情请参见创建业务流程。
-
DataWorks上的MaxCompute资源创建,详情请参见创建并使用MaxCompute资源。
-
-
在目标业务流程下,右键选择,在新建资源对话框,填写资源名称后,单击新建。
本实践将资源名称命名为
read_holo.py。 -
按照如下脚本内容,编写
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='LTAI****************', password='********************', 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。
-
-
在目标业务流程下,右键选择,在新建节点对话框,填写节点名称后,单击确认。
-
配置
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集群无法访问外部服务。
-
-
-
在目标业务流程画板,右键选择。
作业运行后,将会打印作业日志,其中包含MaxCompute作业的诊断信息、Logview链接地址、Spark-UI的Jobview链接地址等。
-
打开Logview链接,如果作业执行状态为success,选择,查看
jdbcDF.printSchema()的返回结果。查看Stdout,打印的Schema信息与Hologres中创建的
mc_jdbc_holo表一致,即访问成功。root |-- id: integer (nullable = true) |-- name: string (nullable = true)说明您也可以打开Spark-UI的Jobview链接地址,进行作业的查看与诊断。