目录
3.2.5 使用supervisord管理prometheus
条件:做这个项目一定要把需要搭建的环境搭建好才能做。这里会涉及到模拟公司内容的业务数据、内容数据、行为数据进行采集。
想有个做项目的环境可以看这篇哦
项目0单节点的虚拟机做大数据开发_林柚晞的博客-CSDN博客
真的没有放过任何一个细节,项目的软件我全部分享出来了。
下面我们开始实时数仓开发吧!
1. 项目介绍
1.1项目背景
该项目的数据的上下文限定(数据范围): 公司C端产品的日志(app、网站、小程序)数据、内容数据、业务数据、元数据(用于描述数据的数据)
1.2项目需求
1)用户行为数据(行为日志)
1. 包括用户启动APP,各页面的浏览,点击,点赞,分享,收藏 广告的点击等行为日志
2. 需要进行客户端埋点: (这个项目埋点已经做好,只需要设计接口)
2)资讯数据(内容数据)
1. 数据的搜集有两种模式,拉模式和推模式。
2. 数据埋点已经做好,只需要设计接口即可
3)业务数据
该项目只是收集广告相关数据
1.3目标
1. 针对不同类型的三种数据源设计采集方案,落地到hdfs上
2. 在hdfs上以天为目录存储数据(注意:时间应该以日志里的时间为基准,所以要拦截日志中的时间,设置成目录)
3. 再维护数据仓库的ODS层的hive外部表。 还要对表设计分区(获取数据的脚本,新增分区脚本的设计, 他们之间有依赖关系)
4. 使用azkaban对脚本进行调度,
5. 使用prometheus和grafana监控这些接口指标等
1.4 二次开发
1. 日志时间的拦截--->自定义拦截器
2. 开发azkaban的警报系统(钉钉报警)
2. 项目部署
2.1业务数据采集
打开navicat
连接->mysql->如下图填写,确定
真实内容:(连接名自定义)
# 只读权限
HOST: mysql.qfbigdata.com
PORT: 3306
USER: qf001
PWD: QF-common1001-###
我们也可以使用sqoop测试一下
sqoop list-tables \
--connect "jdbc:mysql://mysql.qfbigdata.com:3306/biz" \
--username "qf001" \
--password "QF-common1001-###"
2.2 导入脚本编写和测试
mkdir -p /opt/apps/realtime/scripts/
vim /opt/apps/realtime/scripts/news-business-sqoop-start.sh
#!/bin/sh
# filename: news-business-sqoop-start.sh
# desc: 导入mysql业务表 [meta,ad_info]数据到hdfs
# 请写你安装的SQOOP的路径
SQOOP_HOME=/usr/local/sqoop/
MYSQL_CONNECT=jdbc:mysql://mysql.qfbigdata.com:3306/biz
MYSQL_USERNAME=qf001
MYSQL_PWD=QF-common1001-###
# 定义一个日期参数,如果指定日期,就导入该日期前一天的数据,否则默认为昨日数据
exec_date=$1
if [ "${exec_date}" ] ;then
exec_date=`date -d "${exec_date} 1 days ago" +%Y%m%d`
else
exec_date=`date -d "1 days ago" +%Y%m%d`
fi
echo " news-business-sqoop-start.sh exce date: ${exec_date}"
SQL_DATE=`date -d "${exec_date} 1 days" +%Y-%m-%d`
# ad_info表数据
# --split-by 列作为并行导入时的分隔列
# -m 3个并行度
# $CONDITIONS SQOOP执行SQL查询时,会加上 1=0 先去验证SQL语法是否正确如果正确,真执行的时候会变成 1=1
${SQOOP_HOME}/bin/sqoop import \
--connect ${MYSQL_CONNECT} \
--username ${MYSQL_USERNAME} \
--password ${MYSQL_PWD} \
-e "select id ,cast(ad_id as char(50)) as ad_id,cast(advertiser_id as char(50)) as advertiser_id,advertiser_name,DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s')as create_time from ad_info where 1=1 and create_time<='${SQL_DATE} 00:00:00' AND \$CONDITIONS" \
--split-by id \
--target-dir /collection/news_business/ad_info/${exec_date} \
--delete-target-dir \
-m 3
# meta 表数据
${SQOOP_HOME}/bin/sqoop import \
--connect ${MYSQL_CONNECT} \
--username ${MYSQL_USERNAME} \
--password ${MYSQL_PWD} \
-e "select id,field,field_type,field_desc,app_version,cast(status as char(50)) as status,DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s')as create_time from meta where 1=1 and create_time<='${SQL_DATE} 00:00:00' AND \$CONDITIONS" \
--split-by id \
--target-dir /collection/news_business/meta/${exec_date} \
--delete-target-dir \
-m 2
上面的脚本的功能:
- 加载sqoop 和mysql
- 定义一个日期函数,为了导入昨天的数据
- 对查询中的ad_info表并行导入,以及执行sql语句
- 对meta表进行查询
修改权限:
[root@qianfeng01 scripts]# chmod u+x /opt/apps/realtime/scripts/news-business-sqoop-start.sh
运行
# 导入昨天的数据
[root@qianfeng01 scripts]# ./news-business-sqoop-start.sh
# 导入指定时间的前一天的数据
[root@qianfeng01 scripts]# ./news-business-sqoop-start.sh 2022-03-26
2.3内容数据采集
2.3.1说明:
1. 我们可以使用flume的http Source作为接口,采集新闻咨询这类的内容数据
2. 北京服务器是向远程地址的9666端口发送的数据,因此采集方案中要使用9666
2.3.2采集方案的编写和测试
vim /opt/apps/realtime/scripts/news-article-flume-http.properties
# filename: news-article-flume-http.properties
# 定义一个名字为 b1001 的agent 以及三大核心组件的名字,并关联
b1001.channels = ch-1
b1001.sources = src-1
b1001.sinks = k1
b1001.sinks.k1.channel = ch-1
b1001.sources.src-1.channels = ch-1
# 设置source的相关属性
b1001.sources.src-1.type = http
b1001.sources.src-1.bind=0.0.0.0
b1001.sources.src-1.port=9666
# 设置channel的相关属性
b1001.channels.ch-1.type = memory
b1001.channels.ch-1.capacity = 10000
b1001.channels.ch-1.transactionCapacity = 100
#设置sink的相关属性
b1001.sinks.k1.type = hdfs
b1001.sinks.k1.hdfs.path = hdfs://qianfeng01:8020/collection/news_article/%Y%m%d
b1001.sinks.k1.hdfs.filePrefix = news-%Y%m%d_%H
b1001.sinks.k1.hdfs.fileSuffix = .gz
b1001.sinks.k1.hdfs.codeC = gzip
b1001.sinks.k1.hdfs.useLocalTimeStamp = true
b1001.sinks.k1.hdfs.writeFormat = Text
b1001.sinks.k1.hdfs.fileType = CompressedStream
# 禁用按照event条数来滚动生成文件
b1001.sinks.k1.hdfs.rollCount = 0
# 如果一个文件达到10M滚动
b1001.sinks.k1.hdfs.rollSize = 10485760
# 1分钟滚动生成新文件,和文件大小的滚动一起,那个先达到,执行那个
b1001.sinks.k1.hdfs.rollInterval = 60
# 参加上边连接官网说明,理论上batchSize 越大,吞吐越高。 但是HDFS Sink 调用 Hadoop RPC(包括 open、flush、close ..)超时会抛出异常,如果发生在 flush 数据阶段,部分 event 可能已写入 HDFS,事务回滚后当前 BatchSize 的 event 还会再次写入造成数据重复。 batchSize越大可能重复的数据就越多. 同时batchSize值,不能大于channel的transactionCapacity值
b1001.sinks.k1.hdfs.batchSize = 100
# 每个HDFS S