大数据仓库实战项目-电商数仓3.0版.md
1. 56节KAFKA机器数据量的计算
kafka机器数量=2*(峰值生产速度副本数/100)+1
峰值生产速度50M/S副本为2则:2(50*2/100)+1=3台
2. 57节:kafka生产压测(cpu,内存,io瓶颈)
kafka-consumer-perf-test.sh 消费者压测脚本
kafka-producer-perf-test.sh 生产者压测脚本
- kafka-producer-perf-test.sh --topic test --record-size 100 --num-records 100000 --throughput -1 --producer0props bootstrap.servers=xxxx:9092,yyyy:9092
- record-size 一条数据多大字节
- num-records 总共发送多少条消息
- throughput 是每秒多少条消息设成-1,标识不限流,可测出生产者最大吞吐量
压测结果说明
- kafka-consumer-perf-test.sh --broker-list xxxx:9092,yyyy:9092 --topic test --fetch-size 10000 --messages 1000000 --threads 1
- borker-list 卡夫卡集群地址
- topic topic名称
- fetch-size 每次fetch的数据的擦小
- 总共消费的小数个数
测试结果说明
3. 111节环境准备metastore和hiveserver2想到与直接连mysql或者hive的所有客户端的统一代理入口
4. 131 kafka挂了_丢了
4-1. 挂了
- 短期: flume channel 缓冲数据
- 长期:日志服务器保留30天日志。
4-2. 丢了
ack 0 1 -1
- 0 发送过来数据,不需要应答,可靠性最差,传输性能最好。
- 1 发送过来数据,leader应答,可靠性一般,传输性能一般
- -1 发送过来数据,leader和follower共同应答,可靠性最高,传输性能最低。
企业:0不用
如果是普通日志:1
如果是金融数据和钱相关:-1
5. 132 kafka_重复
事务,幂等性+ack=-1 效率低
在下一级处理:hive dwd,sparkstreaming,redis
- 幂等性:单分区,单会话内数据不重复(kafka启动到挂掉是一个会话)
6. 133 kafka_积压
- 增加分区,同事增加消费者对应的cpu核数 (一个线程一个分区:最起码)
- 增加消费者batchsize
日志是1k大小 1000条/s
flume(2000条/s) spark flink
7. 134 kakfa优化
- 日志保留时间增长 :log.retention.hours=72
- 副本总为2:default.replication.factor:1 (默认副本1个)
- 调大网络延迟时间:replica.socket.timeout.ms:30000 #集群网络不稳定时调大该参数;replica.lag.time.max.ms=600000 #如果网络不好,或者kafka集群压力较大会出现副本丢失,然后会频繁复制副本,导致集群压力更大,此时可以调大该参数。
- producer优化:producer.properties压缩,compression.type:none;#默认不压缩可以用gzip,snappy,lz4;减轻网络压力和borker的存储压力
- kafka内存调整:默认内存一个G,生产环境尽量不要超过6个G; export KAFKA_HEAP_OPTS="-Xms4g -Xmx4G"
8. 135 kafka杂七杂八
-
高效读写的原因:集群,分区,
-
顺序读写600M/s,随机读写100M/s
-
0拷贝
-
传输一条2M的日志文件:会发生?卡住,生产者无法推送数据到kafka,或者消费者无法消费kafka的数据;默认最大支持1M;修改server.properties
replica.fetch.max.bytes:1048576,borker可复制的消息的最大字节数,默认1M
message.max.bytes:1000012 kafka会接收单个消息size的最大限制,默认1M左右;后者必须小于上着(不能一样)。否则会导致replica之间数据同步失败。
-
数据过期清理:删除或者压缩
log.cleanup.policy=delete #删除策略
log.cleanup.policy=compact# 压缩策略 -
kafka可以按照时间消费数据
- Map<TopicPartition,OffsetAndTimestamp> startOffsetMap=KafkaUtil.fetchOffsetsWithTimestamp(topic,sTime,kafkaProp);
-
kafka消费者角度数据是拉取数据
-
kafka数据单分区内有序。多分区,分区与分区间无序。(疑惑)
一、superset 可视化工具
1. 305 可视化superset概述
Apache 开源轻量的BI分析工具,对接多种数据源(kylin,hive,impala,mysql),支持自定义仪表盘
使用场景:1. BI分析工具 2.可是化工具
2. 306 superset Miniconda(python环境)安装
- 基础环境python3.6(因为框架是python编写)
Miniconda文件名.sh结尾
- wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-X86_64.sh
- bash Miniconda3-latest-Linux-X86_64.sh
- # 配置python基础环境不默认激活
- conda config --set auto_activate_base false
安装成功
3. 307 conda创建python环境
- #创建环境
- conda create -n env_name
- #查看所有环境
- conda info -envs
- #删除环境
- conda remove -n env_name --all
- #激活superset环境
- conda activate superset
- #退出当前激活环境
- conda deactivate
4. 308 创建python环境
- #配置conda国内镜像
- conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- conda config --set show_channel_urls yes
- #创建环境
- conda remove -n superset python=3.6
5. 309 superset部署
5-1. 安装依赖
- yum -y install python-setuptools
- yum -y install gcc gcc-c++ libffi-devel python-devel python-pip python-wheel openssl-devel cyrus-sasl-devel openldap-devel
5-2. 安装superset
- #更新setuptools,pip
- (superset) [atiguigu@hadoop102 ~]$ pip install --upgrade setuptools pip -i https://pypi.douban.com/simple/
- ## 安装superset
- (superset) [atiguigu@hadoop102 ~]$ pip install apache-superset -i https://phpi.douban.com/simple #-i指定镜像
安装成功
6. 310 superset初始化
- #初始化supetset数据库
- (superset) [atiguigu@hadoop102 ~]$ superset db upgrade
- #创建管理员用户
- (superset) [atiguigu@hadoop102 ~]$ export FLASK_APP=superset
- (superset) [atiguigu@hadoop102 ~]$ flask fab create-admin # flask是python web框架,superset使用的就是该框架
- # superset初始化
- (superset) [atiguigu@hadoop102 ~]$ superset init
创建管理员用户成功
7. 311 启停superset
- # 安装gunicorn 是一个python web server 和java中的tomcat类似
- (superset) [atiguigu@hadoop102 ~]$ pip install gunicorn -i https://pypi.douban.com/simple/
- #启动superset
- (superset) [atiguigu@hadoop102 ~]$ gunicorn --workers 5 --timeout 120 --bind hadoop102:8787 "superset.app:create_app()" --daemon
- #停止gunicorn进程(superset也停掉了)
- (superset) [atiguigu@hadoop102 ~]$ ps -ef|awk '/superset/ && !/awk/{print $2}' | xargs kill -9
- #启停脚本
- ###查看状态
- superset_status(){
- result=`ps -ef| awk '/gunicorn/ && !/awk/{print $2}' |wc -l`
- if [[ $result -eq 0 ]];then
- return 0
- else
- return 1
- fi
- }
- ###启动
- superset_start(){
- # 该段内容取自~./bashrc,所用是进行conda初始化;启动superset环境准备
- # >>>conda initialize >>>
- #!! Contents within this block are managed by 'conda init' !!
- __conda_setup="$('/opt/module/miniconda3/bin/conda' 'shell.bash' 'hook' 2 > /dev/null)"
- if [[ $? -eq 0 ]];then
- eval "$__conda_setup"
- else
- if [ -f "/opt/module/miniconda3/etc/profile.d/conda.sh" ];then
- "/opt/module/miniconda3/etc/profile.d/conda.sh"
- else
- export PATH="/opt/module/miniconda3/bin:$PATH"
- fi
- fi
- unset __conda_setup
- #<<<conda initialize<<<
- superset_status > /dev/null 2>&1
- if [[ $? -eq 0 ]];then
- conda activate superset; gunicorn --workers 5 --timeout 120 --bind hadoop102:8787 --daemon superset.app
- else
- echo "superset正在运行"
- fi
- }
- ### 停止
- superset_stop(){
- superset_status > /dev/null 2>&1
- if [[ $? -eq 0 ]];then
- echo "superset未在运行"
- else
- ps -ef|awk '/gunicorn/ && !/awk/{print $2}' | xargs kill -9
- fi
- }
- ### main入口
- case $1 in
- start )
- echo "启动supserset"
- superset_start
- ;;
- stop )
- echo "停止superset"
- superset_stop
- ;;
- status )
- supserset_status > /dev/null 2>&1
- if [[ $? -eq 0 ]];then
- echo "superset 未在运行"
- else
- echo "superset 在运行中"
- fi
- esac
8. 312 安装数据库依赖
使用过程:配置数据源--》生成报表--》放到dashboard仪表盘
- #对接mysql数据源
- ##安装依赖
- (superset) [atiguigu@hadoop102 ~]$ conda install mysqlclient
- #对接不同数据源安装不同依赖参考http://superset.apache.org/installation.html#database-dependencies
- ## 重启superset
9. 313 对接mysql数据源
数据库:连接对象名字不必跟数据库名称一致。
sql alchemy uri:python的连接规范
连接数据库:
连接数据表:
10. 314 配置图表
10-1. 创建仪表盘
10-2. 创建图表
配置图表维度和度量
11. 315 配置地图
12. 316 配置饼图
13. 317 调整布局(地图放大)
14. 318 调整仪表盘刷新频率
二、Atlas
1. 数据治理三大模块
- 数据安全Ranger
- 数据质量:shell+HQL,Griffin
- 元数据管理:Atlas
2. 384 Atlas文档四个大章节
- 入门
- 安装+集成
- 使用
- 编译
3. 第一章 元数据管理
3-1. 385 Atlas介绍
- Atlas 功能:
- 数据字段: 构建其数据资产目录,并对资产进行分类和管理;如total_money :所有订单的总金额;数据字典里面可以查到几乎所有的库的释义,表的介绍,字段的解释说明。
- 血缘追溯,定位数据问题。
表与表的血缘依赖
字段与字段的血缘依赖
3-2. 386 架构原理
4. 第二章 安装及使用
- Atlas官网地址:https://atlas.apache.org
- 文档地址:https://atlas。apache.org/0.8.4/index.html
- 下载地址:https//www.apache.org/dyn/closer.cgi/atlas/0.8.4/apache-atlas-0.8.4-sources.tar.gz
4-1. 387 准备——hbase搭建
4-2. 388 准备-solr安装
- 下载
- wget http://archive.apache.org/dist/lucene/solr/5.2.1/solr-5.2.1.tgz
- 解压
- tar -zxvf solr-5.2.1.tgz -C /opt/module/
- 修改solr.in.sh文件
- vim bin/solr.in.sh
- ZK_HOST="hadoop102:2181,hadoop103:2181,hadoop104:2181"
- SOLR_HOST="hadoop102"
- SORL_PORT=8983
- 分发solr,进行cloud模式部署
- xsync solr
- 分发完毕后,分别对hadoop103,hadoop104的solr.in.sh编辑SOLR_HOST修改为对应的主机名
- 对三台节点分别进行启动;启动前先启动zk
- bin/solr start
- 启停脚本
- !/bin/bash
- case $1 in
- "start"){
- for i in hadoop102 hadoop103 hadoop104
- do
- ssh $i "/opt/module/solr/bin/solr start"
- done
- };;
- "stop"){
- for i in hadoop102 hadoop103 hadoop104
- do
- ssh $i "/opt/module/solr/bin/solr stop"
- done
- };;
- esac
4-3. 389 元数据管理Atlas搭建
- 解压安装
- 修改配置文件
- vim atlas-appliation.properties
- 修改atlas存储数据主机
- atlas.graph.storage.hostname=hadoop102:2181,hadoop103:2181,hadoop104:2181
- 集成hbase:添加hbase配置文件到atlas的安装目录
- ln -s /opt/module/hbase/conf/ /opt/module/atlas/conf/hbase/
- # 修改atlas-env.sh添加HBASE_CONF_DIR
- vim atlas-env.sh
- ## 添加Hbase配置文件路径
- export HBASE_CONF_DIR=/opt/module/atlas/conf/hbase/conf
- 集成solr
- vim atlas-application.properties
- #修改如下配置
- atlas.graph.index.search.solr.zookeeper-url="hadoop102:2181,hadoop103:2181,hadoop:104:2181"
- # 将自带的solr文件夹拷贝到外部solr集群的各个节点
- [atgyugy@hadoop102 conf]$ cp -r /opt/module/atlas/conf/solr /opt/module/solr/
- # 进入/opt/module/solr路径,修改拷贝过来的配置文件名称为atlas_conf
- [atgyugy@hadoop102 conf]$ mv solr atlas_conf
- # 在cloud模式下,启动solr(均需提前启动zookeeper集群),并创建collection
- bin/solr create -c vertex index -d /opt/module/solr/atlas_conf -shards 3 -replicationFactor 2
- bin/solr create -c edge index -d /opt/module/solr/atlas_conf -shards 3 -replicationFactor 2
- bin/solr create -c fulltext index -d /opt/module/solr/atlas_conf -shards 3 -replicationFactor 2
- -shards 3:标识该集合分片数为3
- -replicationFactor 2:表示每个分片数都有2个备份
- vertex_index,edge_index,fulltext_index:标识集合的名称
- #删除集合
- bin/solr delete -c ${collection_name}
效果
- 集成kafka
- # 进入/opt/module/atlas/conf 目录修改配置文件atlas-application.properties
- vim atlas-application.properties
- ###Notification Configs #######
- atlas.notification.embedded=false
- atlas.kafka.data=/opt/module/kafka/logs
- atlas.kafka.zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181
- atlas.kafka.bootstrap.servers=hadoop102:9092,hadoop103:9092,hadoop104:9092
- atlas.kafka.zookeeper.session.timeout.ms=4000
- atlas.kafka.zookeeper.connection.timeout.ms=2000
- atlas.kafka.enable.auto.commit=true
- # 启动kafka集群并创建topic
- bin/kafka-topics.sh --zookeeper hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka --create --replication-factor 3 --partitions 3 --topic _HOATLASOK
- bin/kafka-topics.sh --zookeeper hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka --create --replication-factor 3 --partitions 3 --topic ATLAS_ENTITIES
- atlas其他配置
- #进入atlas conf目录
- vim atlas-application.properties
- ####Server Properties #####
- atlas.reset.address=http://hadoop102:21000
- # IF enabled and set to true,this will run setup setps whe the server starts
- atlas.server.run.setup.on.start=false
- ####Entity Audit Confits #####
- atlas.audit.hbase.zookeeper.quorum=hadoop102:2181,hadoop103:2181,hadoop104:2181
- # 记录性能指标修改atlas-log4j.xml
- ##去掉以下代码注释
- <appender name="perf_appender" class="org.apache.log4j.DailyRollingFileAppender">
- <param name="file" value="${atlas.log.dir}/atlas_perf.log" />
- <param name="datePattern" value="'.'yyyy-MM-dd" />
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d|%t|%m%n" />
- </layout>
- </appender>
- <logger name="org.apache.atlas.perf" additivity="false">
- <level value="debug" />
- <appender-ref ref="perf_appender" />
- </logger>
4-4. 390 元数据管理_atlas集成hive
- # 修改atlas-application配置文件
- vim atlas-application.properties
- ####Hive Hook Confifgs #####
- atlas.hook.hive.synchronous=false
- atlas.hook.hive.numRetries=3
- atlas.hook.hive.queueSize=10000
- atlas.cluster.name=primary
- #将atlas-application.properties复制到/opt/module/hive/conf下
- cp /opt/module/atlas/conf/atlas-application.propertie /opt/module/hive/conf/
- ## 解压apache-atlas-2.0.0-hive-hook.tar.gz 到/opt/module
- tar -zxvf apache-atlas-2.0.0-hive-hook.tar.gz -C /opt/module/
- ## 剪切hook和hook-bin 目录到/opt/module/atlas文件夹中
- mv /opt/module/apache-atlas-hive-hook-2.0.0/hook-bin/ /opt/module/atlas/
- mv /opt/module/apache-atlas-hive-hook-2.0.0/hook /opt/module/altas/
- ## atlas-application.properties 配置文件加入到atlas-plugin-classloader-1.10.0.jar中
- [atgyugy@hadoop102 hive]$ zip -u /opt/module/atlas/hook/hive/atlas-plugin-classloader-2.0.0.jar /opt/module/atlas/conf/atlas-application.propertie
- [atgyugy@hadoop102 hive]$ cp /opt/module/atlas/conf/atlas-application.propertie /opt/module/hive/conf/ ## 原因:之歌配置不能参照官网,讲配置文件拷到hive的conf中,参考官网做法一直读取不到atlas-application.properties文件,读了源码发现是在classpath读取的这个文件,所以把它压倒jar里面
- ## 修改/opt/module/hive/conf/hive-site.xml文件增加atlas hook配置
- vim hive-site.xml
- <property>
- <name>hive.exec.post.hooks</name>
- <value>org.apache.atlas.hive.hook.HiveHook</value>
- </property>
- vim hive-env.sh
- ## 在tez 引擎依赖的jar包后面最佳hive插件相关的jar包
- export HIVE_AUX_JARS_PATH=/opt/module/atlas/hook/hive
4-5. 391 atlas启动特慢
先把依赖zk,hadoop,kafka,hbase,solr启动
- # 启动atlas
- bin/altas_start.py
- ll -rt #以时间顺序排序文件
- tail -f logs/application.log # 即使控制台启动完成但是日志还在生成,启动还是没有完成,需要等到日志不跳了
4-6. 392 元数据管理导入hive元数据
- # 启动hive
- hive(default) >show databases;
- hive(default) >use gmall;
- #在/opt/module/atlas/hook-bin 路径,讲hive元数据导入到atlas
- ./import-hive.sh ##中间有很多info级别的404日志,问题不大因为是通过rest api方式把数据发送到kafka,atlas再消费kafka写入。
导入成功
4-7. 393 元数据管理atlas的常用配置
- 配置内存
- # 内存配置修改atlas-env.sh
- export ATLAS_SERVER_OPTS="-server -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpPath=dumps/atlas_server.hprof -Xloggc:logs/gc-work.log -verbose:gc -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1m -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps"
- # 建议JDK1.7使用以下配置
- export ATLAS_SERVER_HEAP="-Xms15360m -Xmx15360m -XX:MaxNewSize=3072m -XX:PermSize=100M -XX:MaxPermSize=512m"
- # 建议JDK1.78使用以下配置
- export ATLAS_SERVER_HEAP="-Xms15360m -Xmx15360m -XX:MaxNewSize=5120m -XX:PermSize=100M -XX:MaxPermSize=512m"
-XX:SoftRefLRUPolicyMSPerMB 参数对管理具有许多并发用户的查询繁重工作负载的GC性能特别有用
- 配置用户名密码
Atlas支持FIle,Kerberos,LDAP三种身份验证方法
通过修改atlas-application.properties文件开启或者关闭三种验证方式
- atlas.authentication.method.kerberos=true|false
- atlas.authentication.method.ldap=true|false
- atlas.authentication.method.file=true|false
- # 查看用户名密码conf/users-credentials.propertie
- vim users-credentials.propertie
- #username=group::sha256-password #这是用户配置的格式
- admin=Admin::8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
- rangertagsync=RANGER_TAG_SYNC::e3f67.....fb9d
- ## admin使用户名Admin是组;sha256是密码加密方式;可以反解密8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918是密码"admin"加密后的一串字符。
4-8. 394 元数据管理Atals初体验
模糊搜索不太准:有时候可以查到有时候不可以
如下:ods_log表
4-9. 395 元数据管理——血缘关系案例
- 导入血缘关系:光靠import不能智能导入数据==》需要从新跑一遍azkaban任务调度的所有脚本流程=》生成血缘关系
4-10. 396 元数据管理——血缘关系追溯
血缘追溯截图:hive-hook捕获任务事件字段与字段之间的关系发到kafka;仅限于hive的任务.sparkSQL没有很好的钩子(hook)
4-11. 397 spark监控不可用
spark-hook(开源项目非官方)的代码有bug
4-12. 398 元数据管理——Atlas API和编译
4-12-1. 编译
4-12-1-1. maven安装
- #1. maven下载
- wget https://maven.apache.org/download.cgi
- #2.maven解压
- tar -zxvf apache-maven-3.6.1-bin.tar.gz -C /opt/module/
- #3. 做软连 maven->apache-maven-3.6.1
- #4. 添加环境变量
- vim /etc/profile
- export MAVEN_HOME=/opt/module/maven
- export PATH=$PATH:$MAVEN_HOME/bin
- #5. 测试maven
- source /etc/profile
- mvn -v
- #6、 把镜像改成阿里云
4-12-1-2. 编译atlas
- #1. 获取atlas源码
- #2. 下载atlas依赖及调整maven内存
- export MAVEN_OPTS="-Xms2g -Xmx2g"
- mvn clean -DskipTests install
- mvn clean -DskipTests package -Pdis
- ##一定要在atlas源码路径下执行
- #3.获取编译后的安装包
- cd distro/target/
- mv apache-atlas-2.0.0-server.tar.gz /opt/software/
- mv apache-atlas-2.0.0-hive-hook.tar.gz /opt/software/
- ## 执行时间比较长,会下载很多依赖,期间如果报错可能是因为Timeout造成网络中断重试即可,好多包国内镜像没有。
4-13. 399 元数据管理-总结
介绍-架构-安装-使用(特性血缘关系)
5. 400 数据治理 三大模块之数据安全总结
ranger 的作用
ranger的架构(solr只有用到ranger审计功能才需要安装)
ranger安装:插件安装
ranger使用:hive的表基本权限管理,数据脱敏展示。
5-1. 401 数据治理之数据质量总结(数据质量管理就是HQL等数据处理)
数据质量的高低代表了该数据满足数据消费者期望的成都,这种成都基于他们对数据的使用预期,主要分为数据的健康标准量化,监控和保障。
5-1-1. 标准
- 数据完整性:数据不存在大量的缺失值,不缺少某一日期/部门/地点等部分维度的数据,同事在ETL过程中英保证数据的完整不丢失。验证数据时总数应符合正常规律时间推移,记录数总数的增长符合正常的趋势。
- 数据一致性:数仓各层的数据,应与上一层保持数据一致,最终经过数据清洗转化(ETL)的宽表/指标能和数据源保持一致。
- 数据不重复性:一个数据集当中同一条数据记录不能出现多次,数据不能大量重复冗余,保证数据的唯一性。
5-1-2. 解决方案
shell命令和hive脚本的方式,通过验证增量数据的记录数,全表空值记录数,全表重复值记录数是否在合理的范围之内,以及验证数据来源表和目标表一致性,确定当日的数据是否符合健康标准,达到数据质量的监控和管理。
Griffin数据质量解决方案管理问题
shell和hql数据质量管理解决方案:和ods比较一致:空值,重复,总数三方面比较。
数据质量频率KPI要求解决:
5-2. 402 数据治理-元数据管理总结
5-3. 403 数据治理-总结
5-3-1. 离线数仓搭建阶段:
搭框架/集群->建立离线数仓->自动化调度/宽表/建模/ETL/BI->数据仓库成型,数据治理-->数据中台/数据湖/数据交换平台
加上实时 spark+flink
sh,sql,python->spark,flink=>使用多的
6. 数据质量
6-1. 404 数据质量Griffin介绍
- 编译难
- 数据对比不准确
- 不支持spark3版本
6-2. 405 数据质量概述:肯定不是100%准确的。
你的用户:数据分析师,经理,普通员工,程序员拿你的数据会根据他的数据对比有一个对比结果评估准确性,因而对你数据质量有要求。
- 在数据丢了的问题时:指落地hdfs过程后丢了:dt进行分区,修复脚本:删除该分区所有数据重新导入该分区数据
- 数据重复导入问题:分区表:删除该分区所有数据,从新导入该分区数据 或者insert overwrite ...select * from 重复表 group by keys;全量表重复:再导一次。
- 有一个表计算完了,发现不符合正常的规律。
用Atlas追踪血缘关系,逐层定位数据质量问题所在,测试原有脚本或者数据源是否发生改变,维护脚本和数据。
6-3. 406 数据质量:发现数据问题的数据标准判定
-
完整性:保证不丢数据,关键字段无null值,保证数据记录数符合短期和长期的增长规律
-
一致性:前后两层(数据源表和目标表)相同的数据需要保证值一致的。
-
不重复性:同一条记录不重复
orders记录
10001 丝袜 3块 wsl 深圳 18888****
10001 丝袜 3块 gxd 深圳 18888*****唯一标识不重复(10001)
6-4. 407 数据质量解决方案
ods-->dwd--->dws---->dwt-->ads
-
ads层:
增量记录数
全量记录数
空值
重复值需要验证(对不为空的字段校验即可):分两种,增量表,全量表
没有上层源数据比较一致性。 -
dwd需要一致性校验,重复
-
dws,dwt 基本和ods保持一致
-
ads 需要定制比较校验。
6-5. 408 数据质量——ods层数据校验通用脚本
- #1. 创建检查脚本文件夹
- mkdir -p data_check/sh
- pwd
- #2. HIVE中创建数据质量检查记录表,记录数据校验的各个指标
- hive
- -- 创建数据库,用于存放数据质量校验的结果数据
- hive> create database datacheck;
- -- 创建数据表,用于存放ods层的数据校验结果
- hive> create table datacheck.table_count_add_standard(data_date string comment '数据时间分区dt',database_name string comment '库名',table_name string comment '表名', table_type string comment '表类型(全量/增量)',add_count bigint comment '当日增量数据的记录数',null_count bigint comment '表控制记录数',duplicate_count bigint comment '表重复值记录数', total_count bigint comment '全表记录数');
- hive>quit;
- #3. 在data_check/sh目录下创建数据检验增量记录表通用shell脚本
- vim increment_data_chek_public.sh
- #增量数据所在的日期分区
- do_date=$1
- #校验数据的表名
- table_name=$2
- #需要校验控制的列名,以逗号分隔
- null_column=$3
- #初始化SQL查询语句
- null_where_sql_str=''
- #将控制检验字符串切成列名数组
- array=(${null_column//,/})
- #遍历数组,拼接空值查询条件
- for(( i=0;i<${#array[@]};i++)) do
- if [ $i -eq 0 ];then
- null_where_sql_str=" where ${array[i]} is null "
- else
- null_where_sql_str="$null_where_sql_str or ${array[i]} is null "
- fi
- done;
- echo "------------校验增量记录数-------------------------"
- #执行当日增量数据记录数量SQL查询语句
- add_count_query_result=`hive -e "select count(*) from gmall $table_name where dt='$do_date'"`
- #去除当日增量数据记录数量
- add_count=${add_count_query_result:3}
- echo "----------------------------检验全表记录数------------------"
- #执行当日全表数据记录数量SQL查询语句
- total_count_query_result=`hive -e "select count(*) from gmall.$table_name"`
- #取出档期全量数据记录数量
- total_count=${total_count_query_result:3}
- echo "----------------检验控制记录数----------------"
- #执行全表空值数据记录数量SQL查询语句
- table_null_query_result=`hive -e "select count(*) from gmall.$table_name $null_where_sql_str"`
- #取出全表空值数据记录数量
- null_count=${table_null_query_result:3}
- echo "--------------------------------检验重复值记录数----------------------------------------------------------------"
- #执行全表重复值的记录数量SQL查询语句
- table_duplicate_query_result=`hive -e "select sum(tmp.duplicate_count) as duplicate_sum from (select count(*) as duplicate_count from gmall.$table_name group by $null_column having count(*)>1)as tmp"
- #取出全表重复值数据记录数量
- duplicate_count=${table_duplicate_query_result:3}
- echo "-------------------插入所有结果数据-------------"
- hive -e "insert into tdatacheck.table_count_add_standard values('$do_date','gmall','$table_name','increment_table','$add_count','$null_count','$duplicate_count','$total_count')"
6-6. 409数据质量ods层脚本增量记录数校验测试。
- chmod 777 increment_data_check_public.sh
- ./increment_data_check_public.sh 2020-06-14 ods_activity_rule id,activity_id
6-7. 410数据质量ods层脚本全量记录数校验测试。
- #只不过拷贝上述增量脚本的后半部分,去掉增量查询的语句,插入语句修改为如下:然后执行新脚本total_data_check_publick.sh。
- hive -e "insert into tdatacheck.table_count_add_standard values('$do_date','gmall','$table_name','total_table','null','$null_count','$duplicate_count','$total_count')"
6-8. 411ods层数据校验:需要检查的表;可用azkaban分开调度执行检查
- vim ods_data_check.sh
- data_date=$1
- #增量检查
- #订单详情表
- /opt/module/data_check/sh/increment_data_check_public.sh $data_date ods_order_detail id,order_id,user_id,sku_id,sku_name,order_price,sku_num,create_time
- #用户表
- /opt/module/data_check/sh/increment_data_check_public.sh $data_date ods_user_info id,name,birthday,gender,email,user_level,create_time,operate_time
- #支付流水表
- /opt/module/data_check/sh/increment_data_check_public.sh $data_date ods_payment_info id,out_trade_no,order_id,user_id,alipay_trade_no,total_amount,subject,payment_type,payment_time
- #订单状态表
- /opt/module/data_check/sh/increment_data_check_public.sh $data_date ods_order_status_log id,order_id,order_status,operate_time
- #商品评论表
- /opt/module/data_check/sh/increment_data_check_public.sh $data_date ods_comment_info id,user_id,sku_id,spu_id,order_id,appraise,create_time
- #退单表
- /opt/module/data_check/sh/increment_data_check_public.sh $data_date ods_order_refund_info id,user_id,order_id,sku_id,refund_type,refund_Num,refund_ammount,refund_reason_tyupe,create_time
- #活動點單關聯表
- /opt/module/data_check/sh/increment_data_check_public.sh $data_date ods__activity_order id,activity_id,order_id,crate_time
- #全量检查
- #订单表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_order_info id,final_total_amount,order_status,user_id,out_trade_no,create_time,operate_time,province_id,benefit_reduce_amount,original_total_amount,feight_fee
- #SKU 商品表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_sku_info id,spu_id,price,sku_name,sku_desc,weight,tm_id,category3_id,create_time
- #商品一级分类表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_base_category1 id,name
- #商品二级分类表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_base_category2 id,name,category1_id
- #商品三级分类表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_base_category3 id,name,category2_id
- #品牌表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_base_trademark tm_id,tm_name
- #SPU商品表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_spu_info id,spu_name,category3_id,tm_id
- #加购表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_cart_info id,user_id,sku_id,cart_price,sku_num,sku_name,create_time,operate_time,is_ordered,order_time
- #商品收藏表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_favor_info id,user_id,sku_id,spu_id,is_cancel,create_time,cancel_time
- #优惠券领用表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_coupon_use id,coupon_id,user_id,order_id,coupon_status,get_time,using_time,used_time
- #优惠券表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_coupon_info id,coupon_name,coupon_type,condition_amount,condition_num,activity_id,benefit_amount,benefit_discount,create_time,range_type,spu_id,tm_id,category3_id,limit_num,operate_time,expire_time
- #活动表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_activity_info id,activity_name,activity_type,start_time,end_time,create_time
- #优惠规则表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_activity_rule id,activity_id,condition_amount,condition_num,benefit_amount,benefit_discount,benefit_level
- #编码字典表
- /opt/module/data_check/sh/total_data_check_public.sh $data_date ods_base_dic dic_code,dic_name,parent_code,create_time,operate_time
6-9. 412 DWD层数据校验建表
- -- 1. 创建数据表,用于存放dwd层的数据校验结果
- hive> create table datacheck.dwd_table_data_check(
- data_date string comment '数据时间分区dt',
- database_name string comment '库名',
- source_table_name string comment '数据源表表名',
- source_column string comment '数据源表字段名',
- target_table_name string comment '数据目标表表名',
- target_column string comment '数据目标表字段名',
- consistent_data_count bigint comment '全表数据一致记录数',
- source_table_count bigint comment '数据源表全表记录数',
- target_table_count bigint comment '数据目标表全表记录数',
- target_duplicate_count bigint comment '数据目标表重复记录数'
- );
- hive>quit;
6-10. 413 dwd层数据质量校验脚本
- #2. 创建校验脚本
- vim table_consistent_check_public.shell
- #增量数据所在的日期分区
- do_date=$1
- #校验数据原表的表名
- source_table_name=$2
- #校验数据源表的字段(与目标表顺序一致才能对比亮哥哥字段)
- source_column=$3
- #校验数据目标表的表名
- target_table_name=$4
- #校验数据目标表的字段(与原表顺序一致才能对比两个字段)
- target_column=$5
- #初始化SQL语句
- join_on_sql_str=''
- #将校验数据源表的字段切割成列名数组
- source_column_array=(${source_column//,/ })
- #将校验数据目标表的字段切成列名数组
- target_column_array=(${target_column//,/ })
- #遍历数组,拼接表关联条件,输入字段全部关联
- for(( i=0;i<${#source_column_array[@]};i++ )) do
- if [ $i -eq 0 ]; then
- join_on_sql_str=" on $source_table_name.${source_column_array[i]}=$target.table_name.${target_column_array[i]} "
- else
- join_on_sql_str="$join_on_sql_str and $source_table_name.${source_column_array[i]}=$target_table_name.${target_column_array[i]}"
- fi
- done;
- echo "--------ods-dwd 一致性检查-------"
- #执行数据源表和目标表关联查询sql语句,查询数据一致性的条数
- consistent_data_query_result=`hive -e "select count(*) from gmall.$source_table_name join gmall.$target_table_name $join_on_sql_str"`
- #取出全表查询数据一致的条数
- consistent_data_count=${consistent_data_query_result:3}
- echo "-------ods 层记录条数-------"
- #执行查询数据源表的记录条数
- source_table_query_result=`hive -e "select count(*) from gmall.$source_table_name"`
- #取出全表数据源表的记录条数
- source_table_count=${source_table_query_result:3}
- echo "---------dwd层记录条数-------"
- # 执行查询数据目标表的记录条数
- target_table_query_result=`hive -e "select count(*) from gamll.$target_table_name"`
- # 取出全表数据目标表的记录条数
- target_table_count=${target_table_query_result:3}
- #执行全表重复值的记录数量sql查询语句
- table_duplicate_query_result=`hive -e "select sum(tmp.duplicate_count)as duplicate_sum from (select count(*) as duplicate_count from gmall.$target_table_name group by $target_column having count(*) >1 ) as tmp"`
- #取出全表重复值的数据记录数量
- duplicate_count=${table_duplicate_query_result:3}
- #将所有数据检验结果插入到表中
- hive -e "insert into datacheck.dwd_table_data_check value('$do_date','gmall','$source_table_name','$source_column',$target_table_name','$target_column','$consistent_data_count','$source_table_count','$target_table_count','$duplicate_count')"
6-11. 414 数据质量dwd层数据一致性校验
- #校验
- ./table_consisitent_check.sh 2020-06-14 ods_base_province name dwd_dim_base_profince province_name
需要校验的dwd层各表:
1.优惠券信息表2.订单明细事实表3.支付事实表4.退款事实表5.评价事实表6.加购事实表,7.收藏事实表。
6-12. 415 数据质量dwd层数据校验
总的脚本类似ods_data_check.sh
6-13. 416 数据质量-回顾
6-14. 417 数据质量dws层数据校验
1.因为dws层数据是聚合数据,无法一致性判断,和ods层一样只能通过表记录数和控制等判断,dws层将检验当日宽表记录数据是否在合理范围之内,关键字端是否为空的记录数量。
2.数据校验涉及表:每日会员行为,每日商品行为,每日活动行为,每日地区行为。
还用ods层的increm和total增量全量校验脚本去校验dws层4种行为的表数据校验。
6-15. 418 数据质量dwt层数据校验
dwt层是宽表,数据已经经过了一定的判断,过滤和转换等操作,因此在dwt层也将校验当日宽表记录数量是否符合合理范围之内,关键字段是否为空的记录的数量
需要校验的表:设备主题宽表,会员主题宽表,商品主题宽表,活动主题宽表,地区主题宽表。
只需要按照ods层的校验规则校验全量数据记录数。即使用ods层的total全量校验脚本进行校验。
6-16. 419 数据质量ads层数据校验介绍
6-17. 420 数据质量ads层数据校验-建表
orders-->ods:订单总金额
正常规律:70w<=订单总金额<=200w
10w<=订单商品数量<=20w
不同KPI需要定制化校验
- hive> create database datacheck;
- --创建数据表,用于存放ads层的数据校验结果
- hive>create table_datacheck.ads_table_data_check(
- data_date string comment '数据时间分区dt',
- database_name string comment '库名',
- table_name string comment '表名',
- column_name string comment '指标名',
- healthy_value string comment '该指标合理值',
- now_value bigint comment '该指标当前值',
- is_healthy bigint comment '该指标是否合理:1合理/0不合理'
- );
- hive>quit;
6-18. 421 数据质量ads层数据:设备数校验脚本
- #增量数据所在的日期分区
- do_date=$1
- hive -e "insert into datacheck.ads_table_data_check select
- temp.data_date,
- temp.database_name,
- temp.table_name,
- temp.column_name,
- temp.healthy_value,
- temp.new_mid_count,
- temp.is_healthy
- from (
- select \"$do_date\" as data_date,
- \"gmall\" as database_name,
- \"ads_new_mid_count\" as table_name,
- \"new_mid_count\" as column_name,
- \"bigger than 300\" as healthy_value,
- new_mid_count,
- if(new_mid_count >300,1,0) as is_healthy
- from gmall.ads_new_mid_count
- ) as temp
- "
6-19. 422 数据质量总结-增加数据报警机制
- 数据质量:为谁服务
- 数据质量标准:
- 完整性
- 一致性
- 不重复性
- 解决方案
6-20. 433 数据质量出现问题频率
- 数据多了几条
- 用户状态没更新
- stock 库存金额等对不上
同一个表一个月出现两次问题:维护
三、presto
1. 319即席查询概述(presto,kylin。。。。:查询sql比较快的计算引擎,durid用于实时查询多)
一类固定的KPI查询:如日活
一类灵活的kPI查询:要求灵活,延迟低,数据分析师
2. 320 presto概述(OLAP:存储用hive,hdfs多)
- SQL 查询引擎
- 支持GB到PB字节
- 秒级查询场景
- 不能处理在线事务(OLTP-存储用关系库)
优点:跨数据源连表查询(因为统一了数据结构schemal+table结构)
缺点:普通的聚合与美元,变读数据边计算,再清内存再计算快;连表查会产生大量临时数据,速度会慢。
连表查询可以晚上先join在一起,第二天早上单标查询。
impala性能稍优于presto;但是presto数据源丰富支持hive,图数据库,关系数据库,redis等。
3. 321 presto安装部署server:coodirator和worker都是server;discovery和coodirator一起占用一个端口两个服务。
主要三个东西
服务端
CLI端
可视化端yanagishima-18.0.zip
- # 下载解压
- wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.196/presto-server-0.196.tar.gz
- tar -zxvf presto-server-0.196.tar.gzip -C /opt/module/
- #进入安装路径
- # 创建数据存储目录
- mkdir data
- # 创建配置文件存储目录
- mkdir etc
- # 添加jvm.config配置文件
- -servers
- -Xmx16G
- -XX:+UseG1GC
- -XX:G1HeapRegionSize=32M
- -XX:+UseGCOverheadLimit
- -XX:+ExplicitGCInvokesConcurrent
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:+ExitOnOutOfMemoryError
- # 配置HIVE数据源
- #创建数据源配置目录文件
- cd etc
- mkdir catalog
- cd catalog/
- vim hive.properties
- connector.name=hive-hadoop2 #指hadoop第二套API
- hive.metastore.uri=thrift://hadoop102:9083
- # 分发prosto 安装目录到所有节点并分别配置node属性
- vim node.properties
- node.environment=production
- node.id=
- node.data-dir=/opt/module/presto/data
4. 322 presto server配置
presto是coordinator节点和多个worker节点组成
- #一台节点配置coordinator
- vim config.properties
- coordinator=true
- node-scheduler.include-coordinator=false
- http-server.http.port=8881
- query.max-memory=50GB
- discovery-server.enabled=true
- discovery.uri=http://hadoop102:8881
- #其他节点配置woker
- vim config.properties
- coordinator=false
- http-server.http.port=8881
- query.max-memory=50GB
- discovery.uri=http://hadoop102:8881
- #启动:日志目录$PRESTO_HOME/data/var/log
- ./launcher start
5. 323 presto cli 安装(jar包在linux实现了可执行的效果)
6. 324 presto cli 使用
- mv presto-cli-0.196-executable.jar prestocli
- chmod +x prestocli
- #启动prestocli
- ./prestocli --server hadoop102:8881 --catalog hive --schema default # 本质底层是exec java -jar 命令
- # presto 命令行操作
- select * from schema.table limit 100
7. 325 presto lzo说明:发现读lzo存储的数据报错:说明缺jar包依赖
parquet内部使用lzo? 列式存储
因为对接hive数据源:lzo依赖需要放到 plugin/hive-hadoop2/
- cp /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar $PRESTO_HOMEplugin/hive-hadoop2/
- #分发jar包
- cd $PRESTO_HOMEplugin/hive-hadoop2/
- xsync hadoop-lzo-0.4.20.jar
- # 重启presto服务
- # 重启客户端查询
- ## 发现读取parquet存储的lzo压缩的文件是ok的;
- ## 直接读取lzo文件报错如下:presto不支持
8. 326 presto web客户端
- # zip包指定解压目录-d参数,tar包解压目录-C参数
- #解压可视化压缩包
- unzip yanagishima-18.0.zip -d /opt/module/
- #配置文件追加配置
- vim yanagishima.preperties
- jetty.port=7080
- presto.datasources=atguigu-presto #给一个presto数据源(类似链接mysql某个数据库的源链接)起个名称
- presto.coordinator.server.atguigu-presto=http://hadoop102:8881
- catalog.atguigu-presto=hive
- schema.atguigu-presto=default
- sql.query.engines=presto
- # 启动web客户端
- nohup bin/yanagishima-start.sh >y.log 2>&1 &
9. 327 presto 注意事项
-
列式存储presto对orc相对parquet支持更好;压缩建议snappy解压快查询快。即orc+snappy
-
presto识别hive分区,建议优化分区存储
-
列式存储的查询sql优化:避免select *
-
加分区字段进行数据过滤
-
group by字段安装字段distinct 数据多少进行降序排列
- --good
- select ...group by uid, gender
- --bad
- select ... group by gender,uid
- order by 时使用limit
- join语句大表放左:join算法介绍
默认算法是broadcast join:左表切割到多个worker;右表广播复制到每个worker进行计算。如果右表太大就会可能内存溢出的错误。
hashjoin 是用于大表join大表的算法。按照join条件字段作为key取值该字段值进行hash:相同的值hash到同一个worker进行计算。
-
字段名是关键字用双引号分割不同于mysql的`
-
timestamp (时间数据)进行比较的时候要加Timestamp关键字,mysql可以直接进行比较
- select t from a where t > timestamp '2017-01-01 00:00:00';
-
不支持insert overwrite写法:智能先delete在insert into;presto是查询引擎。
-
支持parquet查询不支持insert