安装Azkaban
Azkaban 是由 Linkedin 开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban 定义了一种 KV 文件格式来建立任务之间的依赖关系,并提供一个易于使用的 web 用户界面维护和跟踪你的工作流。
Azkaban 官网地址:http://azkaban.github.io/ Azkaban 的下载地址:http://azkaban.github.io/downloads.html
Azkaban 包括三个关键组件:
关系数据库:使用 Mysql数据库,主要用于保存流程、权限、任务状态、任务计划等信息。
AzkabanWebServer:为用户提供管理留存、任务计划、权限等功能。
AzkabanExecutorServer:执行任务,并把任务执行的输出日志保存到 Mysql;可以同时启动多个 AzkabanExecutorServer ,他们通过 mysql 获取流程状态来协调工作。
在 2.5 版本之后,Azkaban 提供了两种模式来安装:
一种是 standalone 的 “solo-server” 模式;
另一种是两个 server 的模式,分别为 AzkabanWebServer 和 AzkabanExecutorServer。
这里主要介绍第二种模式的安装方法。
1. 安装过程
1.1 安装 MySql
目前 Azkaban 只支持 MySql ,故需安装 MySql 服务器,安装 MySql 的过程这里不作介绍。
安装之后,创建 azkaban 数据库,并创建 azkaban 用户,密码为 azkaban,并设置权限。
# Example database creation command, although the db name doesn't need to be 'azkaban'
mysql> CREATE DATABASE azkaban;
# Example database creation command. The user name doesn't need to be 'azkaban'
mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
# Replace db, username with the ones created by the previous steps.
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
修改 /etc/my.cnf 文件,设置 max_allowed_packet 值:
[mysqld]
...
max_allowed_packet=1024M
然后重启 MySql。
解压缩 azkaban-sql-2.5.0.tar.gz文件,并进入到 azkaban-sql-script目录,然后进入 mysql 命令行模式:
$ mysql -uazkaban -pazkaban
mysql> use azkaban
mysql> source create-all-sql-2.5.0.sql
1.2 安装 azkaban-web-server
解压缩 azkaban-web-server-2.5.0.tar.gz,创建 SSL 配置,命令:keytool -keystore keystore -alias jetty -genkey -keyalg RSA
完成上述工作后,将在当前目录生成 keystore 证书文件,将 keystore 考贝到 azkaban web 目录中。
修改 azkaban web 服务器配置,主要包括:
a. 修改时区和首页名称:
# Azkaban Personalization Settings
azkaban.name=ETL Task
azkaban.label=By BI
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai
b. 修改 MySql 数据库配置
database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
c. 修改 Jetty 服务器属性,包括 keystore 的相关配置
# Azkaban Jetty server properties.
jetty.hostname=0.0.0.0
jetty.maxThreads=25
jetty.ssl.port=8443
jetty.port=8081
jetty.keystore=keystore
jetty.password=redhat
jetty.keypassword=redhat
jetty.truststore=keystore
jetty.trustpassword=redhat
d. 修改邮件设置(可选)
# mail settings
mail.sender=admin@javachen.com
mail.host=javachen.com
mail.user=admin
mail.password=admin
1.3 安装 azkaban-executor-server
解压缩 azkaban-executor-server-2.5.0.tar.gz,然后修改配置文件,包括:
a. 修改时区为:default.timezone.id=Asia/Shanghai
b. 修改 MySql 数据库配置
database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
1.4 用户设置
进入 azkaban web 服务器 conf 目录,修改 azkaban-users.xml ,增加管理员用户:
<azkaban-users>
<user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
<user username="metrics" password="metrics" roles="metrics"/>
<user username="admin" password="admin" roles="admin,metrics" />
<role name="admin" permissions="ADMIN" />
<role name="metrics" permissions="METRICS"/>
</azkaban-users>
1.5 启动服务
azkaban-web-server,需要在 azkaban-web-server 目录下执行下面命令:
sh bin/azkaban-web-start.sh
azkaban-executor-server,需要在 azkaban-executor-server 目录下执行下面命令:
sh bin/azkaban-executor-start.sh
1.6 配置插件
下载 HDFS Browser 插件,解压然后重命名为 hdfs,然后将其拷贝到 azkaban-web-server/plugins/viewer 目录下。
下载 Job Types Plugins 插件,解压然后重命名为 jobtype,然后将其拷贝到 azkaban-executor-server/plugins/ 目录下,然后修改以下文件,设置 hive.home:
plugins/jobtypes/commonprivate.properties
plugins/jobtypes/common.properties
plugins/jobtypes/hive/plugin.properties
说明:
在实际使用中,这些插件都没有配置成功,故最后的生产环境没有使用这些插件,而是基于最基本的 command 或 script 方式来编写作业。
1.7 生产环境使用
这部分内容详细说明见 当前数据仓库建设过程 一文中的任务调度这一章节内容。
工作流调度器Azkaban的安装配置
Azkaban安装部署
准备工作
Azkaban Web服务器
azkaban-web-server-2.5.0.tar.gz
Azkaban执行服务器
azkaban-executor-server-2.5.0.tar.gz
MySQL
目前azkaban只支持 mysql,需安装mysql服务器,本文档中默认已安装好mysql服务器,并建立了 root用户,密码root.
下载地址:http://azkaban.github.io/downloads.html
安装
将安装文件上传到集群,最好上传到安装 hive、sqoop的机器上,方便命令的执行
在当前用户目录下新建 azkabantools目录,用于存放源安装文件.新建azkaban目录,用于存放azkaban运行程序
azkaban web服务器安装
解压azkaban-web-server-2.5.0.tar.gz
命令: tar –zxvf azkaban-web-server-2.5.0.tar.gz
将解压后的azkaban-web-server-2.5.0 移动到 azkaban目录中,并重新命名 webserver
命令: mv azkaban-web-server-2.5.0 ../azkaban
cd ../azkaban
mv azkaban-web-server-2.5.0 server
azkaban 执行服器安装
解压azkaban-executor-server-2.5.0.tar.gz
命令:tar –zxvf azkaban-executor-server-2.5.0.tar.gz
将解压后的azkaban-executor-server-2.5.0 移动到azkaban目录中,并重新命名 executor
命令:mv azkaban-executor-server-2.5.0 ../azkaban
cd ../azkaban
mv azkaban-executor-server-2.5.0 executor
azkaban脚本导入
解压: azkaban-sql-script-2.5.0.tar.gz
命令:tar –zxvf azkaban-sql-script-2.5.0.tar.gz
将解压后的mysql 脚本,导入到mysql中:
进入mysql
mysql> create database azkaban;
mysql> use azkaban;
mysql> source /home/hadoop/azkaban-2.5.0/create-all-sql-2.5.0.sql;
创建SSL配置
参考地址: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL
命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA
运行此命令后,会提示输入当前生成 keystor的密码及相应信息,输入的密码请劳记,信息如下:
输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
[Unknown]:
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的州或省份名称是什么?
[Unknown]:
该单位的两字母国家代码是什么
[Unknown]: CN
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正确吗?
[否]: y
输入<jetty>的主密码
(如果和 keystore 密码相同,按回车):
再次输入新密码:
完成上述工作后,将在当前目录生成 keystore 证书文件,将keystore 考贝到 azkaban web服务器根目录中.如:cp keystore azkaban/server
配置文件
注:先配置好服务器节点上的时区
先生成时区配置文件Asia/Shanghai,用交互式命令 tzselect 即可
拷贝该时区文件,覆盖系统本地时区配置
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
azkaban web服务器配置
进入azkaban web服务器安装目录 conf目录
修改azkaban.properties文件
命令vi azkaban.properties
内容说明如下:
#Azkaban Personalization Settings
azkaban.name=Test #服务器UI名称,用于服务器上方显示的名字
azkaban.label=My Local Azkaban #描述
azkaban.color=#FF3601 #UI颜色
azkaban.default.servlet.path=/index #
web.resource.dir=web/ #默认根web目录
default.timezone.id=Asia/Shanghai #默认时区,已改为亚洲/上海 默认为美国
#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager #用户权限管理默认类
user.manager.xml.file=conf/azkaban-users.xml #用户配置,具体配置参加下文
#Loader for projects
executor.global.properties=conf/global.properties # global配置文件所在位置
azkaban.project.dir=projects #
database.type=mysql #数据库类型
mysql.port=3306 #端口号
mysql.host=localhost #数据库连接IP
mysql.database=azkaban #数据库实例名
mysql.user=root #数据库用户名
mysql.password=root #数据库密码
mysql.numconnections=100 #最大连接数
# Velocity dev mode
velocity.dev.mode=false
# Jetty服务器属性.
jetty.maxThreads=25 #最大线程数
jetty.ssl.port=8443 #Jetty SSL端口
jetty.port=8081 #Jetty端口
jetty.keystore=keystore #SSL文件名
jetty.password=123456 #SSL文件密码
jetty.keypassword=123456 #Jetty主密码 与 keystore文件相同
jetty.truststore=keystore #SSL文件名
jetty.trustpassword=123456 # SSL文件密码
# 执行服务器属性
executor.port=12321 #执行服务器端口
# 邮件设置
mail.sender=chenguibin2004@126.com #发送邮箱
mail.host=smtp.126.com #发送邮箱smtp地址
mail.user=chenguibin #发送邮件时显示的名称
mail.password=********** #邮箱密码
job.failure.email=xxxxxxxx@163.com #任务失败时发送邮件的地址
job.success.email=xxxxxxxx@163.com #任务成功时发送邮件的地址
lockdown.create.projects=false #
cache.directory=cache #缓存目录
用户配置
进入azkaban web服务器conf目录,修改azkaban-users.xml
vi azkaban-users.xml 增加 管理员用户
<azkaban-users>
<user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
<user username="metrics" password="metrics roles="metrics"/>
<user username="admin" password="admin" roles="admin,metrics" />
<role name="admin" permissions="ADMIN" />
<role name="metrics" permissions="METRICS"/>
</azkaban-users>
azkaban 执行服务器executor配置
进入执行服务器安装目录conf,修改azkaban.properties
vi azkaban.properties
#Azkaban
default.timezone.id=Asia/Shanghai #时区
# Azkaban JobTypes 插件配置
azkaban.jobtype.plugin.dir=plugins/jobtypes #jobtype 插件所在位置
#Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
#数据库设置
database.type=mysql #数据库类型(目前只支持mysql)
mysql.port=3306 #数据库端口号
mysql.host=192.168.20.200 #数据库IP地址
mysql.database=azkaban #数据库实例名
mysql.user=azkaban #数据库用户名
mysql.password=oracle #数据库密码
mysql.numconnections=100 #最大连接数
# 执行服务器配置
executor.maxThreads=50 #最大线程数
executor.port=12321 #端口号(如修改,请与web服务中一致)
executor.flow.threads=30 #线程数
启动
web服务器
在azkaban web服务器目录下执行启动命令
bin/azkaban-web-start.sh
注:在web服务器根目录运行
或者启动到后台
nohup bin/azkaban-web-start.sh 1>/tmp/azstd.out 2>/tmp/azerr.out &
执行服务器
在执行服务器目录下执行启动命令
nohup bin/azkaban-executor-start.sh 1>/tmp/azstd.out 2>/tmp/azerr.out &
注:只能要执行服务器根目录运行
启动完成后,在浏览器(建议使用谷歌浏览器)中输入https://服务器IP地址:8443 ,即可访问azkaban服务了.在登录中输入刚才新的户用名及密码,点击 login.
本文转自 ChinaUnicom110 51CTO博客,原文链接:http://blog.51cto.com/xingyue2011/1969814
BigMemroy系列文章--10.BigMemory监控系统(TMC)搭建
转载请注明出处哈:http://carlosfu.iteye.com/blog/2237511
一、TMC(Terracotta Management Console)简介:
BigMemory提供了一套监控和管理系统,来管理Bigmemory Go或者BigMemory Max,通过这个系统可以有效的观察数据,管理数据,动态修改配置。
二、TMC实现原理浅析:
从上图中,可以看出:
1. 每个BigMemory内置了http容器(可能是jetty), 对外提供Rest api来管理查询BigMemory数据和配置。
2. 如果使用BigMemory max(分布式集群版本), 应该还有个中间层作为统一管理
3. TMC是一个web项目,调用Rest API收集Bigmemory数据、管理Bigmemory配置。
三、TMC安装:
(由于集群版是收费的,只讨论Bigmemory Go)
1. BigMemory使用端:
通过ehcache.xml或者java代码的方式添加ManageService, 以xml配置为例,添加:
<managementRESTService enabled="true" bind="0.0.0.0:7979"/>
(1) 0.0.0.0 说明不限制ip, 通过本机ip就可以访问
(2) 7979是容器的端口
2. Windows安装、启动TMC
(1) 添加证书到**\management-console目录下。(从官方下载的安装包下)
(2) 启动:\management-console\bin> .\start-tmc.bat (自带的jetty默认端口是9889)
访问http://localhost:9889/tmc/#
第一次启动,会让选择是否需要做安全验证(因为涉及到了清理数据,修改配置等操作),为了方便以及对于内网的信任,选择忽略
设置完成后,要求重新启动服务器
(3) 添加connection到BigMemory(此时和管理mysql的工具有些类似了)
(4) 管理节点(查看数据、管理数据、查看配置,管理配置等等)
3. linux安装、启动TMC
同2,(2)启动的是start-tmc.sh
四、TMC使用问题:
1. 版本问题: 由于bigmemory 4.2和之前版本使用不同的api, 所以bigmemory使用端和tmc必须是同一个版本bigmemory证书。
2. 证书一致: 两边的证书,以及证书和bigmemory的版本必须一致。
3. 虽然BigMemory Max和BigMemory Go下载的压缩包不太相同,但是tmc应该一致的。
杂谈X509证书, Java Keystore与Jetty
很多人对JSSE组成部分的Key Tool 工具不太明白,希望本文能有帮助
科班出身的同学应该学过课程“密码学”, 这门课详细解释了现代对称加密的算法原理, 当时学的我云里雾里。 直到现在使用过SSL加密才知道工程上用法是这样的, 老师讲的时候就不能带一点工程实践吗? 简单来说,对称加密体系就是我有一段需要加密的字符, 我用私钥加密之后变成了无意义的密文, 只有用配对的公钥才能对这个密文进行解密还原回来。
下图是个简单的示意,注意由于公私钥是配对的,一般给信息加密的人持有此密钥对。
这套机制可以应用在网络上电子商务常用的可信任站点的证书 验证上,因为电子商务站点经常涉及到交易,所以客户需要知道这个电子商务网站是真的,可信任的, 而不是一个一摸一样的伪造网站,来钓鱼骗你账户和密码的。
简单说一下这个证书验证的过程:
点击一个https的网站
浏览器开始建立ssl连接
浏览器请求该网站证书,该证书主要包含了公钥,及网站用私钥加密证书内容后的签名数据
浏览器用公钥解密签名数据,验证该证书完整性
浏览器根据签名者的名字验证证书链,反复进行直到匹配到了浏览器内自带的可信任根CA机构
为了更直观点, 以下是用java程序取出来的Google的证书,主要的内容包括:
版本(Version),主题(Subject),签名算法(Signature Algorithm),有效日期(Validity),认证机构(Issuer),序列号(SerialNumber),公钥信息(Key)
1
2
3
4
5
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
[
[
Version: V3
Subject: CN=www.google.com, O=Google Inc, L=Mountain View, ST=California, C=US
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
Key: Sun RSA public key, 2048 bits
modulus: 21234013066307499395457251007591480564049457586531682634102688105320414778844675214782297227108785101225473929899552731501456168053582903590770359069026387607503146650068399613049641154687616403518890644657095548686866113952705014503928651307072537712940705497213473591529858208623561782445051685850298532560404133534066309955969883121384862800482489711770827176592928627367189401567119209235611091403472756628910838905587679781334745044724147912894428457975079919303874339456674143408932927112368761924943362190459243823969871830702191962312600960355323190050761278795233954274164962425829947843114462063705745562381
public exponent: 65537
Validity: [From: Wed Jul 02 21:38:55 CST 2014,
To: Tue Sep 30 08:00:00 CST 2014]
Issuer: CN=Google Internet Authority G2, O=Google Inc, C=US
SerialNumber: [ 5b7fd907 7ce7148c]
Certificate Extensions: 8
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
[
accessMethod: caIssuers
accessLocation: URIName: http://pki.google.com/GIAG2.crt
,
accessMethod: ocsp
accessLocation: URIName: http://clients1.google.com/ocsp
]
]
[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 4A DD 06 16 1B BC F6 68 B5 76 F5 81 B6 BB 62 1A J......h.v....b.
0010: BA 5A 81 2F .Z./
]
]
[3]: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:false
PathLen: undefined
]
[4]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: http://pki.google.com/GIAG2.crl]
]]
[5]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [1.3.6.1.4.1.11129.2.5.1]
[] ]
]
[6]: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
serverAuth
clientAuth
]
[7]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: www.google.com
]
[8]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 79 DF 1E A5 4C 46 0D 45 EE 18 41 68 F0 83 CA 4F y...LF.E..Ah...O
0010: C7 2C B4 C2 .,..
]
]
]
Algorithm: [SHA1withRSA]
Signature:
0000: 7E B3 33 11 DC 10 16 C2 99 A0 53 BD 24 03 4D 79 ..3.......S.$.My
0010: 92 A5 15 61 F1 4E C6 F6 C5 10 BB D0 8D 70 F6 53 ...a.N.......p.S
0020: AA FE 25 EA 33 39 2F 9C DA C2 69 94 A4 34 1D 57 ..%.39/...i..4.W
0030: A7 E4 D5 75 94 03 8B 61 86 2A A6 82 FA C9 43 37 ...u...a.*....C7
0040: 28 28 F6 3F 0E DA 88 42 74 2E 79 0C 3E D1 4E 2A ((.?...Bt.y.>.N*
0050: C7 25 D7 E1 44 1A 30 D1 C6 33 F4 E4 4E 5E B7 78 .%..D.0..3..N^.x
0060: C3 1D C2 BE 47 0E 3D D3 CF 09 74 5C 7F 84 C8 55 ....G.=...t\...U
0070: EA B0 00 A2 7B CA D2 7A B3 03 1D 22 AB 64 D1 F6 .......z...".d..
0080: 78 5F 16 D2 54 7D 48 9A 6B 27 FD 2F BD 00 1F 0A x_..T.H.k'./....
0090: A8 00 7B CF 7B B8 F0 32 7A 25 1E 6A 6B B2 A1 69 .......2z%.jk..i
00A0: 62 1B B6 C0 6D 52 6A D8 C6 C8 C3 68 C8 28 D5 75 b...mRj....h.(.u
00B0: 66 C9 66 12 CB A5 0F 68 39 3D D5 32 90 ED 13 5B f.f....h9=.2...[
00C0: C8 5A 89 EB FA 74 B7 F7 EC FB AB A2 8C 84 BF 75 .Z...t.........u
00D0: 2A D0 23 36 DD 5B C3 1A DB D9 06 94 C0 23 BC 44 *.#6.[.......#.D
00E0: F2 F3 9A B0 FB 85 1D F0 48 25 2A 3B B9 9B 02 DE ........H%*;....
00F0: 4B 17 4F 63 7A 66 0F 7E 3B 03 31 81 86 AA 57 5D K.Oczf..;.1...W]
]
关于这些信息的更详细解释可以看规范RFC3280 , http://www.ietf.org/rfc/rfc3280.txt ,这里就不扯得太远了。上面的信息跟下面规范里的信息是一一对应的
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version MUST be v3
}
操作系统在出厂的时候已经预装了CA的可信任证书,浏览器在通过证书拿到证书链后,最终都会追溯到一个根路径与操作系统自带的出厂CA可信证书进行比对,如果成功了证明是可信任的证书。Chrome在windows系统下直接用windows系统自带root证书进行验证, 而Firefox则自己带了一套可信证书,不与操作系统共用。
经过上面的解释,大家直到JDK为什么要弄一个keytool工具了, 这个工具就是用来生成key store文件的,这个文件保存了两种entry,一种是公私钥对(key entries), 一种是公钥证书(trusted certificate entries), 前者由于涉及到私钥,保密要求更高。 key store 文件保存了java版的可信任证书,Java 的SSL客户端要进行SSL握手时需要从对方证书的签名者追溯到自己的可信任机构, 就是跟此文件中保存的CA证书进行比对。
下面语句可以建一个keystore 并且生成一个公私钥对,并把公钥生成为公钥证书:
keytool -genkey -alias duke -keypass dukekeypasswd
导入证书语句如下:
keytool -import -alias abc -file ABCCA.cer
Java程序在SSL连接建立相关操作时都需要操作这个key store文件,来取得自己的私钥或者拿自己信任的证书,简单流程如下:
以上讲的是客户端的流程,下面看一下Java的web服务器Jetty的一些这方面的设置,同样,Jetty也需要一个这个文件,就保存在Jetty目录的/etc/keystore中。
再看下Jetty 9 的ssl配置文件Jetty-ssl.xml:
<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory"><Set name="KeyStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.keystore" default="etc/keystore"/></Set><Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set><Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="OBF:1u2u1wml1z7s1z7a1wnl1u2g"/></Set><Set name="TrustStorePath"><Property name="jetty.home" default="." />/<Property name="jetty.truststore" default="etc/keystore"/></Set><Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"/></Set><Set name="EndpointIdentificationAlgorithm"></Set>
明确指明了keystore和truststore文件的路径,其实就是同一个名为keystore的文件, 并指明了密码,下面我们用他的密码看一下keystore中保存了什么,但Jetty的这个密码如果是OBF开头的则说明密码被混淆过,运行
target git:(master) java -cp jetty-util-9.2.2-SNAPSHOT.jar org.eclipse.jetty.util.security.Password OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
2014-07-17 21:08:19.241:INFO::main: Logging initialized @57ms
storepwd
OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
MD5:841aa4ca19e9fe3010369a60781c7630
得到这个keystore的实际明文密码 storepwd,然后到jetty/etc目录下查看Jetty的keystore文件中都存了什么证书:
keytool -list -keystore keystore -storepass storepwd -v
etc git:(master) keytool -list -keystore keystore -storepass storepwd -v
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: jetty
创建日期: 2008-11-7
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=jetty.mortbay.org, OU=Jetty, O=Mort Bay Consulting Pty Ltd, L=Unknown, ST=Unknown, C=Unknown
发布者: CN=jetty.mortbay.org, OU=Jetty, O=Mort Bay Consulting Pty Ltd, L=Unknown, ST=Unknown, C=Unknown
序列号: 4913c3f4
有效期开始日期: Fri Nov 07 12:28:36 CST 2008, 截止日期: Tue Mar 25 12:28:36 CST 2036
证书指纹:
MD5: 59:80:DB:FA:2F:9D:5C:87:88:1B:9A:9F:BF:FA:DE:92
SHA1: 66:62:5A:2B:2F:96:E1:88:E7:27:19:E0:0E:C6:60:B0:FC:86:B2:64
SHA256: 3D:75:8E:56:77:42:01:C7:D3:C3:E9:DF:8C:1B:21:03:19:70:78:A9:27:9E:F1:E4:78:B9:73:F5:F6:CA:EF:C2
签名算法名称: MD5withRSA
版本: 1
*******************************************
*******************************************
Jetty 9的 中,部分组装SSLConext的代码如下:
KeyStore keyStore = loadKeyStore();
KeyStore trustStore = loadTrustStore();
KeyManager[] keyManagers = getKeyManagers(keyStore);
TrustManager[] trustManagers = getTrustManagers(trustStore,crls);
SecureRandom secureRandom = (_secureRandomAlgorithm == null)?null:SecureRandom.getInstance(_secureRandomAlgorithm);
SSLContext context = _sslProvider == null ? SSLContext.getInstance(_sslProtocol) : SSLContext.getInstance(_sslProtocol,_sslProvider);
context.init(keyManagers,trustManagers,secureRandom);
_context = context; //组装好context
//下面是用context组装SSLServerSocketFactory
SSLServerSocketFactory factory = _context.getServerSocketFactory();
SSLServerSocket socket =
(SSLServerSocket) (host==null ?
factory.createServerSocket(port,backlog):
factory.createServerSocket(port,backlog,InetAddress.getByName(host)));
if (getWantClientAuth())
socket.setWantClientAuth(getWantClientAuth());
if (getNeedClientAuth())
socket.setNeedClientAuth(getNeedClientAuth());
socket.setEnabledCipherSuites(selectCipherSuites(
socket.getEnabledCipherSuites(),
socket.getSupportedCipherSuites()));
socket.setEnabledProtocols(selectProtocols(socket.getEnabledProtocols(),socket.getSupportedProtocols())); return socket;
SSLContext构建需要keyManager 和trustManager,Manager来自 keystore文件中保存的Entries。
本文出自 “祝坤荣” 博客,请务必保留此出处
Android or java https ssl exception
详细分析Android及Java中访问https请求exception(SSLHandshakeException, SSLPeerUnverifiedException)的原因及解决方法。1、现象
用Android(或Java)测试程序访问下面两个链接。
https链接一:web服务器为jetty,后台语言为java。
https链接二:web服务器为nginx,后台语言为php。
链接一能正常访问,访问链接二报异常,且用HttpURLConnection和apache的HttpClient两种不同的api访问异常信息不同,具体如下:
(1) 用HttpURLConnection访问,测试代码如下:
HttpURLConnection访问https
异常信息为:
1
javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
(2) 用apache的HttpClient访问,测试代码如下:
HttpClient访问https
异常信息为:
1
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
2、原因分析
需要快速寻求答案的可直接看第3部分 解决方式,这部分详细分析原因。
google发现stackoverflow上不少人反应,twitter和新浪微博的api也会报这个异常,不少人反映客户端需要导入证书,其实大可不必,如果要导证书的话,用户不得哭了。。
从上面的情况可以看出,用jetty做为容器是能正常访问的,只是当容器为nginx时才会异常。
配合后台开发调试了很久,开始以为是cipher suite的问题,为此特地把
ssl_ciphers EDH-RSA-DES-CBC3-SHA;
加入了nginx的配置中,后来发现依然无效。stackoverflow发现,如下代码是能正常访问上面异常的https url
HttpURLConnection访问https并相信所有证书
可以看出其中与之前的HttpsURLConnection测试代码主要的不同就是加入了
1
trustAllHosts();
和
1
https.setHostnameVerifier(DO_NOT_VERIFY);
表示相信所有证书,并且所有host name验证返回true,这样就能定位到之前的异常是证书验证不通过的问题了。
在上面checkServerTrusted函数中添加断点,查看X509Certificate[] chain的值,即证书信息,发现访问两个不同链接X509Certificate[] chain值有所区别,nginx传过来证书信息缺少了startssl 的ca证书,证书如下:
至此原因大白:android的证书库里已经带了startssl ca证书,而nginx默认不带startssl ca证书,这样android端访问nginx为容器的https url校验就会失败,jetty默认带startssl ca证书,所以正常。
PS:后来对windows和mac下java访问https也做了测试,发现mac上的jdk缺省不带startssl ca证书所以能访问通过,而加上startssl ca证书后同android一样访问不通过。而windows上的jdk缺省带startssl ca证书同android一样访问失败。
3、解决方式
上面的分析中已经介绍了一种解决方法即客户端相信所有证书,不过这种方式只是规避了问题,同时也给客户端带来了风险,比较合适的解决方式是为nginx添加startssl ca证书,添加方法如下:
First, use the StartSSL™ Control Panel to create a private key and certificate and transfer them to your server. Then execute the following steps (if you use a class 2 certificate replace class1 by class2 in the instructions below):
Decrypt the private key by using the password you entered when you created your key:
openssl rsa -in ssl.key -out /etc/nginx/conf/ssl.key
Alternatively you can also use the Tool Box decryption tool of your StartSSL™ account.
Protect your key from prying eyes:
chmod 600 /etc/nginx/conf/ssl.key
Fetch the Root CA and Class 1 Intermediate Server CA certificates:
wget http://www.startssl.com/certs/ca.pem
wget http://www.startssl.com/certs/sub.class1.server.ca.pem
Create a unified certificate from your certificate and the CA certificates:
cat ssl.crt sub.class1.server.ca.pem ca.pem > /etc/nginx/conf/ssl-unified.crt
Configure your nginx server to use the new key and certificate (in the global settings or a server section):
ssl on;
ssl_certificate /etc/nginx/conf/ssl-unified.crt;
ssl_certificate_key /etc/nginx/conf/ssl.key;
Tell nginx to reload its configuration:
killall -HUP nginx
江帅帅:精通 Spring Boot 系列 03
关闭指定的自动配置
通过上面的 @EnableAutoConfiguration 注解就能根据指定的依赖,自动进行配置。但如果你想关闭某一项自动配置,就需要使用 @SpringBootApplication 下的 exclude 参数来设置。比如,我想关闭 DataSource,代码具体如下:
1@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
自定义启动 banner
能满足企业定制 logo 或项目启动图案。比如,可以借助如下几个网站来生成:
1http://patorjk.com/software/taag2http://www.network-science.de/ascii/3http://www.kammerl.de/ascii/AsciiSignature.php生成之后,直接将复制好的图案,放到新建的 banner.txt 文件中。运行程序之后,具体显示效果如下:
全局配置文件
一般使用 application.properties 或者 application.yml 文件来当作全局配置文件。它能被添加在下面几个目录下,区别是加载的顺序是不同的,具体如下:
1项目根目录的 /config 目录下2项目根目录下3类路径的 /config 目录下4类路径下比如,可以在 application.properties 配置文件中,设置端口、请求后缀等内容。具体的配置参数可以参考官网文档第 10 章 Appendices:https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/htmlsingle/#common-application-properties
配置 Web 容器
在 Spring Boot 应用中,可以内置 Tomcat、Netty、Jetty 等容器。
1)配置 Tomcat
如果添加了 spring-boot-starter-web 依赖,则项目会默认使用 Tomcat 作为 Web 容器。
针对 Tomcat 可以添加一些配置,具体配置如下:
1# 端口 2server.port=80 3# 错误跳转路径 4server.error.path 5# session 失效时间 6server.servlet.session.timeout 7# 项目名称 8server.servlet.context-path 9# 编码,一般 utf-810server.tomcat.uri-encoding=utf-811# ...2)配置 Jetty
在 Spring Boot 应用中嵌入 Jetty 的配置很简单,把 spring-boot-starter-web 中的 Tomcat 改成 Jetty 即可,具体配置如下:
1 2 3 org.springframework.boot 4 spring-boot-starter-web 5 6 7 org.springframework.boot 8 spring-boot-starter-tomcat 9 10 1112131415 org.springframework.boot16 spring-boot-starter-jetty173)配置 Undertow
Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器,拥有非常好的性能。配置方式具体如下:
1 2 3 org.springframework.boot 4 spring-boot-starter-web 5 6 7 org.springframework.boot 8 spring-boot-starter-tomcat 9 10 1112131415 org.springframework.boot16 spring-boot-starter-undertow17
HTTPS 配置
使用 JDK 提供的 keytool 工具,可以生成一个数字证书,具体命令如下:
1keytool -genkey -alias httpskey -keyalg RSA -keysize 2048 -keystore hello.p12 -validity 365-genkey 表示创建一个密钥
-alias httpskey 设置密钥的别名
-keyalg RSA 表示使用的加密算法是 RSA
-keysize 2048 设置密钥的长度
-keystore hello.p12 设置密钥存放位置
-validity 365 设置密钥的有效时间
然后在 application.properties 文件中编辑,具体配置如下:
1server.ssl.key-store=hello.p122server.ssl.key-alias=httpskey3server.ssl.key-store-password=123456
类型安全配置
前面也说过,我们的配置文件可以使用 properties 配置和 yaml 配置,项目启动后,它们都会被加载到 Spring 的环境中,如果你要用配置信息的话,直接使用 @Value 注解即可。
但数据注入到属性中,需要注意安全。Spring Boot 使用类型安全配置属性,即使在数据量非常庞大的情况下,将配置文件中的数据注入到 Bean 里也是很方便的。
1user.name=翠花2user.age=183user.address=北京添加对应的 Bean 类,使用 @ConfigurationProperties 注解来使用配置,通过 prefix 属性来描述要加载的配置文件的前缀,具体如下:
1@Component2@ConfigurationProperties(prefix="user")3public class User {4 private String name;5 private Integer age;6 private String address;7 // get 和 set 方法...8}
YAML 配置
YAML 是专门用来写配置文件的语言,非常简洁、强大,类似 JSON。它可用来替换 application.properties 文件。YAML 主要是由 spring-boot-starter-web 依赖模块中的 snakeyaml 依赖进行解析。但它不能使用 @propertySource 注解加载 YAML 文件,否则还要使用 Properties 配置。
举个小案例,具体写法如下:
1server:2 port:803 servlet:4 context-path:/hello5 tomcat:6 uri-encoding:utf-8还可以自定义配置,具体写法如下:
1user:2 name:翠花3 age:18对应的代码,跟前面的 User 类一样,具体源码如下:
1@Component2@ConfigurationProperties(prefix="user")3public class User {4 private String name;5 private Integer age;6 // get 和 set 方法...7}还能设置成集合的样式,集合中是单个值,具体写法如下:
1user:2 name:翠花3 age:184 aihao:5 - 烫头6 - 捏脚7 - Reading对应的代码,具体源码如下:
1@Component2@ConfigurationProperties(prefix="user")3public class User {4 private String name;5 private Integer age;6 private List aihao;7 // get 和 set 方法...8}也能先设置成集合的样式,但集合中是对象,具体写法如下:
1shop: 2 users: 3 - name:翠花 4 age:18 5 aihao: 6 - 烫头 7 - 捏脚 8 - Reading 9 - name:小强10 age:1811 aihao:12 - 烫头13 - 捏脚14 - Reading对应的代码,具体源码如下:
1@Component2@ConfigurationProperties(prefix="shop")3public class Users {4 private List users;5 // get 和 set 方法...6}1public class User {2 private String name;3 private Integer age;4 private List aihao;5 // get 和 set 方法...6}
Profile 配置
如果我们在项目中,需要频繁在开发环境、测试环境和生产环境中更改大量的配置,会让你怀疑人生,所以我们使用 @Profile 注解来更加简洁进行处理。
具体的命名规则:application-{xxx}.properties,这样就能在不同环境下进行区别配置信息。具体使用步骤如下:
第一步,添加配置文件
在 resources 目录中,创建 application-dev.properties 和 application-prod.properties 文件,代表开发和生产环境中的配置。
1# 开发环境2server.port=8080 1# 生产环境2server.port=80第二步,指定对应模式
1)在 application.properties 中指定
1# 开发时用 dev,生产时用 prod2spring.profiles.active=dev2)在启动类 main 方法中指定
1SpringApplicationBuilder builder = new SpringApplicationBuilder(SpringBootApp.class);23builder.application().setAdditionalProfiles("prod");45builder.run(args);3)也可以在项目启动时配置
在我们将项目打成 jar 文件再启动,具体的操作命令如下:
1java -jar springdemo-xxx.jar --spring.profiles.active=prod来源于:奈学开发者社区-江帅帅
自制Https证书并在Spring Boot和Nginx中使用(转)
白话Https一文中, 介绍了Https存在的目的和工作原理,但多是偏向于原理性的介绍,本文介绍如何一步一步自制一个能够通过浏览器认证的Https证书,并讲解在Spring Boot环境和Nginx环境中服务器端的配置。
如果你还没有读过白话Https,我强烈建议你先去读一下。按照白话Https中的介绍,Https协议涉及到的主体主要有三个:客户端、服务端、以及CA机构。如下图所示:
在白话Https一文中,曾介绍一个服务要申请使用Https的流程。本文所介绍的流程,针对自制Https证书,更多的面向测试场景,当然了,有些网站,比如像12306这样的,也会自制根证书要求用户安装。既然是要DIY,当然也要分别在三个主体上做工作。
证书颁发机构
CA机构私钥
openssl genrsa -out ca.key 2048
CA证书
openssl req -x509 -new -key ca.key -out ca.crt
注意生成过程中需要输入一些CA机构的信息
服务端
生成服务端私钥
openssl genrsa -out server.key 2048
生成服务端证书请求文件
openssl req -new -key server.key -out server.csr
注意生成过程中需要你输入一些服务端信息
使用CA证书生成服务端证书
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
关于sha256,默认使用的是sha1,在新版本的chrome中会被认为是不安全的,因为使用了过时的加密算法。
打包服务端的资料为pkcs12格式(非必要,只是换一种格式存储上一步生成的证书)
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pkcs12
生成过程中,需要创建访问密码,请记录下来。
生成服务端的keystore(.jks文件, 非必要,Java程序通常使用该格式的证书)
keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12
生成过程中,需要创建访问密码,请记录下来。
把ca证书放到keystore中(非必要)
keytool -importcert -keystore server.jks -file ca.crt
客户端
导入根证书ca.crt到浏览器受信任的根证书颁发机构列表中
不管通过什么浏览器吧,总之你要找到下面这个页面,点击导入,将上面生成的CA机构的ca.crt导入到收信任的根证书颁发机构列表中。
注意,收信任的根证书颁发机构列表是操作系统级的,不管通过哪个浏览器进入配置,都是只需要配置一次,再使用其它浏览器时,无需重复配置。
Spring Boot
Spring Boot为web容器提供了统一的抽象配置,不管你使用的是Tomcat是Jetty还是其它web容器,如果要在Spring Boot中使用Https,你只需要在你的配置类中,添加如下代码,注册一个EmbeddedServletContainerCustomizer Bean即可。
需要用到上面生成的Server.jks文件。
@Configuration
public class WebConfig {
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
Ssl ssl = new Ssl();
ssl.setKeyStore("Server.jks");
ssl.setKeyStorePassword("passwd");
container.setSsl(ssl);
container.setPort(8443);
}
};
}
}
Nginx
如果要在Nginx中使用Https,需要用到上面生成的Server.crt,Server.key。
server {
listen 127.0.0.1:443 ssl;
ssl on;
ssl_certificate Server.crt;
ssl_certificate_key Server.key;
#省略无关配置...
}
总结
crt、jks、pkcs12都是用来保存证书的不同格式,不同的服务器软件可能会使用不同格式的证书文件。
OpenSSl、Keytool都是可以用来生成Https证书的工具软件,其中OpenSSl功能更多更复杂,Keytool随JDK安装而安装。
证书的格式是多样的,生成证书的软件工具有很多,不同服务器程序的配置方法不尽相同,要达成目的有很多种方法。所以,重要的是弄懂原理,而不是按照教程一步一步敲命令。
跟白话Https一样,本文仍然没有介绍服务端怎么验证客户端,但如果你弄懂了原理,我想你已经可以自己去实现了
http://www.cnblogs.com/xinzhao/p/4950689.html
深入Jetty源码之SecurityHandler
概述
Jetty的强大之处在于可以自由的配置某些组建的存在与否,以提升性能,减少复杂度,而其本身也因为这种特性而具有很强的可扩展性。SecurityHandler就是Jetty对Servlet中Security框架部分的实现,并可以根据实际需要装卸和替换。Servlet的安全框架主要有两个部分:数据传输的安全以及数据授权,对数据传输的安全,可以使用SSL对应的Connector实现,而对于数据授权安全,Servlet定义了一套自己的框架。Servlet的安全框架支持两种方式的验证:首先,是用于登陆的验证,对于定义了role-name的资源都需要进行登陆验证,Servlet支持NONE、BASIC、CLIENT-CERT、DIGEST、FORM等5种验证方式(<login-config>/<auth-method>);除了用户登陆验证,Servlet框架还定义了role的概念,一个role可以包含一个或多个用户,一个用户可以隶属于多个role,一个资源可以有一个或多个role,只有这些定义的role才能访问该资源,用户只能访问它所隶属的role能访问的资源。另外,对一个Servlet来说,还可以定义role-name到role-link的映射关系,从文档上,这里的role-name是Servlet中使用的名字,而role-link是Container中使用的名字,感觉很模糊,从Jetty的角度,role-name是web.xml中在<security-constraint>/<auth-constraint>/<role-name>中对一个URL Pattern的role定义,而role-link则是UserIdentity中roles数组的值,而UserIdentity是LoginService中创建的,它从文件、数据库等加载已定义的user的信息:用户名、密码、它隶属的role等,如果Servlet中没有定义role-name到role-link的映射,则直接使用role-name去UserIdentity中比较role信息。关于Servlet对Security框架的具体解释,可以参考Oracle的文档:http://docs.oracle.com/cd/E19798-01/821-1841/6nmq2cpk7/index.html在web.xml中,对用于登陆验证方式的定义如下: <login-config>
<auth-method>FORM</auth-method>
<realm-name>Example-Based Authentiation Area</realm-name>
<form-login-config>
<form-login-page>/jsp/security/protected/login.jsp</form-login-page>
<form-error-page>/jsp/security/protected/error.jsp</form-error-page>
</form-login-config>
</login-config>
OR
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Tomcat Manager Application</realm-name>
</login-config>
而对资源所属role的定义如下: <security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Status interface</web-resource-name>
<url-pattern>/status/*</url-pattern>
</web-resource-collection> ...
<auth-constraint>
<role-name>manager-gui</role-name>
<role-name>manager-script</role-name>
<role-name>manager-jmx</role-name>
<role-name>manager-status</role-name>
</auth-constraint>
</security-constraint>
Jetty对Servlet Security实现概述和类图
在Jetty中,使用Authenticator接口抽象不同用户登陆验证的逻辑;使用LoginService接口抽象对用户名、密码的验证;使用UserIdentity保存内部定义的一个用户的用户名、密码、role集合;使用ConstraintMapping保存URL Pattern到role集合的映射;使用UserIdentity.Scope保存一个Servlet中role-name到role-link的映射。他们的类图如下:UserIdentity实现
UserIdentity表示一个用户的认证信息,它包含Subject和UserPrincipal,其中Subject是Java Security框架定义的类型,而UserPrincipal则用于存储用户名以及认证信息,在Jetty中一般使用KnownUser来存储,它包含了UserName以及Credential实例,其中Credential可以是Crypt、MD5、Password等。在Credential中定义了check方法用于验证传入的credential是否是正确的。IdentityService实现
IdentityService我猜原本用于将UserIdentity、RunAsToken和当前Thread关联在一起,以及创建UserIdentity、RunAsToken,然而我看的版本中,DefaultIdentityService貌似还没有实现完成,目前只是根据提供的Subject、Principal、roles创建DefaultUserIdentity实例,以及使用runAsName创建RoleRunAsToken,对Servlet中的runAsToken,我看的Jetty版本也还没有实现完成。 public UserIdentity newUserIdentity(final Subject subject, final Principal userPrincipal, final String[] roles) {
return new DefaultUserIdentity(subject,userPrincipal,roles);
}
public RunAsToken newRunAsToken(String runAsName) {
return new RoleRunAsToken(runAsName);
}
LoginService实现
在Jetty中,LoginService用来验证给定的用户名和证书信息(如密码),即对应的login方法;以及验证给定的UserIdentity,即对应的validate方法;其Name属性用于标识实例本身(即作为当前使用的realm name);另外IdentityService用于根据加载的用户名和证书信息创建UserIdentity实例。
public interface LoginService {
String getName();
UserIdentity login(String username,Object credentials);
boolean validate(UserIdentity user);
IdentityService getIdentityService();
void setIdentityService(IdentityService service);
void logout(UserIdentity user);
}
为了验证用户提供的用户名和证书的正确性和合法性,需要有一个地方用来存储定义好的正确的用户名以及对应的证书信息(如密码等),Jetty提供了DB、Properties文件、JAAS、SPNEGO作为用户信息源的比较。对于DB或Properties文件方式存储用户信息,如果每次的验证都去查询数据库或读取文件内容,效率会很低,因而还有一种实现方式是将数据库或文件中定义的用户信息预先的加载到内存中,这样每次验证只需要读取内存即可,这种方式的实现性能会提高很多,但是这样就无法动态的修改用户信息,并且如果用户信息很多,会占用很多的内存,目前Jetty采用后者实现,其中数据库存储用户信息有两个:JDBCLoginService以及DataSourceLoginService,Properties文件存储对应的实现是HashLoginService,它们都继承自MappedLoginService。在MappedLoginService中保存了一个ConcurrentMap<String, UserIdentity>实例,它是一个UserName到UserIdentity的映射,在该实例start时,它会从底层的数据源中加载用户信息,对HashLoginService,它会从config指定的Properties文件中加载用户信息,并填充ConcurrentMap<String, UserIdentity>,其中Properties文件的格式为:<username>=credential, role1, role2, ....如果credential以"MD5:"开头,表示它是MD5数据,如果以"CRYPT:"开头,表示它是crypt数据,否则表示它是密码字符;如果以存在的用户不在新读取的用户列表中,则将其移除,因为HashLoginService还可以启动一个线程以隔一定的时间重新加载文件中的内容,以处理文件更新的问题。在MappedLoginService中还定义了几个Principal的实现类:KnownUser、RolePrincipal、Anonymous等,在添加加载的用户时,使用KnownUser保存username和credential信息,并将该Principal添加到Subject的Principals集合中,同时对每个role创建RolePrincipal,并添加到Subject的Principals集合中,而将credential添加到Subject的PrivateCredentials集合中,使用IdentityService创建UserIdentity,并添加到ConcurrentMap<String, UserIdentity>中。在login验证中,首先使用传入的username查找存在的UserIdentity,并使用找到的UserIdentity中的Principal的check方法验证传入的credential,如果验证失败,返回null(即调用Credential的check方法:Password/MD5/Crypt)。对DataSourceLoginService和JDBCLoginService只是从数据库中加载用户信息,不详述。而JAASLoginService和SpnegoLoginService也只是使用各自的协议进行验证,不细述。Authenticator实现
Authenticator用于验证传入的ServletRequest、ServletResponse是否包含正确的认证信息。其接口定义如下:
public interface Authenticator {
// Jetty支持BASIC、FORM、DIGEST、CLIENT_CERT、SPNEGO的认证,该方法返回其中的一种,或用于自定义的方法。
String getAuthMethod();
// 设置配置信息(SecurityHandler继承自AuthConfiguration接口):AuthMethod、RealmName、InitParameters、LoginService、IdentityService、IsSessionRenewedOnAuthentication
void setConfiguration(AuthConfiguration configuration);
// 验证逻辑的实现方法,其中mandatory若为false表示当前资源有没有配置role信息,或者@ServletSecurity中的@HttpConstraint的EmptyRoleSemantic被配置为PERMIT,此时返回Deferred类型的Authentication,如果不手动的调用其authenticate或login方法,就不会对该请求进行验证。
// 对BasicAuthenticator的实现,它从Authorization请求头中获取认证信息(用户名和用户密码,使用":"分割,并且使用Base64编码),调用LoginService进行认证,当认证通过时,如果配置了renewSession为true,则将HttpSession中的所有属性更新一遍,并且添加(org.eclipse.jetty.security.secured, True) entry,并使用UserIdentity以及AuthMethod创建UserAuthentication返回。如果认证失败,则返回401 Unauthorized错误,并且在相应消息中包含头:WWW-Authenticate: basic realm=<LoginService.name>
// 对FormAuthenticator的实现,它首先要配置formLoginPage、formLoginPath(默认j_security_check)、formErrorPage、formErrorPath;只有当前请求URL是formLoginPath时,从j_username和j_password请求参数中获取username和password信息,使用LoginService验证,如果验证通过且这个请求是因为之前请求其他资源重定向过来的,这重定向到之前的URL,创建一个SessionAuthentication放入HttpSession中,并返回一个新创建的FormAuthentication;如果验证失败,如果没定义formErrorPage,返回403 Forbidden相应,否则重定向或forward到formErrorPage;对于其他URL请求,查看在当前Session中是否存在已认证的Authentication,如果有,但是重新验证缓存的Authentication失败,则将这个Authentication从HttpSession中移除;否则返回这个Session中的Authentication;对于其他情况,表示当前请求需要认证后才能访问,此时保存当前请求URI以及POST数据到Session中,以在认证之后可以直接跳转,然后重定向或forward到formLoginPage中。
// 对DigestAuthenticator的实现类似BasicAuthenticator,只是它使用Digest的方式对认证数据进行加密和解密。
// 对ClientCertAuthenticator则采用客户端证书的方式认证,SpnegoAuthenticator使用SPNEGO方式认证,JaspiAuthenticator使用JASPI方式认证。
Authentication validateRequest(ServletRequest request, ServletResponse response, boolean mandatory) throws ServerAuthException;
// 只用于JaspiAuthenticator,用于所有后继handler处理完成后对ServletRequest、ServletResponse、User的进一步处理,目前不了解JASPI的协议逻辑,因而不了解具体的用途。
boolean secureResponse(ServletRequest request, ServletResponse response, boolean mandatory, User validatedUser) throws ServerAuthException;
}
SecurityHandler与ConstraintSecurityHandler实现
SecurityHandler继承自HandlerWrapper,并实现了Authenticator.AuthConfiguration接口,因而它包含了realm、authMethod、initParameters、loginService、identityService、renewSession等字段,在其start时,它会首先从ServletContext的InitParameters中导入org.eclipse.jetty.security.*属性的值到其InitParameters中,如果LoginService为null,则从Server中查找一个已经注册的LoginService,使用Authenticator.Factory根据AuthMethod创建对应的Authenticator实例。ConstraintSecurityHandler继承自SecurityHandler类,它定义了ConstraintMapping列表、所有定义的role、以及pathSpec到Map<String, RoleInfo>(key为httpMethod,RoleInfo包含UserDataConstraint枚举类型和roles集合)的映射,其中ConstraintMapping中保存了method、methodOmissions、pathSpec、Constraint(Constraint中包含了name、roles、dataConstraint等信息),ConstraintMapping在解析web.xml文件时添加,它对应<security-constraint>下的配置,如auth-constraint下的role-name配置对应roles数组,user-data-contraint对应dataConstraint,web-resource-name对应name,http-method对应method,url-pattern对应pathSpec;在每次添加ConstraintMapping时都会更新roles列表以及pathSpec到Map<String, RoleInfo>的映射。在SecurityHandler的handle方法中,它只需要对REQUEST、ASYNC类型的DispatcherType需要验证:它首先根据pathInContext和Request实例查找RoleInfo信息;如果RoleInfo处于forbidden状态,发送403 Forbidden相应,如果DataConstraint配置了Intergal、Confidential,但是Connector中没有配置相应的port,则发送403 Forbidden相应,否则重定向请求到Integral、Confidential对应的URL;对没有验证过的请求调用Authenticator.validateRequest()对请求进行验证;如果验证的结果是Authentication.ResponseSent,设置Request的handled为true,如果为Authentication.User,表示认证成功,设置该Authentication到Request中,并检查role,即检查当前User是否处于RoleInfo中的role集合中,如果不是,发送403 Forbidden响应,否则调用下一个handler的handle方法,之后调用Authenticator.secureResponse()方法;如果验证结果是Authentication.Deferred,在调用下一个handler的handle方法后调用Authenticator.secureResponse()方法;否则直接调用Authenticator.secureResponse()方法。
Azkaban 简单入门
Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
1. 安装
准备工作
azkaban-web-server-2.5.0.tar.gzazkaban-executor-server-2.5.0.tar.gzazkaban-sql-script-2.5.0.tar.gz
其中,azkaban-web-server-2.5.0.tar.gz是服务器,azkaban-executor-server-2.5.0.tar.gz是执行服务器,azkaban-sql-script-2.5.0.tar.gz是执行的sql脚本。
2. mysql创建表
分别把他们解压安装后。我们还需要在mysql中创建数据库,然后运行azkaban提供的sql脚本来创建azkaban所需要的表。
mysql -uroot -p
mysql> create database azkaban;
mysql> use azkaban;
Database changed
mysql> source /home/fantj/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql;
mysql> show tables;
+------------------------+
| Tables_in_azkaban |
+------------------------+
| active_executing_flows |
| active_sla |
| execution_flows |
| execution_jobs |
| execution_logs |
| project_events |
| project_files |
| project_flows |
| project_permissions |
| project_properties |
| project_versions |
| projects |
| properties |
| schedules |
| triggers |
+------------------------+
15 rows in set (0.00 sec)
3. 创建SSL配置
1. 执行命令keytool -keystore keystore -alias jetty -genkey -keyalg RSA会在当前目录生成一个keystore证书文件,当然执行该命令需要你填写一些信息,比如你的姓名+工作单位等。按照提示填写即可。
2. 然后把 keystore 考贝到 azkaban web服务器bin目录中
4. 配置时区
[root@s166 azkaban]# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#? 9
Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
#? 1
The following information has been given:
China
Beijing Time
Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Sat Jul 28 18:29:58 CST 2018.
Universal Time is now: Sat Jul 28 10:29:58 UTC 2018.
Is the above information OK?
1) Yes
2) No
#? 1
You can make this change permanent for yourself by appending the line
TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
这个配置需要给集群的每个主机设置,因为任务调度离不开准确的时间。我们也可以直接把相关文件拷贝到别的主机作覆盖。
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@s166 azkaban]# scp /usr/share/zoneinfo/Asia/Shanghai root@s168:/etc/localtime
Shanghai 100% 388 500.8KB/s 00:00
[root@s166 azkaban]# scp /usr/share/zoneinfo/Asia/Shanghai root@s169:/etc/localtime
Shanghai
5. 修改配置
5.1 修改服务端配置
5.1.1 /webserver/conf目录下的azkaban.properties(我之前将服务端的解压文件改名为webserver)
#Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai
#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
#Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=root
mysql.password=root
mysql.numconnections=100
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.maxThreads=25
jetty.ssl.port=8443
jetty.port=8081
jetty.keystore=keystore
jetty.password=jiaoroot
jetty.keypassword=jiaoroot
jetty.truststore=keystore
jetty.trustpassword=jiaoroot
# Azkaban Executor settings
executor.port=12321
# mail settings
mail.sender=844072586@qq.com
mail.host=smtp.qq.com
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
主要修改时区+mysql配置+SSL密码和文件路径+邮箱配置。不贴注释了,一看就懂。
5.1.2. 修改/conf/目录下的azkaban-users.xml
<azkaban-users>
<user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
<user username="metrics" password="metrics" roles="metrics"/>
<user username="admin" password="admin" roles="admin">
<role name="admin" permissions="ADMIN" />
<role name="metrics" permissions="METRICS"/>
</azkaban-users>
5.2 执行服务器配置
修改/executor/conf目录下的azkaban.properties
#Azkaban
default.timezone.id=Asia/Shanghai
# Azkaban JobTypes Plugins
azkaban.jobtype.plugin.dir=plugins/jobtypes
#Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=root
mysql.password=root
mysql.numconnections=100
# Azkaban Executor settings
executor.maxThreads=50
executor.port=12321
executor.flow.threads=30
6. 执行
6.1 启动web服务器
在webserver/bin目录下,执行[root@s166 webserver]# nohup bin/azkaban-web-start.sh 1>/tmp/azstd.out 2>/tmp/azerr.out &启动服务。
小技巧:先别记着用nohup执行,不然报错不能够及时的反馈,应该在尝试执行通过后再去尝试用nohup来执行。[root@s166 executor]# bin/azkaban-executor-start.sh
我大概见到的一些报错是:
/bin/目录下没有keystore文件------需要把它复制到bin下
找不到各种配置文件----- 我在配置文件中将这些文件配置成绝对路径。
6.2 启动执行服务器
在/executor/bin/目录下执行[root@s166 webserver]# bin/azkaban-web-start.sh
6.3 浏览器访问https://s166:8443/
如果你看到这样的画面,证明你错了,没有在根目录下执行,而是习惯性的在bin目录下执行启动文件,所以它的很多css都加载不到。
这才是正确的打开方式
用设置的账号密码登录。
7. Azkaban实战
7.1 单一job示例
创建job描述文件
vim command.job
#command.job
type=command
command=echo fantj666
将job资源文件打包成zip文件
zip command.job
通过azkaban的web管理平台创建project并上传job压缩包
首先创建project
创建工程
上传文件
执行日志
7.2 多job工作流flow
创建有依赖关系的多个job描述
第一个job:foo.job
# foo.job
type=command
command=echo foo
第二个job:bar.job依赖foo.job
# bar.job
type=command
dependencies=foo
command=echo bar
将所有job资源文件打到一个zip包中
上传zip包并启动
查看job log
job list
foo job log
bar job log
7.3 操作hadoop
vim fs.job
# fs.job
type=command
command=/home/fantj/hadoop/bin/hadoop fs -lsr /
打包成zip上传
启动job并查看lob
7.4 操作hive
hive脚本test.sql
use default;
drop table aztest;
create table aztest(id int,name string,age int) row format delimited fields terminated by ',' ;
load data inpath '/aztest/hiveinput' into table aztest;
create table azres as select * from aztest;
insert overwrite directory '/aztest/hiveoutput' select count(1) from aztest;
job文件hivef.job
# hivef.job
type=command
command=/home/fantj/hive/bin/hive -f 'test.sql'
打zip包-上传-执行-查log
【Azkaban 】(二)十分钟搞定 Azkaban 安装,亲测完美!
文章目录一、安装过程1、软件介绍2、软件下载3、安装说明4、安装步骤5、启动6、验证一、安装过程1、软件介绍Azkaban Web 服务器:azkaban-web-server-2.5.0.tar.gzAzkaban Excutor 执行服务器:azkaban-executor-server-2.5.0.tar.gzAzkaban 初始化脚本文件:azkaban-sql-script-2.5.0.tar.gz2、软件下载下载地址:http://azkaban.github.io/downloads.html3、安装说明将安装文件上传到集群,最好上传到安装 hive、sqoop 的机器上,方便命令的执行。并最好同 一存放在 apps 目录下,用于存放源安装文件.新建 azkaban-2.5.0 目录,用于存放 azkaban 运行程序[hadoop@hadoop3 ~]$ cd apps/
[hadoop@hadoop3 apps]$ mkdir azkaban-2.5.04、安装步骤(1)上传安装包并解压缩到指定目录[hadoop@hadoop3 ~]$ tar -zxvf azkaban-web-server-2.5.0.tar.gz -C apps/azkaban-2.5.0/
[hadoop@hadoop3 ~]$ tar -zxvf azkaban-executor-server-2.5.0.tar.gz -C apps/azkaban-2.5.0/(2)解压初始化脚本[hadoop@hadoop3 ~]$ tar -zxvf azkaban-sql-script-2.5.0.tar.gz
[hadoop@hadoop3 ~]$ cd azkaban-2.5.0/
[hadoop@hadoop3 azkaban-2.5.0]$ ll
总用量 88
-rwxr-xr-x 1 hadoop hadoop 129 4月 22 2014 create.active_executing_flows.sql
-rwxr-xr-x 1 hadoop hadoop 216 4月 22 2014 create.active_sla.sql
-rwxr-xr-x 1 hadoop hadoop 4694 4月 22 2014 create-all-sql-2.5.0.sql
-rwxr-xr-x 1 hadoop hadoop 610 4月 22 2014 create.execution_flows.sql
-rwxr-xr-x 1 hadoop hadoop 519 4月 22 2014 create.execution_jobs.sql
-rwxr-xr-x 1 hadoop hadoop 358 4月 22 2014 create.execution_logs.sql
-rwxr-xr-x 1 hadoop hadoop 224 4月 22 2014 create.project_events.sql
-rwxr-xr-x 1 hadoop hadoop 227 4月 22 2014 create.project_files.sql
-rwxr-xr-x 1 hadoop hadoop 280 4月 22 2014 create.project_flows.sql
-rwxr-xr-x 1 hadoop hadoop 285 4月 22 2014 create.project_permissions.sql
-rwxr-xr-x 1 hadoop hadoop 294 4月 22 2014 create.project_properties.sql
-rwxr-xr-x 1 hadoop hadoop 380 4月 22 2014 create.projects.sql
-rwxr-xr-x 1 hadoop hadoop 325 4月 22 2014 create.project_versions.sql
-rwxr-xr-x 1 hadoop hadoop 155 4月 22 2014 create.properties.sql
-rwxr-xr-x 1 hadoop hadoop 498 4月 22 2014 create.schedules.sql
-rwxr-xr-x 1 hadoop hadoop 189 4月 22 2014 create.triggers.sql
-rwxr-xr-x 1 hadoop hadoop 22 4月 22 2014 database.properties
-rwxr-xr-x 1 hadoop hadoop 671 4月 22 2014 update-all-sql-2.1.sql
-rwxr-xr-x 1 hadoop hadoop 156 4月 22 2014 update-all-sql-2.2.sql
-rwxr-xr-x 1 hadoop hadoop 395 4月 22 2014 update.execution_logs.2.1.sql
-rwxr-xr-x 1 hadoop hadoop 59 4月 22 2014 update.project_properties.2.1.sql
[hadoop@hadoop3 azkaban-2.5.0]$(3)在MySQL中执行脚本create-all-sql-2.5.0.sql(在MySQL所在的服务器上执行)mysql> create database azkaban;
Query OK, 1 row affected (0.01 sec)
mysql> use azkaban;
Database changed
mysql> source /home/hadoop/azkaban-2.5.0/create-all-sql-2.5.0.sql(4)创建SSL配置参考地址: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL最好是在 /home/hadoop/apps/azkaban-2.5.0 目录下: 执行命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA[hadoop@hadoop3 azkaban-2.5.0]$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]:
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的省/市/自治区名称是什么?
[Unknown]:
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN是否正确?
[否]: 是
输入 <jetty> 的密钥口令
(如果和密钥库口令相同, 按回车):
[hadoop@hadoop3 azkaban-2.5.0]$完成上述工作后,将在当前目录生成 keystore 证书文件,将 keystore 拷贝到 azkaban web 服务 器根目录中.如:hadoop@hadoop3 azkaban-2.5.0]$ mv keystore azkaban-web-2.5.0/(5)修改时区注:先配置好服务器节点上的时区1、先生成时区配置文件 Asia/Shanghai,用交互式命令 tzselect 即可2、拷贝该时区文件,覆盖系统本地时区配置[hadoop@hadoop3 azkaban-2.5.0]$ sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime(6)修改azkaban web 服务器配置进入 azkaban web 服务器安装目录 conf 目录[hadoop@hadoop3 ~]$ cd apps/azkaban-2.5.0/azkaban-web-2.5.0/conf/修改 azkaban.properties 文件[hadoop@hadoop3 conf]$ vi azkaban.properties内容说明如下:#Azkaban Personalization Settings
azkaban.name=MyTestAzkaban #服务器 UI 名称,用于服务器上方显示的名字
azkaban.label=My Local Azkaban #描述
azkaban.color=#FF3601 #UI 颜色
azkaban.default.servlet.path=/index
web.resource.dir=/home/hadoop/apps/azkaban-2.5.0/azkaban-web-2.5.0/web/ #默认根 web 目录
default.timezone.id=Asia/Shanghai #默认时区,已改为亚洲/上海 默认为美国
#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager #用户权限管理默认类
user.manager.xml.file=/home/hadoop/apps/azkaban-2.5.0/azkaban-web-2.5.0/conf/azkaban-users.xml #用户配置,具体配置参加下文
#Loader for projects # global 配置文件所在位置
executor.global.properties=/home/hadoop/apps/azkaban-2.5.0/azkaban-executor-2.5.0/conf/global.properties
azkaban.project.dir=projects
database.type=mysql #数据库类型
mysql.port=3306 #端口号
mysql.host=hadoop03 #数据库连接 IP
mysql.database=azkaban #数据库实例名
mysql.user=root #数据库用户名
mysql.password=root #数据库密码
mysql.numconnections=100 #最大连接数
# Velocity dev mode
velocity.dev.mode=false # Jetty 服务器属性.
jetty.maxThreads=25 #最大线程数
jetty.ssl.port=8443 #Jetty SSL 端口
jetty.port=8081 #Jetty 端口
jetty.keystore=/home/hadoop/apps/azkaban-2.5.0/azkaban-web-2.5.0/keystore #SSL 文件名
jetty.password=hadoop #SSL 文件密码
jetty.keypassword=hadoop #Jetty 主密码 与 keystore 文件相同
jetty.truststore=/home/hadoop/apps/azkaban-2.5.0/azkaban-web-2.5.0/keystore #SSL 文件名
jetty.trustpassword=hadoop # SSL 文件密码
# 执行服务器属性
executor.port=12321 #执行服务器端口
# 邮件设置(可选项)
mail.sender=xxxxxxxx@163.com #发送邮箱
mail.host=smtp.163.com #发送邮箱 smtp 地址
mail.user=xxxxxxxx #发送邮件时显示的名称
mail.password=********** #邮箱密码
job.failure.email=xxxxxxxx@163.com #任务失败时发送邮件的地址
job.success.email=xxxxxxxx@163.com #任务成功时发送邮件的地址
lockdown.create.projects=false # cache.directory=cache #缓存目录修改 azkaban-users.xml配置文件用户配置 进入 azkaban web 服务器 conf 目录,修改 azkaban-users.xml vi azkaban-users.xml 增加 管理员用户<azkaban-users>
<user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
<user username="metrics" password="metrics" roles="metrics"/>
<user username="admin" password="admin" roles="admin,metrics" />
<role name="admin" permissions="ADMIN" />
<role name="metrics" permissions="METRICS"/>
</azkaban-users>(6)修改azkaban executor服务器配置进入 azkaban executor 服务器安装目录 conf 目录[hadoop@hadoop3 ~]$ cd apps/azkaban-2.5.0/azkaban-executor-2.5.0/conf/修改azkaban.properties文件[hadoop@hadoop3 conf]$ vi azkaban.properties#Azkaban
default.timezone.id=Asia/Shanghai #时区
# Azkaban JobTypes 插件配置,插件所在位置
azkaban.jobtype.plugin.dir=/home/hadoop/apps/azkaban-2.5.0/azkaban-executor-2.5.0/plugins/jobtypes
#Loader for projects
executor.global.properties=/home/hadoop/apps/azkaban-2.5.0/azkaban-executor-2.5.0/conf/global.properties
azkaban.project.dir=projects
#数据库设置
database.type=mysql #数据库类型(目前只支持 mysql)
mysql.port=3306 #数据库端口号
mysql.host=hadoop03 #数据库 IP 地址
mysql.database=azkaban #数据库实例名
mysql.user=root #数据库用户名
mysql.password=root #数据库密码
mysql.numconnections=100 #最大连接数
# 执行服务器配置
executor.maxThreads=50 #最大线程数
executor.port=12321 #端口号(如修改,请与 web 服务中一致)
executor.flow.threads=30 #线程数(7)配置环境变量[hadoop@hadoop3 ~]$ vi .bashrc#Azkban
export AZKABAN_WEB_HOME=/home/hadoop/apps/azkaban-2.5.0/azkaban-web-2.5.0
export AZKABAN_EXE_HOME=/home/hadoop/apps/azkaban-2.5.0/azkaban-executor-2.5.0
export PATH=$PATH:$AZKABAN_WEB_HOME/bin:$AZKABAN_EXE_HOME/bin保存之后使其立即生效[hadoop@hadoop3 ~]$ source .bashrc5、启动(1)启动 web 服务器[hadoop@hadoop3 ~]$ azkaban-web-start.sh后台启动方式nohup azkaban-web-start.sh 1>/home/hadoop/azwebstd.out 2>/home/hadoop/azweberr.out &报错信息:Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.AutoloadedDriver40
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at java.sql.DriverManager.isDriverAllowed(DriverManager.java:556)
at java.sql.DriverManager.isDriverAllowed(DriverManager.java:548)
at java.sql.DriverManager.getDrivers(DriverManager.java:446)
at org.apache.commons.dbcp.BasicDataSource.<clinit>(BasicDataSource.java:57)
at azkaban.database.DataSourceUtils.getMySQLDataSource(DataSourceUtils.java:98)
at azkaban.database.DataSourceUtils.getDataSource(DataSourceUtils.java:76)
at azkaban.database.AbstractJdbcLoader.<init>(AbstractJdbcLoader.java:63)
at azkaban.executor.JdbcExecutorLoader.<init>(JdbcExecutorLoader.java:59)
at azkaban.webapp.AzkabanWebServer.loadExecutorManager(AzkabanWebServer.java:247)
at azkaban.webapp.AzkabanWebServer.<init>(AzkabanWebServer.java:185)
at azkaban.webapp.AzkabanWebServer.main(AzkabanWebServer.java:726)需要将derby-10.11.1.1.jar放到/home/hadoop/apps/azkaban-2.5.0/azkaban-web-2.5.0/lib和/home/hadoop/apps/azkaban-2.5.0/azkaban-executor-2.5.0/lib目录中[hadoop@hadoop3 ~]$ cp derby-10.11.1.1.jar apps/azkaban-2.5.0/azkaban-web-2.5.0/lib/
[hadoop@hadoop3 ~]$ cp derby-10.11.1.1.jar apps/azkaban-2.5.0/azkaban-executor-2.5.0/lib/此时在重新启动azkaban仍旧报错Exception in thread "main" java.lang.IllegalArgumentException: The datetime zone id 'Asia/Shanghai ' is not recognised
at org.joda.time.DateTimeZone.forID(DateTimeZone.java:223)
at azkaban.webapp.AzkabanWebServer.<init>(AzkabanWebServer.java:208)
at azkaban.webapp.AzkabanWebServer.main(AzkabanWebServer.java:726)排查发现是Azkaban的配置文件azkaban-web-2.5.0/conf/azkaban.properties中的时区配置后面多了一个空格导致注意:Azkaban的配置文件中不能有空格去掉空格之后再次启动azkaban,启动成功(2)启动executor服务器[hadoop@hadoop3 ~]$ azkaban-executor-start.sh后台启动方式nohup azkaban-executor-start.sh 1>/home/hadoop/azexstd.out 2>/home/hadoop/azexerr.out &6、验证打开谷歌或是火狐浏览器输入https://IP:8443,此处测试的地址是https://hadoop3:8443,此时可能会出现以下界面,点击高级此时会跳到登录界面,输入在配置文件azkaban-users.xml,中配置的用户名密码admin/admin,点击登录登录成功