Azkaban-2.5.0-部署与常见案例
该文章是基于 Hadoop2.7.6_01_部署 、 Hive-1.2.1_01_安装部署 进行的
1. 前言
在一个完整的大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集、结果数据导出、任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中都有便捷的开源框架,如图所示:

2. 工作流调度器azkaban概述
2.1. 为什么需要工作流调度系统
- 一个完整的数据分析系统通常都是由大量任务单元组成:
shell脚本程序,java程序,mapreduce程序、hive脚本等
- 各任务单元之间存在时间先后及前后依赖关系
- 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行;
例如,我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下所示:
1、 通过Hadoop先将原始数据同步到HDFS上;
2、 借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;
3、 需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表;
4、 将明细数据进行复杂的统计分析,得到结果报表信息;
5、 需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。
2.2. 工作流调度实现方式
简单的任务调度:直接使用linux的crontab来定义;
复杂的任务调度:开发调度平台
或使用现成的开源调度系统,比如ooize、azkaban等
2.3. 常见工作流调度系统
市面上目前有许多工作流调度器
在hadoop领域,常见的工作流调度器有Oozie, Azkaban,Cascading,Hamake等
2.4. Azkaban与Oozie对比
对市面上最流行的两种调度器,给出以下详细对比,以供技术选型参考。总体来说,ooize相比azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。如果可以不在意某些功能的缺失,轻量级调度器azkaban是很不错的候选对象。
详情如下:
- 功能
两者均可以调度mapreduce,pig,java,脚本工作流任务
两者均可以定时执行工作流任务
- 工作流定义
Azkaban使用Properties文件定义工作流
Oozie使用XML文件定义工作流
- 工作流传参
Azkaban支持直接传参,例如${input}
Oozie支持参数和EL表达式,例如${fs:dirSize(myInputDir)}
- 定时执行
Azkaban的定时执行任务是基于时间的
Oozie的定时执行任务基于时间和输入数据
- 资源管理
Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等操作
Oozie暂无严格的权限控制
- 工作流执行
Azkaban有两种运行模式,分别是solo server mode(executor server和web server部署在同一台节点)和multi server mode(executor server和web server可以部署在不同节点)
Oozie作为工作流服务器运行,支持多用户和多工作流
- 工作流管理
Azkaban支持浏览器以及ajax方式操作工作流
Oozie支持命令行、HTTP REST、Java API、浏览器操作工作流
3. Azkaban介绍
Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
它有如下功能特点:
Web用户界面
方便上传工作流
方便设置任务之间的关系
调度工作流
认证/授权(权限的工作)
能够杀死并重新启动工作流
模块化和可插拔的插件机制
项目工作区
工作流和任务的日志记录和审计
3.1. Azkaban使用MySQL存储state的信息
AzkabanWebServer和AzkabanExecutorServer 都是能够访问MySQL的
web server使用DB的原因如下:
Project Management 项目,项目的权限以及上传的文件
Executing Flow State 跟踪执行流,执行程序运行它们
Previous Flow/Jobs 搜索之前的作业和流程执行,以及访问他们的日志文件
Scheduler 保持预定的工作状态
SLA 保持所有sla规则
executor server使用DB的原因如下:
Access the project 从数据库中检索项目文件
Executing Flows/Jobs 检索和更新 流和正在执行的数据
Logs 将输出日志存储到作业中并流入到db中
Interflow dependency 如果流在不同的执行器上运行,则它将从DB中获取状态
4. Azkaban安装部署
将安装文件上传到集群,最好上传到安装 hive、sqoop的机器上,方便命令的执行
准备工作
Azkaban Web服务器
azkaban-web-server-2.5.0.tar.gz
Azkaban执行服务器
azkaban-executor-server-2.5.0.tar.gz
MySQL
azkaban-2.5.0只支持 mysql,需安装mysql服务器,本文档中默认已安装好mysql服务器,下文中会建立 azkaban用户,密码 azkaban.
# 相关信息
[yun@mini01 azkaban]$ pwd
/app/software/azkaban
[yun@mini01 azkaban]$ ll
total
-rw-r--r-- yun yun May : azkaban-executor-server-2.5..tar.gz
-rw-r--r-- yun yun May : azkaban-sql-script-2.5..tar.gz
-rw-r--r-- yun yun May : azkaban-web-server-2.5..tar.gz
# 解压缩包
[yun@mini01 azkaban]$ tar xf azkaban-executor-server-2.5..tar.gz
[yun@mini01 azkaban]$ tar xf azkaban-web-server-2.5..tar.gz
[yun@mini01 azkaban]$ tar xf azkaban-sql-script-2.5..tar.gz
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : azkaban-2.5.
drwxrwxr-x yun yun Jul : azkaban-executor-2.5.
-rw-r--r-- yun yun May : azkaban-executor-server-2.5..tar.gz
-rw-r--r-- yun yun May : azkaban-sql-script-2.5..tar.gz
drwxrwxr-x yun yun Jul : azkaban-web-2.5.
-rw-r--r-- yun yun May : azkaban-web-server-2.5..tar.gz
4.1. MySQL部署
建库并授权
# 在mini03上操作
# 建库
MariaDB [(none)]> CREATE DATABASE azkaban DEFAULT CHARACTER SET utf8 ;
Query OK, row affected (0.00 sec) MariaDB [(none)]> show create database azkaban;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| azkaban | CREATE DATABASE `azkaban` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
row in set (0.00 sec) MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| azkaban |
| hive |
| mysql |
| performance_schema |
| test |
| zhang |
+--------------------+
rows in set (0.00 sec) # 授权
MariaDB [(none)]> grant all on azkaban.* to azkaban@'%' identified by 'azkaban';
Query OK, rows affected (0.00 sec) MariaDB [(none)]>
MariaDB [(none)]> flush privileges;
Query OK, rows affected (0.00 sec) MariaDB [(none)]> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| azkaban | % |
| hive | % |
| root | % |
| root | 127.0.0.1 |
| root | :: |
| | localhost |
| root | localhost |
| | mini03 |
| hive | mini03 |
| root | mini03 |
+---------+-----------+
rows in set (0.00 sec)
导入数据
# 在有azkaban的SQL语句机器上操作
[yun@mini01 azkaban-2.5.]$ pwd
/app/software/azkaban/azkaban-2.5.
[yun@mini01 azkaban-2.5.]$ ll
total
-rwxr-xr-x yun yun Apr create.active_executing_flows.sql
-rwxr-xr-x yun yun Apr create.active_sla.sql
-rwxr-xr-x yun yun Apr create-all-sql-2.5..sql # 包含所有库信息
-rwxr-xr-x yun yun Apr create.execution_flows.sql
-rwxr-xr-x yun yun Apr create.execution_jobs.sql
-rwxr-xr-x yun yun Apr create.execution_logs.sql
-rwxr-xr-x yun yun Apr create.project_events.sql
-rwxr-xr-x yun yun Apr create.project_files.sql
-rwxr-xr-x yun yun Apr create.project_flows.sql
-rwxr-xr-x yun yun Apr create.project_permissions.sql
-rwxr-xr-x yun yun Apr create.project_properties.sql
-rwxr-xr-x yun yun Apr create.projects.sql
-rwxr-xr-x yun yun Apr create.project_versions.sql
-rwxr-xr-x yun yun Apr create.properties.sql
-rwxr-xr-x yun yun Apr create.schedules.sql
-rwxr-xr-x yun yun Apr create.triggers.sql
-rwxr-xr-x yun yun Apr database.properties
-rwxr-xr-x yun yun Apr update-all-sql-2.1.sql
-rwxr-xr-x yun yun Apr update-all-sql-2.2.sql
-rwxr-xr-x yun yun Apr update.execution_logs.2.1.sql
-rwxr-xr-x yun yun Apr update.project_properties.2.1.sql
[yun@mini01 azkaban-2.5.]$ ll /app/software/azkaban/azkaban-2.5./create-all-sql-2.5..sql # 要导入的SQL文件
-rwxr-xr-x yun yun Apr /app/software/azkaban/azkaban-2.5./create-all-sql-2.5..sql
[yun@mini01 azkaban-2.5.]$
[yun@mini01 azkaban-2.5.]$ mysql -hmini03 -uazkaban -pazkaban
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is
Server version: 5.5.-MariaDB MariaDB Server Copyright (c) , , Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use azkaban; # 使用库
Database changed
MariaDB [azkaban]> source /app/software/azkaban/azkaban-2.5./create-all-sql-2.5..sql
………………
MariaDB [azkaban]> 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 |
+------------------------+
rows in set (0.00 sec)
4.2. azkaban执行服器和web服务器部署
[yun@mini01 azkaban]$ pwd
/app/software/azkaban
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : azkaban-2.5.
drwxrwxr-x yun yun Jul : azkaban-executor-2.5.
-rw-r--r-- yun yun May : azkaban-executor-server-2.5..tar.gz
-rw-r--r-- yun yun May : azkaban-sql-script-2.5..tar.gz
drwxrwxr-x yun yun Jul : azkaban-web-2.5.
-rw-r--r-- yun yun May : azkaban-web-server-2.5..tar.gz
# 先创建/app/azkaban/ 目录
[yun@mini01 azkaban]$ cp -a azkaban-executor-2.5. /app/azkaban/executor-2.5.
[yun@mini01 azkaban]$ cp -a azkaban-web-2.5. /app/azkaban/web-server-2.5.
[yun@mini01 azkaban]$ cd /app/azkaban/
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : executor-2.5.
drwxrwxr-x yun yun Jul : web-server-2.5.
4.3. 为azkaban创建SSL配置
[yun@mini01 azkaban]$ pwd
/app/azkaban
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : executor-2.5.
drwxrwxr-x yun yun Jul : web-server-2.5.
[yun@mini01 azkaban]$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA
Enter keystore password: # 输入123456
Re-enter new password: # 输入123456
What is your first and last name?
[Unknown]:
What is the name of your organizational unit?
[Unknown]:
What is the name of your organization?
[Unknown]:
What is the name of your City or Locality?
[Unknown]:
What is the name of your State or Province?
[Unknown]:
What is the two-letter country code for this unit?
[Unknown]: CN
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN correct?
[no]: yes Enter key password for <jetty>
(RETURN if same as keystore password):
# 查看生成的keystore
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : executor-2.5.
-rw-rw-r-- yun yun Jul : keystore
drwxrwxr-x yun yun Jul : web-server-2.5.
[yun@mini01 azkaban]$ cp -a keystore web-server-2.5./ # 将keystore拷贝到azkaban的web中
[yun@mini01 azkaban]$ ll web-server-2.5./
total
-rw-r--r-- yun yun Apr azkaban.version
drwxr-xr-x yun yun Apr bin
drwxr-xr-x yun yun Jul : conf
drwxr-xr-x yun yun Apr extlib
-rw-rw-r-- yun yun Jul : keystore
drwxr-xr-x yun yun Jul : lib
drwxr-xr-x yun yun Apr plugins
drwxr-xr-x yun yun Jul : web
4.4. 配置文件
注:先配置好服务器节点上的时区
1、先生成时区配置文件Asia/Shanghai,用交互式命令 tzselect 即可
2、拷贝该时区文件,覆盖系统本地时区配置
# 也可以是软连接
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
4.4.1. web服务器配置
[yun@mini01 conf]$ pwd
/app/azkaban/web-server-2.5./conf
[yun@mini01 conf]$ ll
total
-rw-r--r-- yun yun Jul : azkaban.properties
-rw-r--r-- yun yun Apr azkaban-users.xml
#### azkaban.properties 配置
[yun@mini01 conf]$ vim 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=
mysql.host=mini03
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections= #最大连接数 # Velocity dev mode
velocity.dev.mode=false # Azkaban Jetty server properties.
jetty.maxThreads= #最大线程数
jetty.ssl.port= #Jetty SSL端口
jetty.port= #Jetty端口
jetty.keystore=keystore #SSL文件名
jetty.password= #SSL文件密码
jetty.keypassword= #Jetty主密码 与 keystore文件相同
jetty.truststore=keystore #SSL文件名
jetty.trustpassword= # SSL文件密码 # Azkaban Executor settings
executor.port= #执行服务器端口 # mail settings
mail.sender= #发送邮箱
mail.host= #发送邮箱smtp地址
job.failure.email= #任务失败时发送邮件的地址
job.success.email= #任务成功时发送邮件的地址 lockdown.create.projects=false cache.directory=cache #缓存目录 ###### azkaban-users.xml 配置
[yun@mini01 conf]$ vim 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>
4.4.2. executor执行服务器配置
[yun@mini01 conf]$ pwd
/app/azkaban/executor-2.5./conf
[yun@mini01 conf]$ vim azkaban.properties
#Azkaban
default.timezone.id=Asia/Shanghai # Azkaban JobTypes Plugins
azkaban.jobtype.plugin.dir=plugins/jobtypes #jobtype 插件所在位置 #Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects database.type=mysql
mysql.port=
mysql.host=mini03
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections= #最大连接数 # Azkaban Executor settings
executor.maxThreads= #最大线程数
executor.port= #端口号(如修改,请与web服务中一致)
executor.flow.threads= #线程数
4.5. 启动azkaban
先执行executor,再执行web,避免Web Server会因为找不到执行器启动失败。
执行服务器
[yun@mini01 executor-2.5.]$ pwd
/app/azkaban/executor-2.5.
[yun@mini01 executor-2.5.]$ ./bin/azkaban-executor-start.sh
# 或者 nohup ./bin/azkaban-executor-start.sh > azkaban-exec_$(date +%Y%m%d%H%M%S).log &
# 方便查看日志
………………
web服务器
[yun@mini01 web-server-2.5.]$ pwd
/app/azkaban/web-server-2.5.
[yun@mini01 web-server-2.5.]$ ./bin/azkaban-web-start.sh # 日志会自己记录
………………
查看java进程
[yun@mini01 executor-2.5.]$ jps
AzkabanWebServer
AzkabanExecutorServer
Jps
4.6. 浏览器访问
https://mini01:8443/

