前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于云上scf的定时任务设计方法

基于云上scf的定时任务设计方法

原创
作者头像
洛杉矶
修改2020-10-22 09:11:57
9.9K1
修改2020-10-22 09:11:57
举报

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、SCF介绍
    • 1.1 COS触发器
      • 1.2 定时触发器
      • 二、SCF与数仓集群的网络互通
      • 三、前期准备工作
        • 3.1 Snova集群创建外网IP
          • 3.2 添加Snova访问地址白名单
            • 3.3 用户授权
              • 创建用户
              • 数据库表授权
          • 四、定时调度任务
            • 4.1触发器配置
            • 五、COS外表数据导入任务
              • 5.1 创建外表
                • 5.2 创建COS触发器
                  • 5.3 创建函数
                  相关产品与服务
                  对象存储
                  对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档