- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
本文主要介绍Azkaban的安装部署,文中文中使用到的软件版本:Azkaban 3.90.0、MySQL 5.7、Centos 7。
Azkaban是由Linkedin公司推出的一个批量工作流任务调度器,主要用于在一个工作流内以一个特定的顺序运行一组工作和流程,它的配置是通过简单的key:value对的方式,通过配置中的dependencies 来设置依赖关系。Azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
Azkaban由三个关键组件构成:
1、 AzkabanWebServer:AzkabanWebServer是整个Azkaban工作流系统的主要管理者,它负责用户登录认证、project管理、定时执行工作流、跟踪工作流执行进度等一系列任务;
2、 AzkabanExecutorServer:负责具体的工作流的提交、执行,它们通过mysql数据库来协调任务的执行;
3、 关系型数据库(MySQL):存储大部分执行流状态,AzkabanWebServer和AzkabanExecutorServer都需要访问数据库;
在3.0后,Azkaban提供了两种部署模式:
DB使用的是一个内嵌的H2,Web Server和Executor Server运行在同一个进程里。这种模式包含Azkaban的所有特性,但一般用来学习和测试,也可以用于小的应用。
DB使用的是MySQL,MySQL最好使用master-slave架构,Web Server和Executor Server运行在不同机器上,且有多个Executor Server;这为Azkaban提供了很强的扩展性。
下载地址:https://github.com/azkaban/azkaban/releases
tar zxvf azkaban-3.90.0.tar.gz
修改build.gradle中maven地址为阿里云仓库,不然下载jar包会很慢。
buildscript {
repositories {
//mavenCentral()
//maven {
//url 'https://plugins.gradle.org/m2/'
//}
maven {
url 'https://maven.aliyun.com/repository/gradle-plugin'
}
}
allprojects {
apply plugin: 'jacoco'
repositories {
//mavenCentral()
//mavenLocal()
maven {
url 'https://maven.aliyun.com/repository/gradle-plugin'
}
}
}
进入解压的目录(/home/hadoop/app/azkaban-3.90.0),执行:
# Build Azkaban
./gradlew build
# Clean the build
./gradlew clean
# Build and install distributions
./gradlew installDist
# Run tests
./gradlew test
# Build without running tests
./gradlew build -x test
在执行./gradlew build时,大概执行到58%时会卡住,Ctrl+c后在重新执行成功了。
在执行这命令时偶尔会出现超时错误,导致命令执行失败(failed);可以重新执行命令。
编译完成后,进入/home/hadoop/app/azkaban-3.90.0/azkaban-solo-server/build/install/azkaban-solo-server目录
conf/azkaban.properties:
#default.timezone.id=America/Los_Angeles
default.timezone.id=Asia/Shanghai
bin/start-solo.sh
停止命令:
bin/shutdown-solo.sh
http://10.49.196.10:8081/ (azkaban/azkaban)
用户可以在conf/azkaban-users.xml文件中配置。
在/home/hadoop/app/azkaban-3.90.0/azkaban-solo-server/build/distributions目录下有部署包可以copy到其他地方部署。
假设Mysql已经安装完成,这里只考虑Web Server和Executor Server;源代码的编译在10.49.196.10上,目录为/home/hadoop/app/azkaban-3.90.0。
10.49.196.10 | Web Server |
10.49.196.11 | Executor Server |
10.49.196.12 | Executor Server |
mysql> CREATE DATABASE azkaban;
然后在azkaban库中执行/home/hadoop/app/azkaban-3.90.0/azkaban-db/build/install/azkaban-db/create-all-sql-0.1.0-SNAPSHOT.sql脚本
从10.49.196.10上拷贝部署包到10.49.196.11上
cd /home/hadoop/app/azkaban-3.90.0/azkaban-exec-server/build/distributions
scp ./azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz hadoop@10.49.196.11:/home/hadoop/app
cd /home/hadoop/app
tar zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
修改conf/azkaban.properties文件:
#default.timezone.id=America/Los_Angeles
default.timezone.id=Asia/Shanghai
azkaban.webserver.url=http://10.49.196.10:8081
mysql.port=3306
mysql.host=10.49.196.10
mysql.database=azkaban
mysql.user=root
mysql.password=123
executor.port=9000#设置启动端口,不然每次会随机生成一个端口
启动:
bin/start-exec.sh
启动完之后,还需要激活:
curl -G "localhost:9000/executor?action=activate" && echo
10、 49.196.12上的部署与10.49.196.11类似的操作步骤;或者直接把10.49.196.11上的部署目录直接拷贝到10.49.196.12上;
可以直接使用10.49.196.10上编译好的部署目录/home/hadoop/app/azkaban-3.90.0/azkaban-web-server/build/install/azkaban-web-server
a、修改/etc/hosts文件,设置Executor Server主机的主机名和ip的对应关系:
10.49.196.11 pxc2
10.49.196.12 pxc3
b、修改conf/azkaban.properties文件:
#default.timezone.id=America/Los_Angeles
default.timezone.id=Asia/Shanghai
mysql.port=3306
mysql.host=10.49.196.10
mysql.database=azkaban
mysql.user=root
mysql.password=123
c、启动:
bin/start-web.sh
http://10.49.196.10:8081/
用户名密码为:azkaban/azkaban 用户可用在conf/azkaban-users.xml中配置。
一定要先启动Exector Server,再启动Web Server;如果有Exector Server需要重启,Web Server也需要重启以同步Exector Server信息。
a、job不执行
WebServer控制提示如下信息:
2020/10/22 10:24:02.453 +0800 INFO [ExecutorManager] [AzkabanWebServer-QueueProcessor-Thread] [Azkaban] Reached handleNoExecutorSelectedCase stage for exec 124 with error count 0
可能原因:
MinimumFreeMemory过滤器会检查executor主机空余内存是否会大于6G,如果不足6G,则web-server不会将任务交由该主机执行。
处理方法:
修改conf/azkaban.properties文件,去除MinimumFreeMemory过滤器
#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
b、Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job second
Azkaban控制台Job Logs报如下错误:
原因:
azkaban要求执行主机可用内存必须大于3G才能满足执行任务的条件。
处理方法:
Executor Server部署目录下plugins/jobtypes/commonprivate.properties文件增加:
memCheck.enabled=false
c、Failed to assign non-existent executor Id: xxx to execution : yyy
WebServer后台报:
2020/10/22 10:45:47.047 +0800 WARN [ExecutorManager] [AzkabanWebServer-QueueProcessor-Thread] [Azkaban] Executor pxc2:9000 (id: 12), active=true responded with exception for exec: 131
azkaban.executor.ExecutorManagerException: Failed to assign non-existent executor Id: 12 to execution : 131
at azkaban.executor.AssignExecutorDao.assignExecutor(AssignExecutorDao.java:43)
at azkaban.executor.JdbcExecutorLoader.assignExecutor(JdbcExecutorLoader.java:331)
at azkaban.executor.ExecutorManager.dispatch(ExecutorManager.java:1059)
at azkaban.executor.ExecutorManager.access$500(ExecutorManager.java:69)
at azkaban.executor.ExecutorManager$QueueProcessorThread.selectExecutorAndDispatchFlow(ExecutorManager.java:1238)
at azkaban.executor.ExecutorManager$QueueProcessorThread.processQueuedFlows(ExecutorManager.java:1210)
at azkaban.executor.ExecutorManager$QueueProcessorThread.run(ExecutorManager.java:1148)
原因:
重启Executor后,它的id会变化(自增),导致Web Server根据缓存的id找不到Executor。
处理方法:
Executor Server重启后,Web Server也重启下。
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!