非常全面的DolphinScheduler(海豚调度)安装使用文档
1. DolphinScheduler的安装
1.1 安装环境
1. hadoop2.9.2
2. CentOS7.5
3. JDK1.8
4. Mysql5.7
5. Zookeeper-3.4.14
1.2 安装说明
1. 这里直接使用root用户进行安装,如果是使用普通用户安装,需要开启sudo免密和集群各节点之间实现ssh免密.
2. 配置/etc/hosts文件,做好主机名与ip之间的映射.
3. 安装ds的各台机器之间需要做ssh免密登陆(安装ds的用户之间的免密)
4. ds的安装节点与hdfs和yarn所在节点没有关系,只需要保证ds的worker所在节点有hadoop的安装目录并配置环境变量即可,因为要作为客户端提交命令.
5. 使用阿里云与本地虚拟机安装时配置有一点点区别,后面安装时配置有备注.
1.3 节点规划
主机名称 | master-server | worker-server | api-server | logger-server | alertserver |
linux121 | √ | √ | × | √ | × |
linux122 | √ | √ | √ | √ | √ |
linux123 | × | √ | × | √ | × |
1.4 具体安装步骤
1. 下载最新版的二进制安装包
wget https://www.apache.org/dyn/closer.cgi/incubator/dolphinscheduler/1.3.2/apache-dolphinscheduler-incubating-1.3.2-dolphinscheduler-bin.tar.gz |
2. 解压,重命名
[root@linux122 software]# tar -zvxf apache-dolphinscheduler-incubating-1.3.2-dolphinscheduler-bin.tar.gz [root@linux122 software]# mv apache-dolphinscheduler-incubating-1.3.2-dolphinscheduler-bin dolphinscheduler-bin |
3. 将MySQL的驱动包放到dolphinscheduler-bin/lib目录下(使用超链接的方式)
[root@linux122 software]# ln -s /opt/servers/hive-2.3.7/lib/mysql-connector-java-5.1.46.jar /opt/software/dolphinscheduler-bin/lib/mysql-connector-java.jar |
4. 在MySQL中创建dolphinscheduler数据库
mysql> create database dolphinscheduler; |
5. 修改dolphinscheduler-bin/conf/datasource.properties配置文件,将数据库改为mysql(默认是postgresql)
[root@linux122 dolphinscheduler-bin]# vim conf/datasource.properties #mysql spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://linux123:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=12345678 |
6. 执行ds自带的脚本
[root@linux122 dolphinscheduler-bin]# sh script/create-dolphinscheduler.sh |
7. 修改ds运行时的参数(即conf/env/dolphinscheduler_env.sh文件)
[root@linux122 dolphinscheduler-bin]# vim conf/env/dolphinscheduler_env.sh #根据自身实际情况设置,暂时用不到的组件可以先注释掉或不设置 export HADOOP_HOME=/opt/servers/hadoop-2.9.2/ export HADOOP_CONF_DIR=/opt/servers/hadoop-2.9.2/etc/hadoop #export SPARK_HOME2=/opt/servers/spark-2.4.1 #export PYTHON_HOME=/opt/soft/python export JAVA_HOME=/opt/servers/jdk1.8.0_231/ export HIVE_HOME=/opt/servers/hive-2.3.7/ #export FLINK_HOME=/opt/servers/flink-1.10 #export DATAX_HOME=/opt/servers/datax/bin/datax.py export PATH=$HADOOP_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH |
8. 在准备安装ds的所有节点上执行下面的命令(将java命令超链接到自己安装的jdk下)
[root@linux122 dolphinscheduler-bin]# rm -rf /usr/bin/java [root@linux121 dolphinscheduler-1.3.2]# ln -s /opt/servers/jdk1.8.0_231/bin/java /usr/bin/java [root@linux122 dolphinscheduler-1.3.2]# ln -s /opt/servers/jdk1.8.0_231/bin/java /usr/bin/java [root@linux123 dolphinscheduler-1.3.2]# ln -s /opt/servers/jdk1.8.0_231/bin/java /usr/bin/java |
说明:如果/usr/bin/java已经存在,先删除掉,重新建立超链接.
9. 修改一键部署的相关配置文件(具体内容根据自己的实际规划进行修改)
[root@linux122 dolphinscheduler-bin]# vim conf/config/install_config.conf # postgresql or mysql (这里我们把元数据放在mysql)
dbtype="mysql"
# db config
# db address and port (mysql所在机器的ip和端口)
dbhost="linux123:3306"
# db username(连接mysql的用户名)
username="root"
# database name(存放ds元数据的数据库名,与上面创建的保持一致)
dbname="dolphinscheduler"
# db passwprd(连接mysql的密码)
# NOTICE: if there are special characters, please use the \ to escape, for example, `[` escape to `\[`
password="12345678"
# zk cluster. (Zookeeper所在的节点)
zkQuorum="linux121:2181,linux122:2181,linux123:2181"
# Note: the target installation path for dolphinscheduler, please not config as the same as the current path (pwd)
#指定ds的安装目录 (可以在每台节点提前创建该目录并保证安装ds的用户有读写权限)
installPath="/opt/servers/dolphinscheduler-1.3.2"
# deployment user(部署用户需要有sudo和操作hdfs的权限)
# Note: the deployment user needs to have sudo privileges and permissions to operate hdfs. If hdfs is enabled, the root directory needs to be created by itself
deployUser="root"
# alert config(这里告警以qq邮箱为例,实测可用)
# mail server host
mailServerHost="smtp.qq.com"
# mail server port
# note: Different protocols and encryption methods correspond to different ports, when SSL/TLS is enabled, make sure the port is correct.
#如果是公司内网机器或虚拟机,默认的25端口号是可以使用的(且可以不加ssl认证的).如果使用的是阿里云,如果不加ssl认证25端口是用不了的,可以修改端口号为460等 ,且后面需要加ssl认证
mailServerPort="25"
# sender
mailSender="xxxx@qq.com"
# user
mailUser="xxxx@qq.com"
# sender password(这里是授权码,不是邮箱登陆)
# note: The mail.passwd is email service authorization code, not the email login password.
mailPassword="phkgigdykiunxxxx"
# TLS mail protocol support
starttlsEnable="true"
# SSL mail protocol support
# only one of TLS and SSL can be in the true state.
#阿里云环境必须启用ssl认证,如果是内网,虚拟机可以设置为false .
sslEnable="false"
#note: sslTrust is the same as mailServerHost
sslTrust="smtp.qq.com"
# resource storage type:HDFS,S3,NONE(资源存储一般选用HDFS,注意一定是大写)
resourceStorageType="HDFS"
# if resourceStorageType is HDFS,defaultFS write namenode address,HA you need to put core-site.xml and hdfs-site.xml in the conf directory.
# if S3,write S3 address,HA,for example :s3a://dolphinscheduler,
# Note,s3 be sure to create the root directory /dolphinscheduler
# 这里是单节点的namenode.如果是HA的必须还要将上面说的core-site.xml和hdfs-site.xml文件放在对应目录下(单节点的也可以放)
defaultFS="hdfs://linux121:9000"
# if resourceStorageType is S3, the following three configuration is required, otherwise please ignore
s3Endpoint="http://192.168.xx.xx:9010"
s3AccessKey="xxxxxxxxxx"
s3SecretKey="xxxxxxxxxx"
# if resourcemanager HA enable, please type the HA ips ; if resourcemanager is single, make this value empty
#这里的resourcemanager是单节点的,注释掉.如果是HA要写对应的主机名,多台节点逗号分隔
#yarnHaIps="192.168.xx.xx,192.168.xx.xx"
# if resourcemanager HA enable or not use resourcemanager, please skip this value setting; If resourcemanager is single, you only need to replace yarnIp1 to actual resourcemanager hostname. #单节点的rm,写rm所在的主机名
singleYarnIp="linux123"
# resource store on HDFS/S3 path, resource file will store to this hadoop hdfs path, self configuration, please make sure the directory exists on hdfs and have read write permissions。/dolphinscheduler is recommended
#将你的shell脚本,或jar包等执行的资源放在hdfs指定的目录下.该目录会在hdfs上自动创建
resourceUploadPath="/dolphinscheduler"
# who have permissions to create directory under HDFS/S3 root path
# Note: if kerberos is enabled, please config hdfsRootUser=
#这是在hdfs创建目录的用户(注意权限问题),可以通过ps -ef | grep datanode查看拥有创建目录的权限的用户
hdfsRootUser="root"
# kerberos config
# whether kerberos starts, if kerberos starts, following four items need to config, otherwise please ignore
kerberosStartUp="false"
# kdc krb5 config file path
krb5ConfPath="$installPath/conf/krb5.conf"
# keytab username
keytabUserName="hdfs-mycluster@ESZ.COM"
# username keytab path
keytabPath="$installPath/conf/hdfs.headless.keytab"
# api server port(默认就好)
apiServerPort="12345"
# install hosts(安装ds的所有主机)
# Note: install the scheduled hostname list. If it is pseudo-distributed, just write a pseudo-distributed hostname
ips="linux121,linux122,linux123"
# ssh port, default 22
# Note: if ssh port is not default, modify here
sshPort="22"
# run master machine(指定master-server所在的节点)
# Note: list of hosts hostname for deploying master
masters="linux121,linux122"
# run worker machine(指定work所在的节点,后面的default是给机器打标签,针对不同的机器可以打不同的标签,这里就打同一个标签)
# note: need to write the worker group name of each worker, the default value is "default"
workers="linux121:default,linux122:default,linux123:default"
# run alert machine(alert-server所在的节点,指定一个节点就行)
# note: list of machine hostnames for deploying alert server
alertServer="linux122"
# run api machine(指定api-server所在节点,一个节点就行)
# note: list of machine hostnames for deploying api server
apiServers="linux122"
|
说明: 机器打标签可以按照机器不同的性能打不同的标签,比如机器性能高的打high的标签,将重要任务就可以放在性能高的机器执行.性能低的low标签,一般任务就指定在性能低的机器执行.
10. 将core-site.xml和hdfs-site.xml文件拷贝到conf目录下(以超链接的方式)
[root@linux122 dolphinscheduler-bin]# ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/core-site.xml ./conf/core-site.xml [root@linux122 dolphinscheduler-bin]# ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml ./conf/hdfs-site.xml |
11. 修改各个服务日志的存放目录(这里全部修改为存放在/logs/ds目录下)
[root@linux122 conf]# vim logback-master.xml [root@linux122 conf]# vim logback-worker.xml [root@linux122 conf]# vim logback-api.xml [root@linux122 conf]# vim logback-alert.xml <property name="log.base" value="/logs/ds"/>(第22行) |
12. 切换到部署ds的用户(这里是root),执行一键部署脚本
[root@linux122 dolphinscheduler-bin]# sh install.sh |
说明: 需要部署过程中没有任何报错信息.
13. 部署完成后,服务会自动启动.查看ds各节点的进程情况
[root@linux121 dolphinscheduler-1.3.2]# jps 16116 LoggerServer 16056 WorkerServer 15995 MasterServer
[root@linux122 dolphinscheduler-1.3.2]# jps 12535 ApiApplicationServer 12282 MasterServer 12474 AlertServer 12413 LoggerServer 12351 WorkerServer
[root@linux123 logs]# jps 13549 WorkerServer 13613 LoggerServer |
14. 登陆WebUI界面(api-server所在的ip地址)
http://linux122:12345/dolphinscheduler
登陆名: admin
登陆密码: dolphinscheduler123
1.5 ds的启动和停止命令(首先需要给脚本文件可执行权限)
#根据配置文件中指定的角色群起/群停进程
[root@linux122 dolphinscheduler-1.3.2]# bin/start-all.sh
[root@linux122 dolphinscheduler-1.3.2]# bin/stop-all.sh
#单独起/停某个进程
[root@linux122 dolphinscheduler-1.3.2]# bin/dolphinscheduler-daemon.sh start master-server
[root@linux122 dolphinscheduler-1.3.2]# bin/dolphinscheduler-daemon.sh stop master-server
[root@linux122 dolphinscheduler-1.3.2]# bin/dolphinscheduler-daemon.sh start worker-server
[root@linux122 dolphinscheduler-1.3.2]# bin/dolphinscheduler-daemon.sh stop worker-server
[root@linux122 dolphinscheduler-1.3.2]# bin/dolphinscheduler-daemon.sh start api-server
[root@linux122 dolphinscheduler-1.3.2]# bin/dolphinscheduler-daemon.sh stop api-server |
2.DolphinScheduler的基本使用(有中文版操作界面)
2.1 安全中心(安全中心的设置需要使用admin用户来操作)
2.1.1 指定yarn调度器中存在的队列
2.1.2 worker分组
如果ds的worker节点数量很多,可以将不同的机器划分为不同的组,以便后期不同优先级的任务调度在不同的组,可以配置多个.(这里在安装时只配了一个default组)
2.1.3 告警组管理
增加告警组:
为不同的告警组添加用户(需要先在用户管理界面使用admin账户添加该用户):
说明:这样操作之后该告警组就与这个用户的邮箱进行绑定了,只要后面像该告警组发邮件,就会发给告警组里面的所有用户.
2.1.4 租户管理
这里租户相当于就是linux上的用户,当关联这个租户时就是指定了以linux上的哪个用户来提交任务,如果这个用户在linux上存在则直接切换到该用户,如果不存在则创建该用户.
2.1.5 用户管理
2.2 ds创建项目
这里以xiaobai这个用户在做演示,一般实际生产中admin用户也只负责管理,也不会操作具体项目.且这里xiaobai关联的是root这个租户.
2.2.1 创建一个项目
2.2.2 为项目创建具体工作和task并运行
工作流,任务相关说明:
创建一个工作流程:
2.2.3 查看运行的结果及相关信息
2.2.4 查看工作流中具体的task实例
说明:如果上面有选择告警的话查看邮箱就可看到邮件了
2.2.5 针对失败的工作流的处理
2.3 连接外部数据源
2.3.1 连接hive的数据源
2.3.2 测试使用hive的数据源进行sql查询
创建一个项目用来测试Hive的sql查询:
说明: 最下面贴执行的sql语句时最后不要加分号.且只能执行一整段sql语句.
2.4 执行包含hql的shell脚本
2.4.1 在资源中心创建文件夹
首先创建一个文件夹,可以用来管理同一模块下的许多脚本,jar包以及用到的其它文件.
2.4.2 在文件夹下创建或上传脚本
2.4.3 创建文件
1. 将shell脚本的内容全部粘贴到文件内容中(文件名称不用带.sh的后缀)
说明: 执行hql命令有2种方式,一种是cli的方式,另一种是beeline的方式.生产上基本都是使用beeline的方式.
可以看到在该目录下得到了一个新的文件
2.4.4 创建并执行工作流
1. 根据步骤2.2中的说明创建项目(并定义工作流)
2. 调用创建好的资源文件来创建task,且是使用shell的方式
3. 点击左下角确认添加
4. 点击右上角的保存
5. 设置工作流DAG图的相关信息
6. 将创建好的工作流上线
7. 选择马上运行或定时调度
8. 每一次运行就会得到一个工作流实例
9. 每个工作流实例中有1个或多个task实例
2.5 子节点(sub_process)
子节点只能选择同一个项目下的工作流,即实现同一个项目下工作流之间的依赖.可以在一个工作流中引入其它工作流作为子节点.当运行当前工作流时,会先运行子节点,子节点运行成功后才继续执行后面的工作流.
2.6 依赖节点(denpency)
依赖节点可以实现项目之间的依赖.B项目依赖A项目,那么只有A项目执行成功后才会继续执行B项目.
2.7 重试机制
调度判断一个shell脚本执行成功还是失败的标识: exit 0表示成功(执行完成后默认为exit 0),exit 1表示失败(有时可以手动将正常的脚本最后显性执行exit 1,则会被标记为失败).可以在定义task时开启重试.
2.8 补数机制
在补数的时候会根据调度日期往后推迟一天,所以如果需要补10月1号到10月8号的数据,需要选择的调度日期是9月30号到10月7号进行补数.当然这个可以通过在传递全局参数时通过给全局变量的值为$[yyyy-MM-dd-1],选择的调度日期就是补数的日期了.
2.8.1 实际场景中的应用(针对的是一个工作流中所有task的补数)
在执行shell脚本时通过${date}来获取外界传入的日期.
点击右上角保存,将该变量设置为全局变量,value值设置为$[yyyy-MM-dd-1]或不给值.这样在调度该脚本时那么脚本里面获取的日期就是当前时间的前一天.但是如果需要使用后的补数机制时必须给value的值,这里建议给$[yyyy-MM-dd-1],那么在选择调度日期时就是补数的日期.
通过设置value的值为$[yyyy-MM-dd-1],那么脚本传入的日期就是选择的调度日期(不存在加1天的情况).
补数的工作流:
2.9 停止,暂停,重跑的机制
l 重跑: 重新执行已经终止的流程。
l 恢复失败: 针对失败的流程,可以执行恢复失败操作,从失败的节点开始执行。
l 停止: 对正在运行的流程进行停止操作,后台会先killworker进程,再执行kill -9操作
l 暂停: 对正在运行的流程进行暂停操作,系统状态变为等待执行,会等待正在执行的任务结束,暂停下一个要执行的任务。
l 恢复暂停: 对暂停的流程恢复,直接从暂停的节点开始运行
l 删除: 删除工作流实例及工作流实例下的任务实例
2.10 定时任务调度(针对工作流)
1. 进入定时配置界面
2. 配置调度相关参数
3. 上线任务调度(需要修改调度任务时要先下线,再修改,再上线)
4. 从工作流中进入已经设定好的调度任务
注意:
当我们下线工作流时,定时任务调度会跟着下线.而再次上线工作流时,里面定时任务调度不会跟着上线,需要我们手动上线.
2.11 失败策略机制
在运行之前设置失败策略:
当一个工作流中,如果有一个或几个task执行失败,可以有继续和结束两种处理策略.
继续策略:当其中一个或几个节点失败时,只有依赖它的节点会全部停止执行.而与它没有依赖关系,并行的节点仍将继续执行.
结束策略:当工作流中有1个节点失败时,整个工作流的所有后续的其它节点都会停止执行.
3.ds的企业微信告警
3.1 修改配置文件
在alert-server所在的机器上修改conf/alert.properties配置文件
3.2 配置文件参数说明以及获取方式
1. 开启企业微信报警
# 设置企业微信告警功能是否开启:开启为 true,否则为 false。
enterprise.wechat.enable=true |
2. 设置corp.id配置参数
# 设置 corpid,每个企业都拥有唯一的corpid,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业 ID”(需要有管理员权限)
enterprise.wechat.corp.id=xxxxx |
3. 将图片中所示的secret和agentid填入配置文件中
# 设置secret,secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥。
enterprise.wechat.secret=xxxx |
# 设置 agentid,每个应用都有唯一的 agentid。在管理后台->“应用与小程序”->“应用”,点进某个应用,即可看到 agentid。
enterprise.wechat.agent.id="xxxx" |
4. 在配置文件中增加userid,表示哪些用户可以看到这个应用的推送消息(这些用户必须在上面图中所示该应用的可见范围中)
# 设置 userid,多个用逗号分隔。每个成员都有唯一的 userid,即所谓“帐号”。在管理后台->“通讯录”->点进某个成员的详情页,可以看到。
enterprise.wechat.users=zhangsan,lisi,wangwu |
5. 其它配置项无需改动
# 获取 access_token 的地址,无需修改 enterprise.wechat.token.url=https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpId&corpsecret=$secret # 发送应用消息地址,无需修改 enterprise.wechat.push.url=https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$token # 无需修改 enterprise.wechat.team.send.msg={\"toparty\":\"$toParty\",\"agentid\":\"$agentId\",\"msgtype\":\"text\",\"text\":{\"con tent\":\"$msg\"},\"safe\":\"0\"} # 无需修改 enterprise.wechat.user.send.msg={\"touser\":\"$toUser\",\"agentid\":\"$agentId\",\"msgtype\":\"markdown\",\"markdown\": {\"content\":\"$msg\"}} |
6. 重启配置文件所在机器的alert-server服务,然后进行测试
[root@linux122 dolphinscheduler-1.3.2]# bin/dolphinscheduler-daemon.sh stop alert-server [root@linux122 dolphinscheduler-1.3.2]# bin/dolphinscheduler-daemon.sh start alert-server |
4.常见问题说明
1. 默认情况下,admin用户是没有关联任何租户的,如果是使用admin来上传文件,创建工作流这些,需要先关联已有的租户.但一般生产中admin不会关联租户,因为不需要创建具体的项目.
2. 使用admin账户对普通用户进行项目,资源文件等进行授权
3. 修改工作流或工作流里面的task需要先将工作流下线
说明:每次修改完之后记得保存.
4. 对于失败的任务进行重跑的方法
说明: 选择恢复失败时已成功的节点不再执行.
5. 工作流下线后再上线时,设置的定时任务并没有跟着上线,需要手动上线定时任务.
6. 任务优先级,在线程数不足的时候会根据任务优先级来进行处理.
7. 超时告警,如果在指定的时间内task没有执行完成就会告警,且将该task置为失败
8. 在脚本里面引用参数: ${name}
9. 针对整个工作流的超时告警:
10. 要重新编辑工作流定义时,需要先将工作流下线
11. 引用资源中心文件的语法,写相对路径sh test/test_shell.sh
12. 可以不同的条件筛选工作流实例和任务实例
13. 对于同一个工作流里面的多个task,根据情况也会分配到不同的节点上执行.
14. 重试2次就代表第一次执行失败后最多还会重试2次,总共执行最多3次.
15. 执行脚本的后面写${date_exec}后,如果参数不定义value则脚本里面的时间还是当前日期减1,不传入任何参数就是个空,相当于没有传入时间,脚本就会获取当前时间的前一天了.
16. 子工作流的使用,当B工作流依赖于A这个子工作流时,我们执行B工作流即可,它会先执行A工作流,只有A工作流执行成功,才会继续执行B工作流.注意:不要先把A工作流自己执行一遍,然后再去执行B工作流,这样的话A工作流会被执行2次,会导致错误的结果.
17. 用shell脚本封装的hql里面一定不能用--来写注释,很多可能碰到任务一直处于运行状态,一直卡在那里.
18. 依赖的使用,依赖可以跨项目,依赖某个项目,某个工作流甚至到某个节点.
19. 上传文件到资源中心时不能批量上传文件.只能一个个上传.不过当文件确实太多时可以将文件先上传到hdfs对应的目录,然后修改mysql中的表来实现批量上传.
20. 当定义task,一次加载资源中心太多文件的话,会报工作流创建失败,这时要么减少资源中心的文件,要么通过修改mysql中表字段的值来解决.
21. yarn队列是跟着用户指定的队列走的(不是租户关联的)
鸣谢:感谢可爱群友大象哥提供资料
pdf目录:
你要悄悄学会HBase,然后惊艳所有人(1.7万字建议收藏)
一文带你深入了解kafka并提供52道企业常见面试题(1.8W字建议收藏)