install.sh 14.4 KB
Newer Older
D
dailidong 已提交
1
#!/bin/sh
2

D
dailidong 已提交
3 4
workDir=`dirname $0`
workDir=`cd ${workDir};pwd`
D
dailidong 已提交
5

D
dailidong 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#To be compatible with MacOS and Linux
txt=""
if [[ "$OSTYPE" == "darwin"* ]]; then
    # Mac OSX
    txt="''"
elif [[ "$OSTYPE" == "linux-gnu" ]]; then
    # linux
    txt=""
elif [[ "$OSTYPE" == "cygwin" ]]; then
    # POSIX compatibility layer and Linux environment emulation for Windows
    echo "Easy Scheduler not support Windows operating system"
    exit 1
elif [[ "$OSTYPE" == "msys" ]]; then
    # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
    echo "Easy Scheduler not support Windows operating system"
    exit 1
elif [[ "$OSTYPE" == "win32" ]]; then
    echo "Easy Scheduler not support Windows operating system"
    exit 1
elif [[ "$OSTYPE" == "freebsd"* ]]; then
    # ...
    txt=""
else
    # Unknown.
    echo "Operating system unknown, please tell us(submit issue) for better service"
    exit 1
fi

D
dailidong 已提交
34 35
source ${workDir}/conf/config/run_config.conf
source ${workDir}/conf/config/install_config.conf
36 37 38 39 40 41

# mysql配置
# mysql 地址,端口
mysqlHost="192.168.xx.xx:3306"

# mysql 数据库名称
D
dailidong 已提交
42
mysqlDb="escheduler"
43 44

# mysql 用户名
D
dailidong 已提交
45
mysqlUserName="xx"
46 47

# mysql 密码
D
dailidong 已提交
48
mysqlPassword="xx"
49

B
baoliang 已提交
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
# conf/config/install_config.conf配置
# 安装路径,不要当前路径(pwd)一样
installPath="/data1_1T/escheduler"

# 部署用户
deployUser="escheduler"

# zk集群
zkQuorum="192.168.xx.xx:2181,192.168.xx.xx:2181,192.168.xx.xx:2181"

# 安装hosts
ips="ark0,ark1,ark2,ark3,ark4"

# conf/config/run_config.conf配置
# 运行Master的机器
masters="ark0,ark1"

# 运行Worker的机器
workers="ark2,ark3,ark4"

# 运行Alert的机器
alertServer="ark3"

# 运行Api的机器
apiServers="ark1"

# alert配置
# 邮件协议
mailProtocol="SMTP"

# 邮件服务host
mailServerHost="smtp.exmail.qq.com"

# 邮件服务端口
mailServerPort="25"

# 发送人
mailSender="xxxxxxxxxx"

# 发送人密码
mailPassword="xxxxxxxxxx"

# 下载Excel路径
xlsFilePath="/tmp/xls"

95 96

# hadoop 配置
B
baoliang 已提交
97 98 99 100
# 是否启动hdfs,如果启动则为true,需要配置以下hadoop相关参数;
# 不启动设置为false,如果为false,以下配置不需要修改
hdfsStartupSate="false"

L
ligang 已提交
101
#是否启动自启动脚本
L
ligang 已提交
102
monitorServerState="false"
D
dailidong 已提交
103 104
# namenode地址,支持HA,需要将core-site.xml和hdfs-site.xml放到conf目录下
namenodeFs="hdfs://mycluster:8020"
105

D
dailidong 已提交
106 107
# resourcemanager HA配置,如果是单resourcemanager,这里为空即可
yarnHaIps="192.168.xx.xx,192.168.xx.xx"
108

D
dailidong 已提交
109 110
# 如果是单 resourcemanager,只需要配置一个主机名称,如果是resourcemanager HA,则默认配置就好
singleYarnIp="ark1"
111

B
baoliang 已提交
112 113
# hdfs根路径,根路径的owner必须是部署用户
hdfsPath="/escheduler"
114 115 116

# common 配置
# 程序路径
D
dailidong 已提交
117
programPath="/tmp/escheduler"
118 119

