使用 streamsets 处理导数据,可以做到在页面拖拉拽创建一个pipeline,就能打通数据通道
在需要接入的业务系统很多的情况下,我们就会创建很多的pipeline,用来导数据
在大量使用全量导入,做T+1数据的情况下,如何管理 streamsets 各个导数据的pipeline的执行会是个比较重要的问题
在此尝试了两种方式来管理 streamsets pipeline 的批量执行
方式一: 使用python直接调streamsets API 的方式
思路简介
- 将需要按时调用的pipeline用文本记录下来或记录到数据库,作为配置文件供python解析和使用
- 使用python模拟streamsets登录,登陆后,调用对应api查看pipeline运行状态并判断是否需要启动
- 调用api启动目标流程,目标流程可以设置回调,调用python服务接口
- python服务根据回调的结果设置定时运行的状态
操作方式
以下代码只验证了可行性,使用的streamsets版本为3.17
import json
import requests
def run():
# 1.模拟登录并获取对应的cookie
login_url = 'http://192.168.23.45:18630/j_security_check'
login_param = {
'j_username': 'admin',
'j_password': 'admin',
'basePath': '/',
}
login_resp = requests.post(login_url, params=login_param)
redirect_cookie = login_resp.cookies
jsessionid = ''
for k, v in redirect_cookie.items():
if 'JSESSIONID' in k:
jsessionid = v
break
# 2. 使用该cookie调用streamsets的api
pipelines_url = 'http://192.168.23.45:18630/rest/v1/pipelines?orderBy=LAST_MODIFIED&order=ASC&label=system:allPipelines&offset=0&len=50&includeStatus=true'
header = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.9',
'Connection': 'keep-alive',
'Cookie': f'JSESSIONID_18630={jsessionid}; NG_TRANSLATE_LANG_KEY=en',
'Host': '192.168.23.45:18630',
'Referer': 'http://192.168.23.45:18630/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
'X-Requested-By': 'Data Collector'
}
content_resp = requests.get(pipelines_url, headers=header)
print(content_resp.status_code)
print(content_resp.content.decode('utf8'))
if __name__ == '__main__':
run()
方式二: 使用streamsets提供的CronScheduler源来辅助管理
思路简介
- 在页面使用 CronScheduler 创建 pipeline
- 在这个 pipeline 中使用 start pipelines 的 processor 来启动需要管理的pipeline
- 对于需要启动的导数 pipeline ,注意设置为完成后恢复到原始状态就可以重复调用了
操作方式
- 定时pipeline的大致流程见下图
- 在 cron scheduler 组件中设置好定时调用的时间,这个格式和linux的crontab表达式差不多,当然也可以在页面上直接选
- 在 starts pipelines 组件中设置好对应的 pipeline参数
- 启动后让pipeline一直执行,就会开始定时调用
- 注意导数 pipeline 需要的事件处理器中,需要设置恢复初始设置,这样才可以重复调用。在开始定时管理前,需要先将pipeline验证好
两种方式的比较
操作方式 | API | CronScheduler |
---|---|---|
工作量 | 前期较多,会有服务代码开发,后续少 | 少 |
管理范围 | 较大,可以管理多个独立的 streamsets 服务 | 比较局限,如果有多个 streamsets 服务,每个服务都要去对应的 streamsets 界面创建对应的 cron scheduler pipeline |
管理有序性 | 较好,做成python的web服务并提供界面后,可以一次性看到每个pipeline的执行时间和执行状态 | 较差,一个cron只能提供一个时间的启动管理,导数据的流程不能同时启动的话(一般都不能),需要配置多个cron的pipeline,且需要自己比较清楚哪些pipeline在哪个流程里面,pipeline越多,维护成本越高 |
上下游灵活性 | 强,像导入hive这种,如果不加partition又是全量覆盖的话,python可以通过操作hive管理整个过程 | 弱,只能管streamsets,对其它上下游组件没有直接操作方式 |
以上是两种管理pipelines方式的探索,有更好的(免费版)的方式的欢迎分享