Azkaban2.5.0与Hadoop2.5.1的集成


Azkaban2.5.0与Hadoop2.5.1的集成

2014-10-29 17:37  1042人阅读 评论(2) 收藏  举报
 分类:
Hadoop (1) 大数据 (4)

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]


本文主要介绍Azkaban与Hadoop2.5.1、Hive0.13.1的集成安装部署。以前一直再用oozie和Hadoop1,这是第一次接触Azkaban和Hadoop2,对它们的理解不深,所以文章中有错误的地方还望不吝赐教。本文主要是抛砖引玉,让有需要的人不用再跳到同样的坑里

组件版本

  • Centos 6.5 64位
  • Java 1.7
  • Hadoop 2.5.1
  • Hive 0.13.1
  • MySQL 5.5

预装需求

  • Hadoop集群 - 保证可用,并配置了相关的环境变量,包括:JAVA_HOME、HADOOP_HOME、HADOOP_MAPRED_HOME、 HADOOP_COMMON_HOME、HADOOP_HDFS_HOME、HADOOP_YARN_HOME、HADOOP_CONF_DIR。
    Hadoop集群总共3台服务器,ip分别为:namenode:192.168.20.221、datanode:192.168.20.222和192.168.20.224,Hadoop没有启用任何安全性。
    假设HADOOP_HOME=/usr/local/hadoop
  • Hive - 在192.168.20.222上已经部署,并配置HIVE_HOME环境变量,将$HIVE/bin和$HADOOP_HOME/bin加入到环境变量PATH中。
    假设HIVE_HOME=/opt/hive
  • MySQL Server可用

准备工作

下载安装包

从 http://azkaban.github.io/downloads.html下载如下安装包:
  • azkaban-web-server-2.5.0.tar.gz
  • azkaban-executor-server-2.5.0.tar.gz
  • azkaban-sql-script-2.5.0.tar.gz
  • azkaban-jobtype-2.5.0.tar.gz
  • azkaban-hdfs-viewer-2.5.0.tar.gz
  • azkaban-jobsummary-2.5.0.tar.gz
  • azkaban-reportal-2.5.0.tar.gz

下载azkaban plugins源码

安装过程中需要修改一些bug,重新编译azkaban plugins。

下载地址:https://github.com/azkaban/azkaban-plugins,并切换到release-2.5分支下。为了描述方便,假设解压的完整路径是${AZKABAN_PLUGINS_SOURCE}。

用于编译的机器需要jdk1.6+和ant,请提前准备好。为了节省时间具体的插件编译到具体的目录下执行,例如:${AZKABAN_PLUGINS_SOURCE}/plugins/reportal/

此外,最好在根目录下直接运行sudo ant命令编译一部分,例如产生dist/package.version或基本的依赖,这过程中可能出现错误,例如,缺少dustc可执行命令等,但是对本文中提到的编译没有直接的影响。

部署拓扑

本文将azkaban web server和azkaban executor server分开部署,azkaban web server部署在192.168.20.221;azkaban executor server部署在192.168.20.222。本文中的所有配置都是满足我目前需要的配置,如果需要其他配置请自行查阅在线文档或源码 - -

Azkaban Web Server的部署

数据库初始化

这部分与azkaban文档基本一致
  1. 创建数据库
    在数据库管理端执行:
    [java] view plain copy
    1. CREATE DATABASE `azkaban` /*!40100 DEFAULT CHARACTER SET utf8 */;  
  2. 建表
    解压azkaban-sql-script-2.5.0.tar.gz,在上步中创建的azkaban库上执行解压包内的create-all-sql-2.5.0.sql

解压部署

解压azkaban-web-server- 2.5.0.tar.gz,为了方便描述,以下使用${AZKABAN_WEB_SERVER}作为安装目录路径为,这个版本的azkaban在lib中 自带了mysql-connector-java-5.1.28.jar,如果版本不一致请自行替换

生成keystore

