文章目录

  • 17.0 全流程调度
    • 17.1 Azkaban部署
    • 17.2 创建MySQL数据库和表
    • 17.3 Sqoop导出脚本
    • 17.4 全调度流程
      • 17.4.1 数据准备
      • 17.4.2 编写Azkaban工作流程配置文件
      • 17.4.3 Azkaban多Executor模式下注意事项

上文访问:离线数仓搭建_15_ADS层数据构建
下文访问:尽请期待!

17.0 全流程调度

17.1 Azkaban部署

  详情见本人博客: https://blog.csdn.net/m0_58022371/article/details/127110533

17.2 创建MySQL数据库和表

注:SQL语句:

CREATE DATABASE `gmall_report` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

2)创建表

(1)访客统计

DROP TABLE IF EXISTS ads_visit_stats;
CREATE TABLE `ads_visit_stats` (`dt` DATE NOT NULL COMMENT '统计日期',`is_new` VARCHAR(255) NOT NULL COMMENT '新老标识,1:新,0:老',`recent_days` INT NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`channel` VARCHAR(255) NOT NULL COMMENT '渠道',`uv_count` BIGINT(20) DEFAULT NULL COMMENT '日活(访问人数)',`duration_sec` BIGINT(20) DEFAULT NULL COMMENT '页面停留总时长',`avg_duration_sec` BIGINT(20)  DEFAULT NULL COMMENT '一次会话,页面停留平均时长',`page_count` BIGINT(20) DEFAULT NULL COMMENT '页面总浏览数',`avg_page_count` BIGINT(20) DEFAULT NULL COMMENT '一次会话,页面平均浏览数',`sv_count` BIGINT(20) DEFAULT NULL COMMENT '会话次数',`bounce_count` BIGINT(20) DEFAULT NULL COMMENT '跳出数',`bounce_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '跳出率',PRIMARY KEY (`dt`,`recent_days`,`is_new`,`channel`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

(2)页面路径分析

DROP TABLE IF EXISTS ads_page_path;
CREATE TABLE `ads_page_path` (      `dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`source` VARCHAR(255) DEFAULT NULL COMMENT '跳转起始页面',`target` VARCHAR(255) DEFAULT NULL COMMENT '跳转终到页面',`path_count` BIGINT(255) DEFAULT NULL COMMENT '跳转次数',UNIQUE KEY (`dt`,`recent_days`,`source`,`target`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(3)用户统计

DROP TABLE IF EXISTS ads_user_total;
CREATE TABLE `ads_user_total` (          `dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,0:累积值,1:最近1天,7:最近7天,30:最近30天',`new_user_count` BIGINT(20) DEFAULT NULL COMMENT '新注册用户数',`new_order_user_count` BIGINT(20) DEFAULT NULL COMMENT '新增下单用户数',`order_final_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '下单总金额',`order_user_count` BIGINT(20) DEFAULT NULL COMMENT '下单用户数',`no_order_user_count` BIGINT(20) DEFAULT NULL COMMENT '未下单用户数(具体指活跃用户中未下单用户)',PRIMARY KEY (`dt`,`recent_days`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

(4)用户变动统计

DROP TABLE IF EXISTS ads_user_change;
CREATE TABLE `ads_user_change` (`dt` DATE NOT NULL COMMENT '统计日期',`user_churn_count` BIGINT(20) DEFAULT NULL  COMMENT '流失用户数',`user_back_count` BIGINT(20) DEFAULT NULL  COMMENT '回流用户数',PRIMARY KEY (`dt`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

(5)用户行为漏斗分析

DROP TABLE IF EXISTS ads_user_action;
CREATE TABLE `ads_user_action` (`dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`home_count` BIGINT(20) DEFAULT NULL COMMENT '浏览首页人数',`good_detail_count` BIGINT(20) DEFAULT NULL COMMENT '浏览商品详情页人数',`cart_count` BIGINT(20) DEFAULT NULL COMMENT '加入购物车人数',`order_count` BIGINT(20) DEFAULT NULL COMMENT '下单人数',`payment_count` BIGINT(20) DEFAULT NULL COMMENT '支付人数',PRIMARY KEY (`dt`,`recent_days`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(6)用户留存率分析

DROP TABLE IF EXISTS ads_user_retention;
CREATE TABLE `ads_user_retention` (      `dt` DATE DEFAULT NULL COMMENT '统计日期',`create_date` VARCHAR(255) NOT NULL COMMENT '用户新增日期',`retention_day` BIGINT(20) NOT NULL COMMENT '截至当前日期留存天数',`retention_count` BIGINT(20) DEFAULT NULL COMMENT '留存用户数量',`new_user_count` BIGINT(20) DEFAULT NULL COMMENT '新增用户数量',`retention_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '留存率',PRIMARY KEY (`create_date`,`retention_day`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(7)订单统计

DROP TABLE IF EXISTS ads_order_total;CREATE TABLE `ads_order_total` (   `dt` DATE NOT NULL COMMENT '统计日期', `recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`order_count` BIGINT(255) DEFAULT NULL COMMENT '订单数', `order_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '订单金额', `order_user_count` BIGINT(255) DEFAULT NULL COMMENT '下单人数',PRIMARY KEY (`dt`,`recent_days`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(8)各省份订单统计

DROP TABLE IF EXISTS ads_order_by_province;
CREATE TABLE `ads_order_by_province` (`dt` DATE NOT NULL,`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`province_id` VARCHAR(255) NOT NULL COMMENT '统计日期',`province_name` VARCHAR(255) DEFAULT NULL COMMENT '省份名称',`area_code` VARCHAR(255) DEFAULT NULL COMMENT '地区编码',`iso_code` VARCHAR(255) DEFAULT NULL COMMENT '国际标准地区编码',`iso_code_3166_2` VARCHAR(255) DEFAULT NULL COMMENT '国际标准地区编码',`order_count` BIGINT(20) DEFAULT NULL COMMENT '订单数',`order_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '订单金额',PRIMARY KEY (`dt`, `recent_days` ,`province_id`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(9)品牌复购率

DROP TABLE IF EXISTS ads_repeat_purchase;
CREATE TABLE `ads_repeat_purchase` (         `dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`tm_id` VARCHAR(255) NOT NULL COMMENT '品牌ID',`tm_name` VARCHAR(255) DEFAULT NULL COMMENT '品牌名称',`order_repeat_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '复购率',PRIMARY KEY (`dt` ,`recent_days`,`tm_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(10)商品统计

DROP TABLE IF EXISTS ads_order_spu_stats;
CREATE TABLE `ads_order_spu_stats` (`dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`spu_id` VARCHAR(255) NOT NULL COMMENT '商品ID',`spu_name` VARCHAR(255) DEFAULT NULL COMMENT '商品名称',`tm_id` VARCHAR(255) NOT NULL COMMENT '品牌ID',`tm_name` VARCHAR(255) DEFAULT NULL COMMENT '品牌名称',`category3_id` VARCHAR(255) NOT NULL COMMENT '三级品类ID',`category3_name` VARCHAR(255) DEFAULT NULL COMMENT '三级品类名称',`category2_id` VARCHAR(255) NOT NULL COMMENT '二级品类ID',`category2_name` VARCHAR(255) DEFAULT NULL COMMENT '二级品类名称',`category1_id` VARCHAR(255) NOT NULL COMMENT '一级品类ID',`category1_name` VARCHAR(255) NOT NULL COMMENT '一级品类名称',`order_count` BIGINT(20) DEFAULT NULL COMMENT '订单数',`order_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '订单金额', PRIMARY KEY (`dt`,`recent_days`,`spu_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

(11)活动统计

DROP TABLE IF EXISTS ads_activity_stats;
CREATE TABLE `ads_activity_stats` (`dt` DATE NOT NULL COMMENT '统计日期',`activity_id` VARCHAR(255) NOT NULL COMMENT '活动ID',`activity_name` VARCHAR(255) DEFAULT NULL COMMENT '活动名称',`start_date` DATE DEFAULT NULL COMMENT '开始日期',`order_count` BIGINT(11) DEFAULT NULL COMMENT '参与活动订单数',`order_original_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '参与活动订单原始金额',`order_final_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '参与活动订单最终金额',`reduce_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '优惠金额',`reduce_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '补贴率',PRIMARY KEY (`dt`,`activity_id` )
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(12)优惠券统计

DROP TABLE IF EXISTS ads_coupon_stats;
CREATE TABLE `ads_coupon_stats` (`dt` DATE NOT NULL COMMENT '统计日期',`coupon_id` VARCHAR(255) NOT NULL COMMENT '优惠券ID',`coupon_name` VARCHAR(255) DEFAULT NULL COMMENT '优惠券名称',`start_date` DATE DEFAULT NULL COMMENT '开始日期',  `rule_name`  VARCHAR(200) DEFAULT NULL COMMENT '优惠规则',`get_count`  BIGINT(20) DEFAULT NULL COMMENT '领取次数',`order_count` BIGINT(20) DEFAULT NULL COMMENT '使用(下单)次数',`expire_count`  BIGINT(20) DEFAULT NULL COMMENT '过期次数',`order_original_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '使用优惠券订单原始金额',`order_final_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '使用优惠券订单最终金额',`reduce_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '优惠金额',`reduce_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '补贴率',PRIMARY KEY (`dt`,`coupon_id` )
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

17.3 Sqoop导出脚本

1)编写Sqoop导出脚本

在/home/atguigu/bin目录下创建脚本hdfs_to_mysql.sh

[atguigu@hadoop102 bin]$ vim hdfs_to_mysql.sh

​ 在脚本中填写如下内容

#!/bin/bashhive_db_name=gmall
mysql_db_name=gmall_reportexport_data() {
/opt/module/sqoop/bin/sqoop export \
--connect "jdbc:mysql://hadoop102:3306/${mysql_db_name}?useUnicode=true&characterEncoding=utf-8"  \
--username root \
--password 000000 \
--table $1 \
--num-mappers 1 \
--export-dir /warehouse/$hive_db_name/ads/$1 \
--input-fields-terminated-by "\t" \
--update-mode allowinsert \
--update-key $2 \
--input-null-string '\\N'    \
--input-null-non-string '\\N'
}case $1 in"ads_activity_stats" )export_data "ads_activity_stats" "dt,activity_id";;"ads_coupon_stats" )export_data "ads_coupon_stats" "dt,coupon_id";;"ads_order_by_province" )export_data "ads_order_by_province" "dt,recent_days,province_id";;"ads_order_spu_stats" )export_data "ads_order_spu_stats" "dt,recent_days,spu_id";;"ads_order_total" )export_data "ads_order_total" "dt,recent_days";;"ads_page_path" )export_data "ads_page_path" "dt,recent_days,source,target";;"ads_repeat_purchase" )export_data "ads_repeat_purchase" "dt,recent_days,tm_id";;"ads_user_action" )export_data "ads_user_action" "dt,recent_days";;"ads_user_change" )export_data "ads_user_change" "dt";;"ads_user_retention" )export_data "ads_user_retention" "create_date,retention_day";;"ads_user_total" )export_data "ads_user_total" "dt,recent_days";;"ads_visit_stats" )export_data "ads_visit_stats" "dt,recent_days,is_new,channel";;"all" )export_data "ads_activity_stats" "dt,activity_id"export_data "ads_coupon_stats" "dt,coupon_id"export_data "ads_order_by_province" "dt,recent_days,province_id"export_data "ads_order_spu_stats" "dt,recent_days,spu_id"export_data "ads_order_total" "dt,recent_days"export_data "ads_page_path" "dt,recent_days,source,target"export_data "ads_repeat_purchase" "dt,recent_days,tm_id"export_data "ads_user_action" "dt,recent_days"export_data "ads_user_change" "dt"export_data "ads_user_retention" "create_date,retention_day"export_data "ads_user_total" "dt,recent_days"export_data "ads_visit_stats" "dt,recent_days,is_new,channel";;
esac

关于导出update还是insert的问题

–update-mode:

  updateonly  只更新,无法插入新数据allowinsert  允许新增

–update-key:

​ 允许更新的情况下,指定哪些字段匹配视为同一条数据,进行更新而不增加。多个字段用逗号分隔。

–input-null-string和–input-null-non-string:

​ 分别表示,将字符串列和非字符串列的空串和“null”转义。

17.4 全调度流程

17.4.1 数据准备

1)用户行为数据准备

(1)修改/opt/module/applog下的application.properties

#业务日期
mock.date=2020-06-15

注意:分发至其他需要生成数据的节点

[atguigu@hadoop102 applog]$ xsync application.properties

(2)生成数据

[atguigu@hadoop102 bin]$ lg.sh

注意:生成数据之后,记得查看HDFS数据是否存在!

(3)观察HDFS的/origin_data/gmall/log/topic_log/2020-06-15路径是否有数据

2)业务数据准备