#下载路径
D
dailidong 已提交
120
downloadPath="/tmp/escheduler/download"
121 122

# 任务执行路径
D
dailidong 已提交
123
execPath="/tmp/escheduler/exec"
124 125

# SHELL环境变量路径
B
baoliang 已提交
126
shellEnvPath="$installPath/conf/env/.escheduler_env.sh"
127 128

# 资源文件的后缀
D
dailidong 已提交
129
resSuffixs="txt,log,sh,conf,cfg,py,java,sql,hql,xml"
130

D
dailidong 已提交
131 132
# 开发状态,如果是true,对于SHELL脚本可以在execPath目录下查看封装后的SHELL脚本,如果是false则执行完成直接删除
devState="true"
133 134 135

# zk 配置
# zk根目录
D
dailidong 已提交
136
zkRoot="/escheduler"
137 138

# 用来记录挂掉机器的zk目录
D
dailidong 已提交
139
zkDeadServers="/escheduler/dead-servers"
140

D
dailidong 已提交
141 142
# masters目录
zkMasters="/escheduler/masters"
143

D
dailidong 已提交
144 145
# workers目录
zkWorkers="/escheduler/workers"
146

D
dailidong 已提交
147 148
# zk master分布式锁
mastersLock="/escheduler/lock/masters"
149

D
dailidong 已提交
150 151
# zk worker分布式锁
workersLock="/escheduler/lock/workers"
152

D
dailidong 已提交
153 154
# zk master容错分布式锁
mastersFailover="/escheduler/lock/failover/masters"
155

D
dailidong 已提交
156 157
# zk worker容错分布式锁
workersFailover="/escheduler/lock/failover/masters"
158 159 160 161 162 163 164 165

# zk session 超时
zkSessionTimeout="300"

# zk 连接超时
zkConnectionTimeout="300"

# zk 重试间隔
D
dailidong 已提交
166
zkRetrySleep="100"
167 168

# zk重试最大次数
D
dailidong 已提交
169
zkRetryMaxtime="5"
170 171


D
dailidong 已提交
172 173 174
# master 配置
# master执行线程最大数,流程实例的最大并行度
masterExecThreads="100"
175

D
dailidong 已提交
176 177
# master任务执行线程最大数,每一个流程实例的最大并行度
masterExecTaskNum="20"
178

D
dailidong 已提交
179 180
# master心跳间隔
masterHeartbeatInterval="10"
181

D
dailidong 已提交
182 183
# master任务提交重试次数
masterTaskCommitRetryTimes="5"
184

D
dailidong 已提交
185 186
# master任务提交重试时间间隔
masterTaskCommitInterval="100"
187

D
dailidong 已提交
188
# master最大cpu平均负载,用来判断master是否还有执行能力
D
dailidong 已提交
189
masterMaxCpuLoadAvg="10"
190

D
dailidong 已提交
191 192
# master预留内存,用来判断master是否还有执行能力
masterReservedMemory="1"
193 194


D
dailidong 已提交
195 196 197
# worker 配置
# worker执行线程
workerExecThreads="100"
198

D
dailidong 已提交
199 200
# worker心跳间隔
workerHeartbeatInterval="10"
201

D
dailidong 已提交
202
# worker一次抓取任务数
D
dailidong 已提交
203
workerFetchTaskNum="3"
204

D
dailidong 已提交
205 206
# worker最大cpu平均负载,用来判断worker是否还有执行能力,保持系统默认,默认为cpu核数的2倍,当负载达到2倍时,
#workerMaxCupLoadAvg="10"
207

D
dailidong 已提交
208 209
# worker预留内存,用来判断master是否还有执行能力
workerReservedMemory="1"
210 211 212

# api 配置
# api 服务端口
D
dailidong 已提交
213
apiServerPort="12345"
214 215

# api session 超时
D
dailidong 已提交
216
apiServerSessionTimeout="7200"
217 218

# api 上下文路径
D
dailidong 已提交
219
apiServerContextPath="/escheduler/"
220

D
dailidong 已提交
221 222
# spring 最大文件大小
springMaxFileSize="1024MB"
223