在${AZKABAN_WEB_SERVER}/conf下运行如下命令:
[java] view plain copy
  1. keytool -keystore keystore -alias azkaban -genkey -keyalg RSA  
输入/输入如下:所有密码假设输入为password
[java] view plain copy
  1. Enter keystore password:    
  2.     Re-enter new password:   
  3.     What is your first and last name?  
  4.       [Unknown]:  azkaban.test.com  
  5.     What is the name of your organizational unit?  
  6.       [Unknown]:  azkaban  
  7.     What is the name of your organization?  
  8.       [Unknown]:  test  
  9.     What is the name of your City or Locality?  
  10.       [Unknown]:  beijing  
  11.     What is the name of your State or Province?  
  12.       [Unknown]:  beijing  
  13.     What is the two-letter country code for this unit?  
  14.       [Unknown]:  CN  
  15.     Is CN=azkaban.test.com, OU=azkaban, O=test, L=beijing, ST=beijing, C=CN correct?  
  16.       [no]:  yes  
  17.   
  18.     Enter key password for   
  19.             (RETURN if same as keystore password):    
命令成功后,会在当前文件夹下生成名为keystore的文件

配置

所有配置都是保证最小运行,如需其他功能自行查询,修改${AZKABAN_WEB_SERVER}/conf/azkaban.properties
  1. 配置时区
    [java] view plain copy
    1. default.timezone.id=Asia/Shanghai  
  2. 配置数据库
    按照实际MySQL信息修改mysql.xxx属性
  3. 配置keystore
    [java] view plain copy
    1. jetty.keystore=conf/keystore  
    2. jetty.password=password  
    3. jetty.keypassword=password  
    4. jetty.truststore=conf/keystore  
    5. jetty.trustpassword=password  
  4. 配置jetty host
    [java] view plain copy
    1. jetty.hostname=192.168.20.221  
  5. 配置Azkaban Executor Server信息
    [java] view plain copy
    1. executor.host=192.168.20.222  
    2. executor.port=12321  
  6. 配置邮箱
    [java] view plain copy
    1. [email protected]  
    2. mail.host=mail.xxxx.com  
    3. mail.user=mailuser  
    4. mail.password=password  

启动/停止服务

  • 启动 - 启动之前先在${AZKABAN_WEB_SERVER}目录下创建logs目录,进入${AZKABAN_WEB_SERVER}目录,运行如下命令:
    bin/start-web.sh
    访问地址为:https://{localhost}:8443,默认的帐号为azkaban/azkaban
  • 停止 - 在${AZKABAN_WEB_SERVER}目录,运行如下命令停止服务:
    bin/azkaban-web-shutdown.sh

插件安装

为了以后插件的安装,需要在${AZKABAN_WEB_SERVER}/plugins/目录下创建viewer目录,用来安装各种viewer插件。当安装好一个插件后需要重启服务,让插件生效。

安装HDFS Viewer插件

  1. 解压插件
    在viewer目录中解压azkaban-hdfs-viewer-2.5.0.tar.gz,得到azkaban-hdfs-viewer-2.5.0目录,将其更名为hdfs。最终,这个插件的目录路径是:${AZKABAN_WEB_SERVER}/plugins/viewer/hdfs。
  2. 配置HDFS Viewer
    修改${AZKABAN_WEB_SERVER}/plugins/viewer/hdfs/conf/plugin.properties。根据应用场景修改proxy.user。需要注意的是配置viewer.external.classpaths并没有任何效果,不知是bug还是我用错了,以至于需要使用下面的步骤来配置
  3.  增加依赖jar
    这个版本的Azkaban无法找到Hadoop2中的相关依赖jar,而HDFS Viewer需要以下依赖:
    [java] view plain copy
    1. [root@mn extlib]# ll  
    2. total 10448  
    3. -rw-r--r-- 1 root root   41123 Oct 29 18:09 commons-cli-1.2.jar  
    4. -rw-r--r-- 1 root root   52418 Oct 29 18:09 hadoop-auth-2.5.1.jar  
    5. -rw-r--r-- 1 root root 2962475 Oct 29 18:09 hadoop-common-2.5.1.jar  
    6. -rw-r--r-- 1 root root 7095356 Oct 29 18:09 hadoop-hdfs-2.5.1.jar  
    7. -rw-r--r-- 1 root root  533455 Oct 29 18:09 protobuf-java-2.5.0.jar  
    这么做的缺点是以后hadoop如果升级,别忘了将这些jar更新!
  4. 效果
    可以看到导航栏多了一个HDFS标签