(1)修改/opt/module/db_log下的application.properties

[atguigu@hadoop102 db_log]$ vim application.properties
#业务日期
mock.date=2020-06-15

(2)生成数据

[atguigu@hadoop102 db_log]$ java -jar gmall2020-mock-db-2020-04-01.jar

(3)观察SQLyog中order_infor表中operate_time中有2020-06-15日期的数据

17.4.2 编写Azkaban工作流程配置文件

1)编写azkaban.project文件,内容如下

azkaban-flow-version: 2.0

2)编写gmall.flow文件,内容如下

nodes:- name: mysql_to_hdfstype: commandconfig:command: /home/atguigu/bin/mysql_to_hdfs.sh all ${dt}- name: hdfs_to_ods_logtype: commandconfig:command: /home/atguigu/bin/hdfs_to_ods_log.sh ${dt}- name: hdfs_to_ods_dbtype: commanddependsOn: - mysql_to_hdfsconfig: command: /home/atguigu/bin/hdfs_to_ods_db.sh all ${dt}- name: ods_to_dim_dbtype: commanddependsOn: - hdfs_to_ods_dbconfig: command: /home/atguigu/bin/ods_to_dim_db.sh all ${dt}- name: ods_to_dwd_logtype: commanddependsOn: - hdfs_to_ods_logconfig: command: /home/atguigu/bin/ods_to_dwd_log.sh all ${dt}- name: ods_to_dwd_dbtype: commanddependsOn: - hdfs_to_ods_dbconfig: command: /home/atguigu/bin/ods_to_dwd_db.sh all ${dt}- name: dwd_to_dwstype: commanddependsOn:- ods_to_dim_db- ods_to_dwd_log- ods_to_dwd_dbconfig:command: /home/atguigu/bin/dwd_to_dws.sh all ${dt}- name: dws_to_dwttype: commanddependsOn:- dwd_to_dwsconfig:command: /home/atguigu/bin/dws_to_dwt.sh all ${dt}- name: dwt_to_adstype: commanddependsOn: - dws_to_dwtconfig:command: /home/atguigu/bin/dwt_to_ads.sh all ${dt}- name: hdfs_to_mysqltype: commanddependsOn:- dwt_to_adsconfig:command: /home/atguigu/bin/hdfs_to_mysql.sh all

