先说下hadoop 内置工作流的不足

(1)支持job单一

(2)硬编码

(3)无可视化

(4)无调度机制

(5)无容错机制

在这种情况下Azkaban就出现了

1)Azkaban是什么

Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。

2)Azkaban的功能特点

①Web用户界面

②方便上传工作流

③方便设置任务之间的关系

④工作流调度

⑤认证/授权

⑥能够杀死并重新启动工作流

⑦模块化和可插拔的插件机制

⑧项目工作区

⑨工作流和任务的日志记录和审计

3)Azkaban的架构

MySQL实例 – Azkaban使用MySQL来存储项目和执行

Azkaban Web服务器 – Azkaban使用Jetty作为Web服务器,用作控制器以及提供Web界面

Azkaban执行服务器 – Azkaban执行服务器执行提交工作流

4)Azkaban三种运行模式

①solo server mode

H2

web server和executor server运行在一个进程里

②two server mode

MySQL(主从结构)

web server和executor server运行在不同的进程

③multiple executor mode

MySQL(主从结构)

web server和executor server运行在不同的进程

executor server有多个

Azkaban 安装部署

系统时区配置

  1. 1.查看时区
  2. [xxx@single azkaban-web-2.5.0]$ more /etc/sysconfig/clock
  3. ZONE="Asia/Shanghai"
  4. UTC=true
  5. ARC=false
  6. 2.修改时区
  7.  
  8. 时区文件都在/usr/share/zoneinfo,复制相应时区覆盖/etc/localtime即可
  9.  
  10. [lijia@single azkaban-web-2.5.0]$ ll /usr/share/zoneinfo
  11. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  12. *修改web server excutor server 都需要配置时区,必须和系统时区一致
  13.  
  14. default.timezone.id=Asia/Shanghai

安装mysql

配置mysql

下载mysql数据脚本

  1. wget https://s3.amazonaws.com/azkaban2/azkaban2/2.5.0/azkaban-sql-script-2.5.0.tar.gz
  2. tar -zxvf azkaban-sql-script-2.5.0.tar.gz C ~/azkaban/
  3. 创建用户、分配权限并执行脚本
  4.  
  5. mysql uroot pxxxx
  6. 创建数据库: CREATE DATABASE azkaban;
  7. 创建用户名:CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban'
  8. 分配权限:GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,INDEX ON `azkaban`.* TO 'azkaban'@'%' WITH GRANT OPTION;
  9. flush privileges
  10. quit;
  11. 通过azkaban账号登录mysqlmysql uazkaban pazkaban
  12. Use azkaban;
  13. source ~/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql

Azkaban Web Server 安装

  1. 1.下载安装包
  2.  
  3. wget https://s3.amazonaws.com/azkaban2/azkaban2/2.5.0/azkaban-web-server-2.5.0.tar.gz
  4. tar zxvf azkaban-web-server-2.5.0.tar.gz C ~/azkaban/
  5. 2.上传依赖包
  6.  
  7. 上传mysql驱动包至 ~/azkaban/azkaban-web-2.5.0/extlib/
  8.  
  9. 3.生成jetty ssl所需密钥文件
  10.  
  11. keytool -keystore keystore -alias jetty -genkey -keyalg RSA
  12. Enter keystore password: mysteel
  13. What is your first and last name?
  14. [Unknown]: mysteel
  15. What is the name of your organizational unit?
  16. [Unknown]: mysteel
  17. What is the name of your organization?
  18. [Unknown]: mysteel
  19. What is the name of your City or Locality?
  20. [Unknown]:SH
  21. What is the name of your State or Province?
  22. [Unknown]:SH
  23. What is the two-letter country code for this unit?
  24. [Unknown]:CN
  25. Is CN=mysteel, OU= mysteel, O= mysteel, L=SH, ST=SH, C=CN correct?
  26. [no]: yes
  27. Enter key password for < mysteel >
  28. (RETURN if same as keystore password): mysteel

注意:这里keystore的密码为mysteel,key的密码为mysteel可自行修改 最后将生成的keystore文件放到 Azkaban安装目录中~/azkaban/azkaban-web-2.5.0/ (也可通过修改配置文件改变其默认存放地址)