使用admin登录之后

5. Azkaban实战
Azkaba内置的任务类型支持command、java
5.1. Command类型单一job示例
创建job描述文件
在Windows创建文件 command.job,内容如下
command.job
#command.job
type=command
# command=sh hello.sh
command=echo 'hello'
hello.sh
#!/bin/bash
echo 'hello World!' > /tmp/azkaban.info
将job资源文件打包成zip文件
zip command.job
创建project、上传包并执行
1、通过azkaban的web管理平台创建project并上传job压缩包
首先创建project

2、上传zip包

3、启动执行该job

5.2. Command类型多job工作流flow
1、创建有依赖关系的多个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
2、将所有job资源文件打到一个zip包中

3、在azkaban的web管理界面创建工程并上传zip包
4、启动工作流flow
5.3. HDFS操作任务
1、创建job描述文件
fs_01.job
# fs.job
type=command
command=/app/hadoop/bin/hadoop fs -mkdir -p /azkaban/test03_new
fs_02.job
# fs.job
type=command
dependencies=fs_01
command=/app/hadoop/bin/hadoop fs -put /app/software/apache-flume-1.8.-bin.tar.gz /azkaban/test03_new
2、将job资源文件打包成zip文件

3、通过azkaban的web管理平台创建project并上传job压缩包
4、启动执行该job
5.4. MAPREDUCE任务
Mr任务依然可以使用command的job类型来执行
1、创建job描述文件,及mr程序jar包(示例中直接使用hadoop自带的example jar)
mrwc_01.job
# mrwc.job
type=command
command=/app/hadoop/bin/hadoop fs -mkdir -p /azkaban/wordcount/input
mrwc_02.job
# mrwc.job
type=command
dependencies=mrwc_01
command=/app/hadoop/bin/hadoop fs -put test.info zhang.info /azkaban/wordcount/input
mrwc_03.job
# mrwc.job
type=command
dependencies=mrwc_02
command=/app/hadoop/bin/hadoop jar hadoop-mapreduce-examples-2.7..jar wordcount /azkaban/wordcount/input /azkaban/wordcount/output
test.info
zhang.info
zxcvbnm
asdfghjkl
qwertyuiop
qwertyuiop qwertyuiop
2、将job资源文件打包成zip文件