3)将azkaban.project、gmall.flow文件压缩到一个zip文件,文件名称必须是英文。

4)在WebServer新建项目:http://hadoop102:8081/index

5)给项目名称命名和添加项目描述

6)gmall.zip文件上传

7)选择上传的文件

8)查看任务流

9)详细任务流展示

10)配置输入dt时间参数

11)执行成功

12)在SQLyog上查看结果

17.4.3 Azkaban多Executor模式下注意事项

​    Azkaban多Executor模式是指,在集群中多个节点部署Executor。在这种模式下, Azkaban web Server会根据策略,选取其中一个Executor去执行任务。

​   由于我们需要交给Azkaban调度的脚本,以及脚本需要的Hive,Sqoop等应用只在hadoop102部署了,为保证任务顺利执行,我们须在以下两种方案任选其一,推荐使用方案二。

  方案一:指定特定的Executor(hadoop102)去执行任务。

1)在MySQL中azkaban数据库executors表中,查询hadoop102上的Executor的id。

mysql> use azkaban;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from executors;
+----+-----------+-------+--------+
| id | host          | port  | active |
+----+-----------+-------+--------+
|  1   | hadoop103 | 35985 |      1 |
|  2   | hadoop104 | 36363 |      1 |
|  3   | hadoop102 | 12321 |      1 |
+----+-----------+-------+--------+
3 rows in set (0.00 sec)