D
dailidong 已提交
224 225
# spring 最大请求文件大小
springMaxRequestSize="1024MB"
226 227 228 229 230 231

# api 最大post请求大小
apiMaxHttpPostSize="5000000"

# 1,替换文件
echo "1,替换文件"
D
dailidong 已提交
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
sed -i ${txt} "s#spring.datasource.url.*#spring.datasource.url=jdbc:mysql://${mysqlHost}/${mysqlDb}?characterEncoding=UTF-8#g" conf/dao/data_source.properties
sed -i ${txt} "s#spring.datasource.username.*#spring.datasource.username=${mysqlUserName}#g" conf/dao/data_source.properties
sed -i ${txt} "s#spring.datasource.password.*#spring.datasource.password=${mysqlPassword}#g" conf/dao/data_source.properties

sed -i ${txt} "s#org.quartz.dataSource.myDs.URL.*#org.quartz.dataSource.myDs.URL=jdbc:mysql://${mysqlHost}/${mysqlDb}?characterEncoding=UTF-8#g" conf/quartz.properties
sed -i ${txt} "s#org.quartz.dataSource.myDs.user.*#org.quartz.dataSource.myDs.user=${mysqlUserName}#g" conf/quartz.properties
sed -i ${txt} "s#org.quartz.dataSource.myDs.password.*#org.quartz.dataSource.myDs.password=${mysqlPassword}#g" conf/quartz.properties


sed -i ${txt} "s#fs.defaultFS.*#fs.defaultFS=${namenodeFs}#g" conf/common/hadoop/hadoop.properties
sed -i ${txt} "s#yarn.resourcemanager.ha.rm.ids.*#yarn.resourcemanager.ha.rm.ids=${yarnHaIps}#g" conf/common/hadoop/hadoop.properties
sed -i ${txt} "s#yarn.application.status.address.*#yarn.application.status.address=http://${singleYarnIp}:8088/ws/v1/cluster/apps/%s#g" conf/common/hadoop/hadoop.properties

sed -i ${txt} "s#data.basedir.path.*#data.basedir.path=${programPath}#g" conf/common/common.properties
sed -i ${txt} "s#data.download.basedir.path.*#data.download.basedir.path=${downloadPath}#g" conf/common/common.properties
sed -i ${txt} "s#process.exec.basepath.*#process.exec.basepath=${execPath}#g" conf/common/common.properties
sed -i ${txt} "s#data.store2hdfs.basepath.*#data.store2hdfs.basepath=${hdfsPath}#g" conf/common/common.properties
sed -i ${txt} "s#hdfs.startup.state.*#hdfs.startup.state=${hdfsStartupSate}#g" conf/common/common.properties
sed -i ${txt} "s#escheduler.env.path.*#escheduler.env.path=${shellEnvPath}#g" conf/common/common.properties
sed -i ${txt} "s#resource.view.suffixs.*#resource.view.suffixs=${resSuffixs}#g" conf/common/common.properties
sed -i ${txt} "s#development.state.*#development.state=${devState}#g" conf/common/common.properties

sed -i ${txt} "s#zookeeper.quorum.*#zookeeper.quorum=${zkQuorum}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.escheduler.root.*#zookeeper.escheduler.root=${zkRoot}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.escheduler.dead.servers.*#zookeeper.escheduler.dead.servers=${zkDeadServers}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.escheduler.masters.*#zookeeper.escheduler.masters=${zkMasters}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.escheduler.workers.*#zookeeper.escheduler.workers=${zkWorkers}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.escheduler.lock.masters.*#zookeeper.escheduler.lock.masters=${mastersLock}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.escheduler.lock.workers.*#zookeeper.escheduler.lock.workers=${workersLock}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.escheduler.lock.failover.masters.*#zookeeper.escheduler.lock.failover.masters=${mastersFailover}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.escheduler.lock.failover.workers.*#zookeeper.escheduler.lock.failover.workers=${workersFailover}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.session.timeout.*#zookeeper.session.timeout=${zkSessionTimeout}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.connection.timeout.*#zookeeper.connection.timeout=${zkConnectionTimeout}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.retry.sleep.*#zookeeper.retry.sleep=${zkRetrySleep}#g" conf/zookeeper.properties
sed -i ${txt} "s#zookeeper.retry.maxtime.*#zookeeper.retry.maxtime=${zkRetryMaxtime}#g" conf/zookeeper.properties