4.修改配置文件 (conf/azkaban.propreties)

  1. 修改首页样式及时区信息
  2.  
  3. azkaban.name=Job Tasks
  4. azkaban.label=mysteel workflow
  5. azkaban.color=#FF3601
  6. azkaban.default.servlet.path=/index
  7. web.resource.dir=web/
  8. default.timezone.id=Asia/Shanghai
  9. 修改mysql连接,可自行修改
  10.  
  11. database.type=mysql
  12. mysql.port=3306
  13. mysql.host=192.168.200.184
  14. mysql.database=azkaban
  15. mysql.user=azkaban
  16. mysql.password=azkaban
  17. mysql.numconnections=100
  18. 修改 Jetty 服务器属性,包括 keystore 的相关配置
  19.  
  20. jetty.maxThreads=25
  21. jetty.ssl.port=8443
  22. jetty.port=8081
  23. jetty.keystore=keystore
  24. jetty.password=mysteel
  25. jetty.keypassword= mysteel
  26. jetty.truststore=keystore
  27. jetty.trustpassword= mysteel
  28. 修改邮件设置(可选)
  29.  
  30. mail.sender=xxxxxxx@mysteel.com
  31. mail.host=smtp.126.com
  32. mail.user= xxxxxxx@mysteel.com
  33. mail.password=xxx (注:发送邮箱的密码)

5.用户及权限配置

  1. 进入 azkaban web 服务器 conf 目录,修改 azkaban-users.xml ,增加管理员用户:
  2.  
  3. < azkaban-users>
  4. < user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
  5. < user username="metrics" password="metrics" roles="metrics"/>
  6. < user username="admin" password="admin" roles="admin,metrics" />
  7. < role name="admin" permissions="ADMIN" />
  8. < role name="metrics" permissions="METRICS"/>
  9. < /azkaban-users>