3、通过azkaban的web管理平台创建project并上传job压缩包
4、启动执行该job
部分截图如下


[yun@mini02 ~]$ hadoop fs -cat /azkaban/wordcount/output/part-r- asdfghjkl
qwertyuiop
zxcvbnm
5.5. HIVE脚本任务
1、创建job描述文件
hivef_01.job
# hivef.job
type=command
command=/app/hadoop/bin/hadoop fs -mkdir -p /aztest/hiveinput
hivef_01.job
# hivef.job
type=command
dependencies=hivef_01
command=/app/hadoop/bin/hadoop fs -put azkb.dat /aztest/hiveinput
hivef_03.job
# hivef.job
type=command
dependencies=hivef_02
command=/app/hive/bin/hive -f 'aztest.sql'
aztest.sql
CREATE DATABASE IF NOT EXISTS azkaban;
use azkaban;
DROP TABLE IF EXISTS aztest;
DROP TABLE IF EXISTS azres;
create table aztest(id int,name string) row format delimited fields terminated by ',';
load data inpath '/aztest/hiveinput/azkb.dat' into table aztest;
create table azres row format delimited fields terminated by '#' as select * from aztest;
insert overwrite directory '/aztest/hiveoutput' select count() from aztest;
azkb.dat
,刘晨晨
,王敏
,张立玉
,刘刚
2、将job资源文件打包成zip文件

