今日分享 – 基于云上scf的定时任务设计方法

本文描述问题及解决方法同样适用于 腾讯云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导入数据仓库中。

正文完