安装Job Summary插件

  1. 解压插件
    在viewer目录中解压azkaban-jobsummary-2.5.0.tar.gz,得到azkaban-jobsummary-2.5.0目录,将其更名为job summary。最终,这个插件的目录路径是${AZKABAN_WEB_SERVER}/plugins/viewer/jobsummary
  2. 配置Job Summary
    默认情况下不用做任何改到,如果需要修改${AZKABAN_WEB_SERVER}/plugins/viewer/jobsummary/conf/plugin.properties。
  3. 效果


安装Reportal插件

Reportal插件的安装不仅是要在Azkaban Web Server上进行(Viewer插件),也需要在Azkaban Executor Server上进行(Jobtype插件)。本小节主要是说明如何在前者上的安装;后者上的安装参考Azkaban Executor Server的安装和部署。
  1. 解压插件
    由于azkaban-reportal-2.5.0.tar.gz中不仅包含Viewer插件,还包含Jobtype插件,所以先在一个临时目录中解压这个包,然后将解压得到的viewer/reportal/目录拷贝到上步中的viewer目录下。最终这个插件的目录路径为:
    ${AZKABAN_WEB_SERVER}/plugins/viewer/reportal。
  2. 配置Reportal Viewer
    修改${AZKABAN_WEB_SERVER}/plugins/viewer/reportal/conf/plugin.properties。由于Web Server和Executor Server是分开部署,不能使用本地文件存储report任务的结果,而是用hdfs存储:
    [java] view plain copy
    1. reportal.output.filesystem=hdfs  
  3. 效果
    配置成功后,首页导航栏会出现Reportal链接,但是目前还无法正常运行report任务

Azkaban Executor Server的部署

解压部署

解压azkaban-executor-server-2.5.0.tar.gz到安装目录,为了方便描述,假设该路径为${AZKABAN_EXECUTOR_SERVER}。这个版本的azkaban在lib中自带了mysql-connector-java-5.1.28.jar,如果版本不一致请自行替换。

配置

修改${AZKABAN_EXECUTOR_SERVER}/conf/azkaban.properties
  • 设置时区
    default.timezone.id=Asia/Shanghai
  • 设置数据库,与Web Server中的数据库设置一致

启动/停止服务

  • 启动 - 与Web Server的启动/停止类似,首先在${AZKABAN_EXECUTOR_SERVER}目录下创建logs,然后进入${AZKABAN_EXECUTOR_SERVER}目录,运行如下命令启动:
    bin/start-exec.sh
  • 停止 - 在${AZKABAN_EXECUTOR_SERVER}目录下运行如下命令停止:
    bin/azkaban-executor-shutdown.sh

插件安装准备

进入${AZKABAN_EXECUTOR_SERVER}/plugins目录,在该目录下解压azkaban-jobtype-2.5.0.tar.gz得到目录:azkaban-jobtype-2.5.0。将该目录更名为jobtypes。这个目录用来存放之后安装的所有插件,与Web Server中的viewer目录类似。每次插件的安装配置需要重启Executor Server。
修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/common.properties,设置hadoop.home和hive.home,与你的环境变量HADOOP_HOME和HIVE_HOME分布保持一致。例如:
[java] view plain copy
  1. hadoop.home=/usr/local/hadoop  
  2. hive.home=/opt/hive  