3、通过azkaban的web管理平台创建project并上传job压缩包
4、启动执行该job
Azkaban-2.5.0-部署与常见案例的更多相关文章
- zabbix Server 4.0 部署及之内置item使用案例
zabbix Server 4.0 部署及之内置item使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zabbix组件架构概述(图片摘自网络) 1>.zabbi ...
- Azkaban学习之路(四)—— Azkaban Flow 2.0的使用
一.Flow 2.0 简介 1.1 Flow 2.0 的产生 Azkaban 目前同时支持 Flow 1.0 和 Flow2.0 ,但是官方文档上更推荐使用Flow 2.0,因为Flow 1.0会在将 ...
- 分布式任务调度框架 Azkaban —— Flow 2.0 的使用
一.Flow 2.0 简介 1.1 Flow 2.0 的产生 Azkaban 目前同时支持 Flow 1.0 和 Flow2.0 ,但是官方文档上更推荐使用 Flow 2.0,因为 Flow 1.0 ...
- jQuery常见案例
jQuery常见案例 通过jQuery实现全选,反选取消: 选择 地址 端口 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 代码实现 <body> ...
- iis 部署webapi常见错误及解决方案
iis 部署webapi常见错误及解决方案 错误一: 原因:asp.net web api部署在Windows服务器上后,按照WebAPI定义的路由访问,老是出现404,但定义一个静态文件从站点访问, ...
- Android内存溢出、内存泄漏常见案例及最佳实践总结
内存溢出是Android开发中一个老大难的问题,相关的知识点比较繁杂,绝大部分的开发者都零零星星知道一些,但难以全面.本篇文档会尽量从广度和深度两个方面进行整理,帮助大家梳理这方面的知识点(基于Jav ...
- Solr 4.0 部署实例教程
Solr 4.0 部署实例教程 Solr 4.0的入门基础教程,先说一点部署之后肯定会有人用solrj,solr 4.0好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为H ...
- ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- Azkaban 2.5.0 job type 插件安装
一.环境及软件 安装环境: 安装目录: /usr/local/ae/ankaban Hadoop 安装目录 export HADOOP_HOME=/usr/local/ae/hadoop-1.2.1 ...
- Azkaban 2.5.0 搭建
一.前言 最近试着参照官方文档搭建 Azkaban,发现文档很多地方有坑,所以在此记录一下. 二.环境及软件 安装环境: 系统环境: ubuntu-12.04.2-server-amd64 安装目录: ...
随机推荐
- bash回收站
通过替换rm命令使被删除的文件或文件夹被移动到-/.delete/日期文件夹,方便恢复 可以定期手动删除.delete文件夹或通过额外配置定期删除减少空间占用 # for rm {{ del_time ...
- 使用配置文件自定义Ribbon配置
1.application.yml——Ribbon配置文件 debug: false spring: application: name: mcc-ribbon-properties cloud: c ...
- LoadRuner12.53教程(一)
LoadRunner教程 L o a d R u n n e r jiào教 chéng程 Welcome to the LoadRunner tutori ...
- 【awesome-dotnet-core-learning】(1)-Sprache-解析器构建库
[awesome-dotnet-core-learning](1)-Sprache-解析器构建库 关于awesome-dotnet-core-learning .NET Core从2016年发布1.0 ...
- 深入学习Python解析并解密PDF文件内容的方法
前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容的方法. 链接如下:https://www.cnblogs.com/wj-1314/p/9429 ...
- 技术人员在小公司成长 vs 大公司成长路径和建议
我们经常听到这样的对话: 大公司猿A:真不想干了,每天都做类似的工作,学不到什么东西,会议也多,浪费不少时间,想去小公司多做些事情,多学些东西. 小公司猿B:累死了,什么都做,太乱太杂,没系统不规范, ...
- Springboot项目打包成jar运行2种方式
最近公司有个项目需要移植到SpringBoot框架上,项目里面又有许多第三方jar包,在linux服务器上最方便的就是用jar的方式来运行SpringBoot项目了,因此我研究了2种打jar包的方式, ...
- windows7安装flask-mysqldb遇到的坑
最近在windows环境上搭建flask使用环境,遇到过很多坑,这次就记录下安装flask-mysqldb所遇到的坑. 正常逻辑是使用pip install flask-mysqldb进行安装.但是会 ...
- POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)
题目链接: https://cn.vjudge.net/problem/POJ-1724 N cities named with numbers 1 ... N are connected with ...
- /proc文件系统(一):cpuinfo
0. 前言 /proc 文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间. 它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某 ...