sed -i ${txt} "s#master.exec.threads.*#master.exec.threads=${masterExecThreads}#g" conf/master.properties
sed -i ${txt} "s#master.exec.task.number.*#master.exec.task.number=${masterExecTaskNum}#g" conf/master.properties
sed -i ${txt} "s#master.heartbeat.interval.*#master.heartbeat.interval=${masterHeartbeatInterval}#g" conf/master.properties
sed -i ${txt} "s#master.task.commit.retryTimes.*#master.task.commit.retryTimes=${masterTaskCommitRetryTimes}#g" conf/master.properties
sed -i ${txt} "s#master.task.commit.interval.*#master.task.commit.interval=${masterTaskCommitInterval}#g" conf/master.properties
D
dailidong 已提交
273
sed -i ${txt} "s#master.max.cpuload.avg.*#master.max.cpuload.avg=${masterMaxCpuLoadAvg}#g" conf/master.properties
D
dailidong 已提交
274 275 276 277 278 279
sed -i ${txt} "s#master.reserved.memory.*#master.reserved.memory=${masterReservedMemory}#g" conf/master.properties


sed -i ${txt} "s#worker.exec.threads.*#worker.exec.threads=${workerExecThreads}#g" conf/worker.properties
sed -i ${txt} "s#worker.heartbeat.interval.*#worker.heartbeat.interval=${workerHeartbeatInterval}#g" conf/worker.properties
sed -i ${txt} "s#worker.fetch.task.num.*#worker.fetch.task.num=${workerFetchTaskNum}#g" conf/worker.properties
D
dailidong 已提交
280
#sed -i ${txt} "s#worker.max.cpuload.avg.*#worker.max.cpuload.avg=${workerMaxCupLoadAvg}#g" conf/worker.properties
D
dailidong 已提交
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
sed -i ${txt} "s#worker.reserved.memory.*#worker.reserved.memory=${workerReservedMemory}#g" conf/worker.properties


sed -i ${txt} "s#server.port.*#server.port=${apiServerPort}#g" conf/application.properties
sed -i ${txt} "s#server.session.timeout.*#server.session.timeout=${apiServerSessionTimeout}#g" conf/application.properties
sed -i ${txt} "s#server.context-path.*#server.context-path=${apiServerContextPath}#g" conf/application.properties
sed -i ${txt} "s#spring.http.multipart.max-file-size.*#spring.http.multipart.max-file-size=${springMaxFileSize}#g" conf/application.properties
sed -i ${txt} "s#spring.http.multipart.max-request-size.*#spring.http.multipart.max-request-size=${springMaxRequestSize}#g" conf/application.properties
sed -i ${txt} "s#server.max-http-post-size.*#server.max-http-post-size=${apiMaxHttpPostSize}#g" conf/application.properties


sed -i ${txt} "s#mail.protocol.*#mail.protocol=${mailProtocol}#g" conf/alert.properties
sed -i ${txt} "s#mail.server.host.*#mail.server.host=${mailServerHost}#g" conf/alert.properties
sed -i ${txt} "s#mail.server.port.*#mail.server.port=${mailServerPort}#g" conf/alert.properties
sed -i ${txt} "s#mail.sender.*#mail.sender=${mailSender}#g" conf/alert.properties
sed -i ${txt} "s#mail.passwd.*#mail.passwd=${mailPassword}#g" conf/alert.properties
sed -i ${txt} "s#xls.file.path.*#xls.file.path=${xlsFilePath}#g" conf/alert.properties


sed -i ${txt} "s#installPath.*#installPath=${installPath}#g" conf/config/install_config.conf
sed -i ${txt} "s#deployUser.*#deployUser=${deployUser}#g" conf/config/install_config.conf
sed -i ${txt} "s#ips.*#ips=${ips}#g" conf/config/install_config.conf