修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties,同样需要设置hadoop.home和hive.home。另外修改jobtype.global.classpath。例如:
[java] view plain copy
  1. hadoop.home=/usr/local/hadoop  
  2. hive.home=/opt/hive  
  3. jobtype.global.classpath=${hadoop.home}/etc/hadoop,${hadoop.home}/share/hadoop/common/*,${hadoop.home}/share/hadoop/common/lib/*,${hadoop.home}/share/hadoop/hdfs/*,${hadoop.home}/share/hadoop/hdfs/lib/*,${hadoop.home}/share/hadoop/yarn/*,${hadoop.home}/share/hadoop/yarn/lib/*,${hadoop.home}/share/hadoop/mapreduce/*,${hadoop.home}/share/hadoop/mapreduce/lib/*  

安装Hive插件

在上步中hive插件已经被安装了,这里主要是如何配置hive插件。

  1. 配置
    在配置之前需要注意的是,azkaban默认hive aux lib的目录是$HIVE_HOME/aux/lib,所以请在$HIVE_HOME目录下创建相应的目录,或者修改下面提到的两个配置文件中的hive.aux.jars.path和hive.aux.jar.path为你期望的路径,此外我在这两个属性值都加上file://,来指定使用本地文件。
    1.1. 修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/private.properties,如下:
    [java] view plain copy
    1. jobtype.classpath=${hive.home}/conf,${hive.home}/lib/*  
    2. hive.aux.jar.path=file://${hive.home}/aux/lib  
    jobtype.classpath与${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties中的jobtype.global.classpath一起组合成hive任务的classpath。所以这两个属性如何赋值,可以灵活设置,保证classpath是你要的即可。
    1.2. 修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/plugin.properties,如下:
    [java] view plain copy
    1. hive.aux.jars.path=file://${hive.home}/aux/lib  
  2. 源码的修改与编译
    这个版本的Azkaban中的${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/azkaban-jobtype-2.5.0.jar有bug,在Hadoop2.5.1上(其他2.x未验证),运行hive任务会抛出如下异常:
    [java] view plain copy
    1. Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hive.shims.HadoopShims.usesJobShell()Z  
    2.      at azkaban.jobtype.HadoopSecureHiveWrapper.runHive(HadoopSecureHiveWrapper.java:148)  
    3.      at azkaban.jobtype.HadoopSecureHiveWrapper.main(HadoopSecureHiveWrapper.java:115)  
    解决办法是修改${AZKABAN_PLUGINS_SOURCE}/plugins/jobtype/src/azkaban/jobtype/HadoopSecureHiveWrapper.java,找到如下代码片段:
    [java] view plain copy
    1. if (!ShimLoader.getHadoopShims().usesJobShell()) {  
    2. ...  
    3. ...  
    4. }  
    将其中的if条件去掉,也就是删除两行。然后进入${AZKABAN_PLUGINS_SOURCE}/plugins/hadoopsecuritymanager/目录,运行:
    sudo ant
    再进入${AZKABAN_PLUGINS_SOURCE}/plugins/jobtype,同样运行:
    sudo ant
    成功后会生成${AZKABAN_PLUGINS_SOURCE}/dist/jobtype/jars/azkaban-jobtype-2.5.0-rc3.jar,使用这个jar来替换${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/azkaban-jobtype-2.5.0.jar。

安装Reportalhive插件

  1. 解压部署
    解压azkaban-reportal-2.5.0.tar.gz,将jobtypes/reportalhive/拷贝到${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes目录。完整的目录路径是:${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/reportalhive。
  2. 更新依赖jar
    在Reportalhive插件根目录下的azkaban-hadoopsecuritymanager-2.2.jar和azkaban-jobtype-2.1.jar两个jar和当前版本不一致。需要用hive插件中的对应jar(${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive)来替换掉这两个jar,否则在运行report任务时会如下报错:
    [java] view plain copy
    1. Exception in thread "main" java.lang.ClassNotFoundException: azkaban.jobtype.ReportalHiveRunner  
    2.      at java.net.URLClassLoader$1.run(URLClassLoader.java:366)  
    3.      at java.net.URLClassLoader$1.run(URLClassLoader.java:355)  
    4.      at java.security.AccessController.doPrivileged(Native Method)  
    5.      at java.net.URLClassLoader.findClass(URLClassLoader.java:354)  
    6.      at java.lang.ClassLoader.loadClass(ClassLoader.java:425)  
    7.      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)  
    8.      at java.lang.ClassLoader.loadClass(ClassLoader.java:358)  
    9.      at azkaban.jobtype.HadoopJavaJobRunnerMain.getObject(HadoopJavaJobRunnerMain.java:299)  
    10.      at azkaban.jobtype.HadoopJavaJobRunnerMain.(HadoopJavaJobRunnerMain.java:146)  
    11.      at azkaban.jobtype.HadoopJavaJobRunnerMain.main(HadoopJavaJobRunnerMain.java:76)  
    ${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/reportalhive/lib/azkaban-reportal-2.5.jar也有bug,需要修改${AZKABAN_PLUGINS_SOURCE}/plugins/reportal/src/azkaban/jobtype/ReportalHiveRunner.java文件,找到如下代码片段:
    [java] view plain copy
    1. if (!ShimLoader.getHadoopShims().usesJobShell()) {  
    2. ...  
    3. ...  
    4. }  
    删除if条件,然后进入${AZKABAN_PLUGINS_SOURCE}/plugins/reportal,运行sudo ant生成${AZKABAN_PLUGINS_SOURCE}/dist/reportal/jars/azkaban-reportal-2.5.jar,用这个jar来替换掉${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/reportalhive/lib/azkaban-reportal-2.5.jar,否则在运行report任务时会报如下错误:
    [java] view plain copy
    1. Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hive.shims.HadoopShims.usesJobShell()Z  
    2.      at azkaban.jobtype.HadoopSecureHiveWrapper.runHive(HadoopSecureHiveWrapper.java:148)  
    3.      at azkaban.jobtype.HadoopSecureHiveWrapper.main(HadoopSecureHiveWrapper.java:115)  
  3. 配置Reportalhive
    3.1. 配置plugin.properties
    可以注释掉hive.home,因为我们在${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/common.properties和${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties中已经配置过了,其他修改的属性:
    [java] view plain copy
    1. hive.aux.jars.path=file://${hive.home}/aux/lib  
    2. hadoop.dir.conf=${hadoop.home}/etc/hadoop  
    hive.aux.jars.path - 使用本地的hive aux lib,如果使用hdfs,将file改为hdfs即可 
    hadoop.dir.conf - hadoop2的配置目录与hadoop1不一样,请注意修改

    3.2. 配置private.properties
    同上,可以注释掉hive.home,其他修改的属性:
    [java] view plain copy
    1. jobtype.classpath=${hadoop.home}/conf,${hadoop.home}/lib/*,${hive.home}/lib/*,./lib/*  
    2. hive.aux.jars.path=file://${hive.home}/aux/lib  
    3. hadoop.dir.conf=${hadoop.home}/etc/hadoop  
    4. #jobtype.global.classpath=  
    5. #hive.classpath.items=  
    jobtype.classpath - 与hive插件的配置不一样,需要将插件本身的lib目录加入到classpath,以使用azkaban-reportal-2.5.jar,否则会报错。
    jobtype.global.classpath - 已在${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties中定义,可以注释掉。
    hive.classpath.items - 未用,也可以注释掉。
  4. 效果


最后,部署完毕,可以运行多种任务了

  • 上一篇贫农的大数据之五(Hadoop集群部署)
  • 下一篇什么时候面向文档NoSQL数据库可以代替SQL数据库
0
0

我的同类文章

Hadoop (1) 大数据 (4)
  • 贫农的大数据之五(Hadoop集群部署)
主题推荐
hadoop centos mysql java path hadoop集群 64位 服务器 namenode
猜你在找
JavaWeb程序设计 JavaWeb基础核心技术 外行人遁入Java Web入门 Java Web快速入门 Java Web进阶开发
CentOS环境下安装Hadoop集群 Centos56下利用Ambari搭建Hadoop集群Hotonworks框架 centos下安装ganglia监控hadoop集群 CentOS系统下的Hadoop集群第2期_机器信息分布表 Hadoop集群安全性Hadoop中Namenode单点故障的解决方案及详细介绍AvatarNode
查看评论
1楼  llll20000 2015-07-20 16:15发表  [回复]
安装HDFS插件后,报错:Error: Cannot get FileSystem,请问这是什么原因?
Re:  long1657 2015-08-26 21:26发表  [回复]
回复llll20000:请问一下,你的这个问题找到原因没?
您还没有登录,请[登录]或 [注册]
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
核心技术类目
全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker OpenStack VPN Spark ERP IE10 Eclipse CRM JavaScript 数据库 Ubuntu NFC WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone  CouchBase 云计算 iOS6 Rackspace  Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap
  • 个人资料

tambac
  • 访问:3497次
  • 积分:125
  • 等级: 
  • 排名:千里之外
  • 原创:8篇
  • 转载:0篇
  • 译文:0篇
  • 评论:6条
  • 文章搜索
  • 文章分类
  • Hadoop(2)
  • 大数据(5)
  • MQ(1)
  • NoSQL(1)
  • 文章存档
2015年06月(1) 2014年10月(1) 2014年04月(6)
  • 阅读排行
  • Azkaban2.5.0与Hadoop2.5.1的集成(1035)
  • 贫农的大数据之二(Kafka)(612)
  • 贫农的大数据之三(Storm集群部署)(484)
  • 贫农的大数据之四(Storm简介及开发)(386)
  • 贫农的大数据之五(Hadoop集群部署)(319)
  • 贫农的大数据之一(设计篇)(270)
  • 开博纪(115)
  • 什么时候面向文档NoSQL数据库可以代替SQL数据库(48)
  • 评论排行
  • Azkaban2.5.0与Hadoop2.5.1的集成(2)
  • 贫农的大数据之一(设计篇)(1)
  • 贫农的大数据之二(Kafka)(1)
  • 贫农的大数据之三(Storm集群部署)(1)
  • 什么时候面向文档NoSQL数据库可以代替SQL数据库(1)
  • 开博纪(0)
  • 贫农的大数据之四(Storm简介及开发)(0)
  • 贫农的大数据之五(Hadoop集群部署)(0)
  • 推荐文章
  • *Hadoop节点"慢磁盘"监控
  • *假如你想成为全栈工程师…
  • *没有躲过的坑--正则表达式截取字符串
  • *CardView完全解析与RecyclerView结合使用(三十二)
  • *And roid 高仿微信发朋友圈浏览图片效果
  • *通过Ajax的方式执行GP服务
  • 最新评论
  • Azkaban2.5.0与Hadoop2.5.1的集成

    long1657: @llll20000:请问一下,你的这个问题找到原因没?

  • 贫农的大数据之二(Kafka)

    erzhanchen: 这是用什么工具测试的啊,求指导啊

  • 什么时候面向文档NoSQL数据库可以代替SQL数据库

    urmysapple: 一年更新一次,语气还超酷的

  • Azkaban2.5.0与Hadoop2.5.1的集成

    llll20000: 安装HDFS插件后,报错:Error: Cannot get FileSystem,请问这是什么原因...

  • 贫农的大数据之三(Storm集群部署)

    smallacmer: 想问下出现这种情况怎么解决configure: error: the JAVA_HOME envir...

公司简介| 招贤纳士| 广告服务| 银行汇款帐号| 联系方式| 版权声明| 法律顾问| 问题报告| 合作伙伴| 论坛反馈
网站客服 杂志客服 微博客服 [email protected] 400-600-2320|北京创新乐知信息技术有限公司 版权所有|江苏乐知网络技术有限公司 提供商务支持
京 ICP 证 09002463 号|Copyright © 1999-2014, CSDN.NET, All Rights Reserved 

你可能感兴趣的:(Azkaban)