2)在执行工作流程时加入useExecutor属性,如下

方案二:在Executor所在所有节点部署任务所需脚本和应用。

1)分发脚本、sqoop、spark、my_env.sh

[atguigu@hadoop102 ~]$ xsync /home/atguigu/bin/
[atguigu@hadoop102 ~]$ xsync /opt/module/hive
[atguigu@hadoop102 ~]$ xsync /opt/module/sqoop
[atguigu@hadoop102 ~]$ xsync /opt/module/spark
[atguigu@hadoop102 ~]$ sudo /home/atguigu/bin/xsync /etc/profile.d/my_env.sh

2)分发之后,在hadoop103,hadoop104重新加载环境变量配置文件,并重启Azkaban

离线数仓搭建_16_Azkaban全流程调度相关推荐

  1. 离线数仓搭建_15_ADS层数据构建

    文章目录 16.0 数仓搭建-ADS层 16.1 建表说明 16.2 访客主题 16.2.1 访客统计 16.2.2 路径分析 16.3 用户主题 16.3.1 用户统计 16.3.2 用户变动统计 ...

  2. 离线数仓搭建_02_服务器配置与数据生产

    点击右下方:专栏目录查看全文 文章目录 3.0 数据生成模块(P14-P29) 3.1目标数据 3.1.1页面 3.1.2事件(动作) 3.1.3曝光 3.1.4启动 3.1.5错误 3.2 数据埋点 ...

  3. 离线数仓搭建_11_DWD层用户行为日志创建

    文章目录 13.0 数仓搭建-DWD层 13.1 DWD层(用户行为日志) 13.1.1 日志解析思路 13.1.2 get_json_object函数使用 13.1.3 启动日志表 13.1.4 页 ...

  4. 离线数仓搭建_14_DWT数据构建

    文章目录 15.0 数仓搭建-DWT层 15.1 访客主题 15.2 用户主题 15.3 商品主题 15.4 优惠券主题 15.5 活动主题 15.6 地区主题 15.7 DWT层首日数据导入脚本 1 ...

  5. 离线数仓搭建流程以及遇到的问题Hadoop3.3.1-hive3.1.2-spark 3.3.1

    目录 简言 数仓选型 前期准备 更改三个节点主机名: 新增用户组以及用户: 配置互信 JDK安装 mysql安装 Zookeeper3.8安装 Hadoop3.3.1搭建 Hive3.1.3搭建 Sp ...

  6. 【大数据-课程】高途-天翼云侯圣文-Day2:离线数仓搭建分解

    一.内容介绍 昨日福利:大数据反杀熟 今日:数据看板 离线分析及DW数据仓库 明日:实时计算框架及全流程 一.数仓定义及演进史 1.概念 生活中解答 2.数据仓库的理解 对比商品仓库 3.数仓分层内容 ...

  7. 离线数仓搭建_18_PrestoKylin即席查询

    文章目录 19.0 即席查询 1.1.1 Presto概念 1.1.2 Presto架构 1.1.3 Presto优缺点 1.1.4 Presto.mpala性能比较 1.2 Presto0安装 1. ...

  8. Kafka、Flink 数据中台实践:事件模型、调度、实时/离线数仓架构之道

    去年年底,网传阿里董事局主席张勇,在阿里内网发帖称"现在阿里的业务发展太慢,要把中台变薄,变得敏捷和快速."此言一出激起千层浪,难道中台概念真成也阿里败也阿里? 有人戏称阿里&qu ...

  9. 大数据项目离线数仓(全 )一(数据采集平台)

    搭建用户行为数据采集平台.搭建业务数据采集平台.搭建数据仓库系统.制作可视化报表 本篇博客包括搭建用户行为数据采集平台.搭建业务数据采集平台 搭建数据仓库系统在大数据项目离线数仓(全 )二 制作可视化 ...