Azkaban Executor Server安装

  1. 1.下载安装包
  2.  
  3. wget https://s3.amazonaws.com/azkaban2/azkaban2/2.5.0/azkaban-executor-server-2.5.0.tar.gz
  4. tar zxvf azkaban-executor-server-2.5.0.tar.gz C ~/azkaban/
  5. 2.修改配置文件 (conf/azkaban.propreties)
  6.  
  7. 修改时区信息
  8.  
  9. default.timezone.id=Asia/Shanghai
  10. 修改mysql连接,可自行修改
  11.  
  12. database.type=mysql
  13. mysql.port=3306
  14. mysql.host=192.168.200.184
  15. mysql.database=azkaban
  16. mysql.user=azkaban
  17. mysql.password=azkaban
  18. mysql.numconnections=100
  19. 配置端口,默认就好
  20.  
  21. executor.maxThreads=50
  22. executor.port=12321
  23. executor.flow.threads=30
  24. web server azkaban.properties配置executor的连接,特别注意,如果两个server不是在一台主机上,web server 需要配置executor.host
  25.  
  26. # Azkaban Executor settings
  27. executor.port=12321
  28. executor.host=ip/hostname
  29. 启动验证
  30.  
  31. 启动web server
  32.  
  33. ~/azkaban/azkaban-web-2.5.0/bin/azkaban-web-start.shazkaban-web-shutdown.sh停止)
  34. 访问 https://ip:8443 出现界面安装成功
  35. 启动 executor server
  36.  
  37. ~/azkaban/azkaban-executor-2.5.0/bin/azkaban-exec-start.sh(azkaban-executor-shutdown.sh 停止

Azkaban web server插件安装

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

安装HDFS Viewer插件

1.解压插件

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需要以下依赖:

  1. commons-cli-1.2.jarhadoop-auth-2.5.1.jarhadoop-common-2.5.1.jar
  2. hadoop-hdfs-2.5.1.jarprotobuf-java-2.5.0.jar

注:这么做的缺点是以后hadoop如果升级,要将这些jar更新

4.查看效果

注意:如果hadoop集群已经有了用户及权限验证,需要配置代理用户等信息,具体请参考官方文档(http://azkaban.github.io/azkaban/docs/latest/#hadoopsecuritymanager)

安装Job Summary插件

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

3.查看效果

安装Reportal插件

Reportal插件的安装不仅是要在Azkaban Web Server上进行(Viewer插件),也需要在Azkaban Executor Server上进行(Jobtype插件)。本小节主要是说明如何在前者上的安装;后者上的安装参考Azkaban Executor Server的安装和部署。

  1. 1.解压插件
  2.  
  3. 由于azkaban-reportal-2.5.0.tar.gz中不仅包含Viewer插件,还包含Jobtype插件,所以先在一个临时目录中解压这个包,然后将解压得到的viewer/reportal/目录拷贝到上步中的viewer目录下。最终这个插件的目录路径为:
  4.  
  5. ${AZKABAN_WEB_SERVER}/plugins/viewer/reportal
  6. 2.配置Reportal Viewer
  7.  
  8. 修改${AZKABAN_WEB_SERVER}/plugins/viewer/reportal/conf/plugin.properties。由于Web ServerExecutor Server是分开部署,不能使用本地文件存储report任务的结果,而是用hdfs存储:
  9.  
  10. reportal.output.filesystem=hdfs

3.效果

配置成功后,首页导航栏会出现Reportal链接

Azkaban Executor Server 插件安装

进入${AZKABAN_EXECUTOR_SERVER}/plugins目录,在该目录下解压azkaban-jobtype-2.5.0.tar.gz得到目录:azkaban-jobtype-2.5.0。将该目录更名为jobtypes。这个目录用来存放之后安装的所有插件,与Web Server中的viewer目录类似。每次插件的安装配置需要重启Executor Server。

  1. 1.修改配置文件
  2.  
  3. 修改common.properties
  4.  
  5. 修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/common.properties,设置hadoop.homehive.home,与你的环境变量HADOOP_HOMEHIVE_HOME分布保持一致。例如:
  6.  
  7. hadoop.home=/usr/local/hadoop
  8. hive.home=/opt/hive
  9. 修改commonprivate.properties
  10.  
  11. 修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties,同样需要设置hadoop.homehive.home。另外修改jobtype.global.classpath。例如:
  12.  
  13. hadoop.home=/usr/local/hadoop
  14. hive.home=/opt/hive
  15. 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/*

2.安装Hive插件

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

配置

在配置之前需要注意的是,azkaban默认hive aux lib的目录是$HIVE_HOME/aux/lib,所以请在$HIVE_HOME目录下创建相应的目录,或者修改下面提到的两个配置文件中的hive.aux.jars.path和hive.aux.jar.path为你期望的路径,此外我在这两个属性值都加上file://,来指定使用本地文件。

修改private.properties

修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/private.properties,如下:

  1. jobtype.classpath=${hive.home}/conf,${hive.home}/lib/*
  2. hive.aux.jar.path=file://${hive.home}/aux/lib
  3. jobtype.classpath与${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties中的jobtype.global.classpath一起组合成hive任务的classpath。所以这两个属性如何赋值,可以灵活设置,保证classpath是你要的即可。

修改plugin.properties

修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/plugin.properties,如下:

  1. hive.aux.jars.path=file://${hive.home}/aux/lib

源码的修改与编译

这个版本的Azkaban中的${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/azkaban-jobtype-2.5.0.jar有bug,在Hadoop2.5.1上(其他2.x未验证),运行hive任务会抛出如下异常:

  1. Exception in thread "main" java.lang.NoSuchMethodError:
  2. org.apache.hadoop.hive.shims.HadoopShims.usesJobShell()Z
  3. at azkaban.jobtype.HadoopSecureHiveWrapper.runHive(HadoopSecureHiveWrapper.java:148)
  4. at azkaban.jobtype.HadoopSecureHiveWrapper.main(HadoopSecureHiveWrapper.java:115)
  5. 解决办法是修改
  6. ${AZKABAN_PLUGINS_SOURCE}/plugins/jobtype/src/azkaban/jobtype/HadoopSecureHiveWrapper.java,找到如下代码片段:
  7. if (!ShimLoader.getHadoopShims().usesJobShell()) {
  8. }
  9. 将其中的if条件去掉,也就是删除两行。然后进入
  10. ${AZKABAN_PLUGINS_SOURCE}/plugins/hadoopsecuritymanager/目录,运行:
  11. sudo ant
  12. 再进入${AZKABAN_PLUGINS_SOURCE}/plugins/jobtype,同样运行:
  13. sudo ant
  14. 成功后会生成${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任务时会如下报错:

  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)
  12. ${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/reportalhive/lib/azkaban-reportal-2.5.jar也有bug
  13. 需要修改
  14. ${AZKABAN_PLUGINS_SOURCE}/plugins/reportal/src/azkaban/jobtype/ReportalHiveRunner.java文件,找到如下代码片段:
  15. if (!ShimLoader.getHadoopShims().usesJobShell()) {.
  16. }
  17. 删除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任务时会报如下错误:
  18. Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hive.shims.HadoopShims.usesJobShell()Z
  19. at azkaban.jobtype.HadoopSecureHiveWrapper.runHive(HadoopSecureHiveWrapper.java:148)
  20. at azkaban.jobtype.HadoopSecureHiveWrapper.main(HadoopSecureHiveWrapper.java:115)

3.配置Reportalhive

配置plugin.properties

可以注释掉hive.home,因为我们在${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/common.properties和${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties中已经配置过了,其他修改的属性:

  1. hive.aux.jars.path=file://${hive.home}/aux/lib
  2. hadoop.dir.conf=${hadoop.home}/etc/Hadoop
  3. hive.aux.jars.path - 使用本地的hive aux lib,如果使用hdfs,将file改为hdfs即可
  4. hadoop.dir.conf - hadoop2的配置目录与hadoop1不一样,请注意修改

配置private.properties

同上,可以注释掉hive.home,其他修改的属性:

  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.classpath - 与hive插件的配置不一样,需要将插件本身的lib目录加入到classpath,以使用azkaban-reportal-2.5.jar,否则会报错。
  5. jobtype.global.classpath - 已在${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties中定义,可以注释掉。
  6. hive.classpath.items - 未用,也可以注释掉。

4.效果

Ajax API适用

http://azkaban.github.io/azkaban/docs/latest/#ajax-api

Web 界面操作

http://azkaban.github.io/azkaban/docs/latest/#using-azkaban

初识Azkaban的更多相关文章

  1. 从源码看Azkaban作业流下发过程

    上一篇零散地罗列了看源码时记录的一些类的信息,这篇完整介绍一个作业流在Azkaban中的执行过程,希望可以帮助刚刚接手Azkaban相关工作的开发.测试. 一.Azkaban简介 Azkaban作为开 ...

  2. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  3. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  4. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  5. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

  6. UI篇(初识君面)

    我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...

  7. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  8. 初识SpringMvc

    初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...

  9. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

随机推荐

  1. a different object with the same identifier value was already associated with the session:

    hibernate操作: 实例化两个model类,更新时会提示  a different object with the same identifier value was already assoc ...

  2. 如何在 Visual Studio 中使用 Git 同步代码到 CodePlex

    开源社区不管在国内还是国外都很火热,微软也曾因为没有开源而倍受指责,但是随着 .Net framework.ASP.Net MVC等框架的逐渐开源,也让大家看到了微软开源的步伐.CodePlex 则是 ...

  3. 简单使用Git和Github来管理自己的代码和读书笔记

    原文链接:http://my.oschina.net/bxxfighting/blog/378196   先注册github.com的账号官方网站: https://github.com/ 注册界面, ...

  4. nginx源码分析之hash的实现

    nginx实现了自己的hash数据结构,正如数据结构中讲述的那样,nginx用开放链表法解决冲突,不过不同的是一旦一个hash表被初始化后就不会被修改,即插入和删除,只进行查询操作,所以nginx通过 ...

  5. Oracle 故障处理总结

    Oracle 故障处理总结(更新中..) 各类数据库问题描述模板 记录一则ORA-00054,ORA-00031解决过程 记录一则ORACLE MOVE操作后重建索引过程被强制中断导致的ORA-810 ...

  6. 探寻<a>中的href和onclick

    一.知识点: onclick的方法参数必须加引号 href跳转参数有长度限制 href中执行js会把encodeURIComponent()编码之后的东西自动解码,有时会影响参数传递 a标签中的onc ...

  7. .NET 开源SqlServer ORM框架 SqlSugar 3.0 API

    3.1.x ,将作为3.X系统的最后一个版本,下面将会开发 全新的功能 更新列表:https://github.com/sunkaixuan/SqlSugar/releases 优点: SqlSuga ...

  8. 游戏启示录 关于Update的相关问题

    游戏启示录 关于Update的相关问题 这里说的Update是指的游戏的主循环.一般情况下.为了程序的方便控制我们一般只会有一个主循环.所有的游戏逻辑都会在这一个循环中完成.(额,其实这么做有点浪费. ...

  9. 学会给你的类(及成员)来定制一套自己的Attribute吧

    在通过Visual Studio创建的C#程序集中,都包含了一个AssemblyInfo.cs的文件,在这个文件中,我们常常会看到这样的代码 [assembly: AssemblyTitle(&quo ...

  10. 在DevExpress程序中使用TeeList控件以及节点查询的处理

    在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件, ...