先介绍几种比较主流的。
Elastic-Job,是当当网开源的分布式调度解决方案,支持任务分片功能,可以充分利用资源。Elastic-Job有两个独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。具体实现可以参考官方教程。其整体架构图如下。
Elastic-Job的特点:
1、分布式调度 2、作业高可用 3、任务分片执行。
另外,还有其他的一些框架,可以对比使用。比如TBSchedule是阿里巴巴开源的分布式调度框架,完全由java实现,目前被应用于淘宝,阿里巴巴,支付宝,京东, 汽车 之家等。大众点评开源的xxl-job,也是应用比较广泛的分布式调度任务。
目前我使用过的有 Elastic-Job和xxl-job。两者功能都很强大,后台管理也比较完善。很容易上手。都可以满足日常的工作需要。区别就是 Elastic-Job依赖zk,但是xxl-job不依赖zk,只依赖数据库。
目前市面上应该还有一些其他的框架,但是以上是比较主流的,可以根据自己的需要来选择。切记不要重复造轮子,造轮子需要大量的时间去验证。会让你在坑里爬不出来。
1.XXL-JOB
2.Elastic-Job
Elastic-Job 是一个分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。
定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。
支持分布式调度协调、d性扩容缩容、失效转移、错过执行作业重触发、并行调度、自诊断和修复等等功能特性。
分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。
Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。选择该项目可以满足大多数it企业的需求。
Elastic-Job-Cloud使用Mesos + Docker的解决方案,额外提供资源治理、应用分发以及进程隔离等服务。
轻量级无中心化:Elastic-Job-Lite并无作业调度中心节点,而是基于部署作业框架的程序在到达相应时间点时各自触发调度。
灵活的增删改查作业,集中式管理调度作业
支持高可用:一旦执行作业的服务器崩溃,等待执行的服务器将会在下次作业启动时替补执行。开启失效转移功能效果更好,可以保证在本次作业执行时崩溃,备机立即启动替补执行。
支持分片:作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
任务监控:通过监听Elastic-Job-Lite的zookeeper注册中心的几个关键节点即可完成作业运行状态监控功能
一致性:使用zookeeper作为注册中心,为了保证作业的在分布式场景下的一致性,一旦作业与注册中心无法通信,运行中的作业会立刻停止执行,但作业的进程不会退出,这样做的目的是为了防止作业重分片时,将与注册中心失去联系的节点执行的分片分配给另外节点,导致同一分片在两个节点中同时执行。
同时支持动态扩容,将任务拆分为n个任务项后,各个服务器分别执行各自分配到的任务项。一旦有新的服务器加入集群,或现有服务器下线,elastic-job将在保留本次任务执行不变的情况下,下次任务开始前触发任务重分片
3.opencron
opencron是一个功能完善且通用的开源定时任务调度系统,拥有先进可靠的自动化任务管理调度功能,提供可 *** 作的 web 图形化管理满足多种场景下各种复杂的定时任务调度,同时集成了 linux 实时监控、webssh 等功能特性
4.quartz
支持集群和分布式,但是没有友好的管理界面,功能单一,对于管理调用的任务比较困难。
quartz使用数据库锁。在quartz的集群解决方案里有张表scheduler_locks,quartz采用了悲观锁的方式对triggers表进行行加锁,以保证任务同步的正确性。一旦某一个节点上面的线程获取了该锁,那么这个Job就会在这台机器上被执行,同时这个锁就会被这台机器占用。同时另外一台机器也会想要触发这个任务,但是锁已经被占用了,就只能等待,直到这个锁被释放。
quartz的分布式调度策略是以数据库为边界资源的一种异步策略。各个调度器都遵守一个基于数据库锁的 *** 作规则从而保证了 *** 作的唯一性。同时多个节点的异步运行保证了服务的可靠。但这种策略有自己的局限性:集群特性对于高CPU使用率的任务效果很好,但是对于大量的短任务,各个节点都会抢占数据库锁,这样就出现大量的线程等待资源。这种情况随着节点的增加会越来越严重。
缺点:quartz的分布式只是解决了高可用的问题,并没有解决任务分片的问题,还是会有单机处理的极限。
5.Saturn
Saturn
基于当当Elastic Job代码基础上自主研发的任务调度系统,是唯品会开源的分布式作业调度平台,取代传统的Linux Cron/Spring Batch Job的方式,做到统一配置,统一监控,任务高可用以及分片并发处理。主要是去中心化,高可用,可分片,动态扩容,有认证和授权功能。
主要特性
支持多种语言作业,语言无关(Java/Go/C++/PHP/Python/Ruby/shell)
支持秒级调度
支持作业分片并行执行
支持依赖作业串行执行
支持作业高可用和智能负载均衡
支持异常检测和自动失败转移
支持异地容灾
支持多个集群部署
支持跨机房区域部署
支持d性动态扩容
支持优先级和权重设置
支持docker容器,容器化友好
支持cron时间表达式
支持多个时间段暂停执行控制
支持超时告警和超时强杀控制
支持灰度发布
支持异常、超时和无法高可用作业监控告警和简易的故障排除
支持失败率最高、最活跃和负荷最重的各域各节点TOP10的作业统计
优点:源码清晰,学习入手容易。应用部署简单,提供运维控制台,集中管理作业,运维控制台功能强大,提供作业统计报表 ,告警,增删改查作业,作业统一配置。
最后一个是国内团队封装的
前端时间研究了两款分布式任务调度框架,一个是XXL-Job,现在非常主流,很多常见的一些公司都在使用,像滴滴美团这样的公司都在用,这也是一款开源产品,下载下来导入IDEA就可以使用,分调度器和执行器和管理UI,有很美观的UI界面,可以对任务做增删改查,以及支持自定义开发,有很详细的帮助文档,还提供有demo,傻瓜式的,很简单,亮点是提供了管理界面。
另一个是Quartz,这个组件单机和集群都支持,单机的话是RAMJobStore任务存储,而要支持集群的话,就要将配置改成数据库方式,Quartz提供的有十几张表,其分布式的原理是利用了数据库的行锁,Quartz很简单,也是一款轻量级的开源产品,我们公司一直用这款组件,很成熟无Bug,推荐使用!
springcloudtask,springclouddataflow,正在学习中
SQL Server 中4个系统数据库:Master、Model、Msdb、Tempdb。
1、Master数据库是SQL Server系统最重要的数据库,它记录了SQL Server系统的所有系统信息。
2、model 数据库用作在 SQL Server 实例上创建的所有数据库的模板。
3、Msdb数据库是代理服务数据库,为其报警、任务调度和记录 *** 作员的 *** 作提供存储空间。
4、Tempdb是一个临时数据库,它为所有的临时表、临时存储过程及其他临时 *** 作提供存储空间。
扩展资料:
系统数据库的功能:
在SQL Server系统中,系统运行时会用到的相关信息,如系统对象和组态设置等,都是以数据库的形式存在,而存放这些系统信息的数据库称为系统数据库。
成功安装SQL Server后,系统会自动建立master、model、msdb、及tempdb等系统数据库。
例如master数据库记录了如此多且重要的信息,一旦数据库文件损失或损毁,将对整个SQL Server系统的运行造成重大的影响,甚至是得整个系统瘫痪。
参考资料来源:百度百科-系统数据库
kettle是一个ETL工具,ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)。
kettle中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。
所以他的重心是用于数据
oozie是一个工作流,Oozie工作流是放置在控制依赖DAG(有向无环图 Direct Acyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。
oozie工作流中是有数据流动的,但是重心是在于工作流的定义。
二者虽然都有相关功能及数据的流动,但是其实用途是不一样的。
查看帮助
列举出所有linux上的数据库
列举出所有Window上的数据库
查看数据库下的所有表
(1)确定mysql服务启动正常
查询控制端口和查询进程来确定,一下两种办法可以确认mysql是否在启动状态
办法1:查询端口
MySQL监控的TCP的3306端口,如果显示3306,证明MySQL服务在运行中
办法二:查询进程
可以看见mysql的进程
没有指定数据导入到哪个目录,默认是/user/root/表名
原因:
如果表中有主键,m的值可以设置大于1的值如果没有主键只能将m值设置成为1或者要将m值大于1,需要使用--split-by指定一个字段
设置了-m 1 说明只有一个maptask执行数据导入,默认是4个maptask执行导入 *** 作,但是必须指定一个列来作为划分依据
导入数据到指定目录
在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。使用参数 --target-dir来指定导出目的地,使用参数—delete-target-dir来判断导出目录是否存在,如果存在就删掉
查询导入
提示:must contain '$CONDITIONS' in WHERE clause。
where id <=1 匹配条件
$CONDITIONS:传递作用。
如果 query 后使用的是双引号,则 $CONDITIONS前必须加转义符,防止 shell 识别为自己的变量。
--query时不能使用--table一起使用
需要指定--target-dir路径
导入到hdfs指定目录并指定要求
数据导出储存方式(数据存储文件格式---( textfil parquet)--as-textfileImports data as plain text (default)--as-parquetfile Imports data to Parquet Files)
导入表数据子集到HDFS
sqoop导入blob数据到hive
对于CLOB,如xml文本,sqoop可以迁移到Hive表,对应字段存储为字符类型。
对于BLOB,如jpg图片,sqoop无法直接迁移到Hive表,只能先迁移到HDFS路径,然后再使用Hive命令加载到Hive表。迁移到HDFS后BLOB字段存储为16进制形式。
2.1.3导入关系表到Hive
第一步:导入需要的jar包
将我们mysql表当中的数据直接导入到hive表中的话,我们需要将hive的一个叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷贝到sqoop的lib目录下
第二步:开始导入
导入关系表到hive并自动创建hive表
们也可以通过命令来将我们的mysql的表直接导入到hive表当中去
通过这个命令,我们可以直接将我们mysql表当中的数据以及表结构一起倒入到hive当中去
--incremental 增量模式。
append id 是获取一个某一列的某个值。
lastmodified “2016-12-15 15:47:35” 获取某个时间后修改的所有数据
-append 附加模式
-merge-key id 合并模式
--check-column 用来指定一些列,可以去指定多个列;通常的是指定主键id
--last -value 从哪个值开始增量
==注意:增量导入的时候,一定不能加参数--delete-target-dir 否则会报错==
第一种增量导入方式(不常用)
1.Append方式
使用场景:有个订单表,里面每个订单有一个唯一标识的自增列id,在关系型数据库中以主键的形式存在。之前已经将id在0-1000之间的编号的订单导入到HDFS 中;如果在产生新的订单,此时我们只需指定incremental参数为append,--last-value参数为1000即可,表示只从id大于1000后开始导入。
(1)创建一个MySQL表
(2)创建一个hive表(表结构与mysql一致)
注意:
append 模式不支持写入到hive表中
2.lastModify方式
此方式要求原有表有time字段,它能指定一个时间戳,让sqoop把该时间戳之后的数据导入到HDFS;因为后续订单可能状体会变化,变化后time字段时间戳也会变化,此时sqoop依然会将相同状态更改后的订单导入HDFS,当然我们可以只当merge-key参数为order-id,表示将后续新的记录和原有记录合并。
# 将时间列大于等于阈值的数据增量导入HDFS
使用 lastmodified 方式导入数据,要指定增量数据是要 --append(追加)还是要 --merge-key(合并)last-value 指定的值是会包含于增量导入的数据中。
第二种增量导入方式(推荐)
==通过where条件选取数据更加精准==
2.1.5从RDBMS到HBase
会报错
原因:sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自动创建 HBase 表的功能。
解决方案:手动创建 HBase 表
导出前,目标表必须存在与目标数据库中
默认 *** 作是将文件中的数据使用insert语句插入到表中
数据是在HDFS当中的如下目录/sqoop/emp,数据内容如下
第一步:创建MySQL表
第二步:执行导出命令
通过export来实现数据的导出,将hdfs的数据导出到mysql当中去
全量导出
增量导出
更新导出
总结:
参数介绍
--update-key 后面也可以接多个关键字列名,可以使用逗号隔开,Sqoop将会匹配多个关键字后再执行更新 *** 作。
--export-dir 参数配合--table或者--call参数使用,指定了HDFS上需要将数据导入到MySQL中的文件集目录。
--update-mode updateonly和allowinsert。 默认模式为updateonly,如果指定--update-mode模式为allowinsert,可以将目标数据库中原来不存在的数据也导入到数据库表中。即将存在的数据更新,不存在数据插入。
组合测试及说明
1、当指定update-key,且关系型数据库表存在主键时:
A、allowinsert模式时,为更新目标数据库表存的内容,并且原来不存在的数据也导入到数据库表;
B、updateonly模式时,为更新目标数据库表存的内容,并且原来不存在的数据也不导入到数据库表;
2、当指定update-key,且关系型数据库表不存在主键时:
A、allowinsert模式时,为全部数据追加导入到数据库表;
B、updateonly模式时,为更新目标数据库表存的内容,并且原来不存在的数据也不导入到数据库表;
3、当不指定update-key,且关系型数据库表存在主键时:
A、allowinsert模式时,报主键冲突,数据无变化;
B、updateonly模式时,报主键冲突,数据无变化;
4、当不指定update-key,且关系型数据库表不存在主键时:
A、allowinsert模式时,为全部数据追加导入到数据库表;
B、updateonly模式时,为全部数据追加导入到数据库表;
实际案例:
(1)mysql批量导入hive
使用shell脚本:
笔者目前用sqoop把mysql数据导入到Hive中,最后实现命令行导入,sqoop版本1.4.7,实现如下
最后需要把这个导入搞成job,每天定时去跑,实现数据的自动化增量导入,sqoop支持job的管理,可以把导入创建成job重复去跑,并且它会在metastore中记录增值,每次执行增量导入之前去查询
创建job命令如下
创建完job就可以去执行它了
sqoop job --exec users
可以把该指令设为Linux定时任务,或者用Azkaban定时去执行它
hive导出到MySQL时,date类型数据发生变化?
问题原因:时区设置问题,date -R查看服务器时间,show VARIABLES LIKE "%time_zone"查看Mysql时间,system并不表示中国的标准时间,要将时间设置为东八区
(1):对市面上最流行的两种调度器,给出以下详细对比,以供技术选型参考。总体来说,ooize相比azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。如果可以不在意某些功能的缺失,轻量级调度器azkaban是很不错的候选对象。
(2):功能:
两者均可以调度mapreduce,pig,java,脚本工作流任务;
两者均可以定时执行工作流任务;
(3):工作流定义:
Azkaban使用Properties文件定义工作流;
Oozie使用XML文件定义工作流;
(4):工作流传参:
Azkaban支持直接传参,例如${input};
Oozie支持参数和EL表达式,例如${fs:dirSize(myInputDir)};
(5):定时执行:
Azkaban的定时执行任务是基于时间的;
Oozie的定时执行任务基于时间和输入数据;
(6):资源管理:
Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等 *** 作;
Oozie暂无严格的权限控制;
(7):工作流执行:
Azkaban有两种运行模式,分别是solo server mode(executor server和web server部署在同一台节点)和multi server mode(executor server和web server可以部署在不同节点);
Oozie作为工作流服务器运行,支持多用户和多工作流;
(8):工作流管理:
Azkaban支持浏览器以及ajax方式 *** 作工作流;
Oozie支持命令行、HTTP REST、Java API、浏览器 *** 作工作流;
浏览器页面访问
http://node03:8081/
使用Oozie时通常整合hue,用户数据仓库调度
就是刚才选择的脚本
脚本里需要的参数,尽量设置为动态自动获取,如 ${date}
第一步的参数是所有文件和当天日期,后面的只需要日期,最后一步是导出所有结果,相应填入
添加文件和设置相应参数
运行后会有状态提示页面,可以看到任务进度
点击调度任务的页面情况
修改定时任务名和描述
添加需要定时调度的任务
sm-workflow的参数都是写死的,没有设置动态,这里的下拉列表就不会有可选项。
设置参数
将sm-workflow的日期修改为 ${do_date},保存
进入定时计划sm-dw中,会看到有参数 do_date
填入相应参数,前一天日期
Oozie常用系统常量
当然,也可以通过这样将参数传入workflow任务中,代码或者shell中需要的参数。
如,修改sm-workflow 中的 sqoop_import.sh,添加一个参数 ${num}。
编辑文件(需要登陆Hue的用户有对HDFS *** 作的权限),修改shell中的一个值为参数,保存。
在workflow中,编辑添加参数 ${num} ,或者num=${num} 保存。
进入schedule中,可以看到添加的参数,编辑输入相应参数即可。
Bundle统一管理所有定时调度,阶段划分:Bundle >Schedule >workflow
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)