最新文章

  1. 安卓4安装Linux,如何在 Android 手机上安装 Ubuntu 13.04
  2. SpringBoot基础篇
  3. why the ebitda and ebit differ so much for netflix?
  4. 三维家可以导入别人的方案吗_Candel3D | 山地等高线看着费劲,不如试试三维设计...
  5. RH131 网络配置
  6. Setting Expires and Cache-Control: max-age headers for static resources in ASP.NET
  7. Android-简单的图片验证码
  8. Oracle11新特性:分区功能增强-Oracle新增复合分区 (转载)
  9. 失业几个月找不到工作是一种怎样的体验?
  10. cocos2dx游戏开发简单入门视频教程 (cocos2d-x)- 第5天
  11. CentOS7 完全卸载MySQL
  12. 智能门锁服务器,【胖猴小玩闹】智能门锁与网关:海康萤石智能门锁的网关分析(三)...
  13. photoshop 前端切图基础教程
  14. web test performance tools / linux performance tools / windows performance tools
  15. 出版印刷纸张大小尺寸一览表
  16. php faker,faker php伪造填充数据
  17. selenium模拟登陆12306
  18. 【总结】大学四年来,用过的一些网站整理
  19. 室内场馆360全景拍摄的注意事项
  20. 互联网产品经理职业规划图(转载)

热门文章

  1. vs2019安装包显示网络未链接_机械行业11款软件下载链接
  2. Vuex到底如何使用
  3. C++ strcpy,memcpy,memset,strcmp,memcmp
  4. java 快速开发平台 有代码生成器 springmvc SSM后台框架源码
  5. SQL中GRANT(分配权限)和REVOKE(回收权限)向用户授权或取消授权
  6. 成都市三甲医院信息汇总
  7. SQL Server数据控制(Grant和Revoke)——架构
  8. Ubuntu “readonly” option is set(add to override)错误
  9. Android图片底部居中的ImageView
  10. 获取淘宝/天猫优惠券查询的API接口