本文描述问题及解决方法同样适用于 腾讯云Snova云数仓。
一、SCF介绍
腾讯云无服务器云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境。
其中触发SCF函数运行的触发器机制,提供了多种触发方式,分别是:API网关触发,COS触发器,定时触发器等。
这里我们需要重点学习和了解的是COS触发器和定时触发器。
1.1 COS触发器
用户配置了COS事件源后,用户在对应的COS的bucket或目录下上传或删除了文件操作,都会触发scf的函数运行。这里我们可以用于从COS中导入数据到Snova中的应用场景。
1.2 定时触发器
用户可以配置定时触发器,比如每分钟,每一天的某个时刻等,类似于crontab的定时任务管理方式,对SCF函数进行触发执行。该触发器可以用于对数仓的每天定时计算任务的调度触发
以上两种触发器应用场景和操作步骤后文会详细介绍。
二、SCF与数仓集群的网络互通
目前以上两款云产品网络互通基于两个事实:1,SCF函数运行的代码可以访问外网IP地址。2,Snova提供外网IP访问的能力。下图为网络连通示意图:
SCF函数运行的时候通过公网IP访问Snova。
接下来分步骤讲解如何使用SCF的触发器来导入COS数据到Snova集群,或者对计算任务的定时调度。
三、前期准备工作
3.1 Snova集群创建外网IP
在Snova集群控制台,基础配置页面,点击“申请外网地址”,等待运行成功后,会看到访问该集群的外网IP地址。
3.2 添加Snova访问地址白名单
在Snova控制台,集群详情页,配置页,新建白名单如下所示。
为什么要建这个访问白名单?
为了系统安全,Snova默认情况是拒绝不在白名单的地址或者用户访问数据库。
而且SCF基于无服务器的运行环境,因此每次运行可能不在一个IP,也可能不在一个网段,我们不能对访问Snova的客户端IP地址作任何假设。因此我们需要对所有IP放开访问权限。
即配置IP白名单CIDR地址为xx.xx.xx.xx/0。(一定要注意,网络段为0,表示所有IP)。
但是这样带了一定的安全风险,因此为了降低安全风险,可以单独建一个账号用于定时任务调度功能,比如图中的scf_visit用户。这里不建议用户名称和数据库名称填写为all(all代表所有用户或者所有数据库),依据权限最小化原则,只对需要访问的数据库和用户访问访问白名单地址。
3.3 用户授权
在3.2章节中,建议单独创建一个用户用于SCF的任务调度和计算。因此需要授权该用户访问对应数据库和表的权限。
创建用户
CREATE USER scf_visit WITH LOGIN PASSWORD ‘scf_passwd’;
并设置用户访问密码。
数据库表授权
GRANT ALL on t1 to scf_visit;
四、定时调度任务
在scf控制台创建函数。这里选择基于Python2.7语言实现函数。实现功能,读取数据仓库中,postgres库中的t1表中的数据。
其中user和password分别为3.3创建的用户和密码。Host和port为3.1章节中的Snova外网访问地址。
实现代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import psycopg2
def main_handler(event, context):
#process param
print “maxluo_xxxx”
conn = psycopg2.connect(database=”postgres”, user=” scf_visit”, password=” scf_passwd”, host=”xx.xx.xx.xx”, port=”xxxx”)
print “Opened database successfully”
cur = conn.cursor()
cur.execute(“SELECT * from t1”)
rows = cur.fetchall()
for row in rows:
print “a1 = “, row[0], “\n”
print “Operation done successfully”;
conn.close()
创建成功后,点击测试,验证是否函数是否访问成功。如下图。
4.1触发器配置
配置方式相对比较灵活,基本上和Crontab一致。
五、COS外表数据导入任务
5.1 创建外表
CREATE READABLE EXTERNAL TABLE cos_tbl (a1 int)
LOCATION(‘cos://maxluo-1258469122.cos.guangzhou.myqcloud.com/snova/ secretKey=xxx secretId=xxx’) FORMAT ‘csv’;
注意,bucket为 maxluo,snova为目录。
5.2 创建COS触发器
注意:1,选择需要有触发器的Bucket,
2,5.1外表对应的目录snova/。
3,以及后缀为文件后缀,此处为.log。
5.3 创建函数
该函数的功能: 从COS外表中读取数据,写入内表t1中。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import psycopg2
def main_handler(event, context):
#process param
print “maxluo_xxxx”
conn = psycopg2.connect(database=”postgres”, user=” scf_visit”, password=” scf_passwd”
, host=”xx.xx.xx.xx”, port=”xxx”)
print “Opened database successfully”
cur = conn.cursor()
cur.execute(“insert into t1 SELECT * from cos_tbl”)
rows = cur.fetchall()
conn.close()
通过以上步骤,可以实现在上传文件到COS后,自动触发回调函数进行数据COS导入数据仓库中。