sed -i ${txt} "s#masters.*#masters=${masters}#g" conf/config/run_config.conf
sed -i ${txt} "s#workers.*#workers=${workers}#g" conf/config/run_config.conf
sed -i ${txt} "s#alertServer.*#alertServer=${alertServer}#g" conf/config/run_config.conf
sed -i ${txt} "s#apiServers.*#apiServers=${apiServers}#g" conf/config/run_config.conf
309 310 311 312 313 314


# 2,创建目录
echo "2,创建目录"

if [ ! -d $installPath ];then
D
dailidong 已提交
315 316
  sudo mkdir -p $installPath
  sudo chown -R $deployUser:$deployUser $installPath
317 318
fi

D
dailidong 已提交
319 320
hostsArr=(${ips//,/ })
for host in ${hostsArr[@]}
321 322
do

D
dailidong 已提交
323 324 325
# 如果programPath不存在,则创建
if ! ssh $host test -e $programPath; then
  ssh $host "sudo mkdir -p $programPath;sudo chown -R $deployUser:$deployUser $programPath"
326 327 328 329
fi

# 如果downloadPath不存在,则创建
if ! ssh $host test -e $downloadPath; then
D
dailidong 已提交
330
  ssh $host "sudo mkdir -p $downloadPath;sudo chown -R $deployUser:$deployUser $downloadPath"
331 332 333 334
fi

# 如果$execPath不存在,则创建
if ! ssh $host test -e $execPath; then
D
dailidong 已提交
335
  ssh $host "sudo mkdir -p $execPath; sudo chown -R $deployUser:$deployUser $execPath"
336 337 338 339
fi

# 如果$xlsFilePath不存在,则创建
if ! ssh $host test -e $xlsFilePath; then
D
dailidong 已提交
340
  ssh $host "sudo mkdir -p $xlsFilePath; sudo chown -R $deployUser:$deployUser $xlsFilePath"
341 342 343 344 345 346 347
fi

done


# 3,停止服务
echo "3,停止服务"
D
dailidong 已提交
348
sh ${workDir}/script/stop_all.sh
349 350 351 352

# 4,删除zk节点
echo "4,删除zk节点"
sleep 1
D
dailidong 已提交
353
python ${workDir}/script/del_zk_node.py $zkQuorum $zkRoot
354 355 356

# 5,scp资源
echo "5,scp资源"
D
dailidong 已提交
357
sh ${workDir}/script/scp_hosts.sh
358 359 360 361 362 363 364 365 366 367
if [ $? -eq 0 ]
then
	echo 'scp拷贝完成'
else
	echo 'sc 拷贝失败退出'
	exit -1
fi

# 6,启动
echo "6,启动"
journey2018's avatar
journey2018 已提交
368
sh ${workDir}/script/start_all.sh
L
ligang 已提交
369 370

# 7启动自启动脚本
L
ligang 已提交
371
monitor_pid=${workDir}/monitor_server.pid
L
ligang 已提交
372
if [ "true" = $monitorServerState ];then
L
ligang 已提交
373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
        if [ -f $monitor_pid ]; then
                TARGET_PID=`cat $monitor_pid`
                if kill -0 $TARGET_PID > /dev/null 2>&1; then
                        echo "monitor server running as process ${TARGET_PID}.Stopping"
                        kill $TARGET_PID
                        sleep 5
                        if kill -0 $TARGET_PID > /dev/null 2>&1; then
                                echo "$command did not stop gracefully after 5 seconds: killing with kill -9"
                                kill -9 $TARGET_PID
                        fi
                else
                        echo "no monitor server to stop"
                fi
                echo "monitor server running as process ${TARGET_PID}.Stopped success"
                rm -f $monitor_pid
        fi
        nohup python -u ${workDir}/script/monitor_server.py $installPath $zkQuorum $zkMasters $zkWorkers > ${workDir}/monitor_server
.log 2>&1 &
        echo $! > $monitor_pid
        echo "start monitor server success as process `cat $monitor_pid`"

L
ligang 已提交
394 395
fi