数仓复盘1

一、项目需求
1、用户行为数据采集平台
2、业务数据采集平台
3、javaee后台有一种建模思想叫关系建模。数仓则是按照维度建模。
数仓维度建模是面试必问项。N多家企业想对自己的数仓进行重构。但是市面上只有一本书—《数仓建模工具书》。理论方面最完整,缺点是没有实操。各大企业,美团滴滴阿里,都是按照这本书的理论去相应的实践。这次建模主要按照美团的建模思想。
4、分析,用户、流量、会员、商品、销售、地区、活动等电商核心主题,统计的报表指标近100个。
5、采用即席查询工具,随时进行指标分析。
6、对集群性能进行监控,发生异常需要报警。
扩展了不少内容,如javaee后台的mysql表结构、前端埋点、报表、可视化、运维-集群性能监控,学习这些可以在对接的时候知道对方在干什么,避坑。
7、元数据管理,各大公司必做。
8、质量监控,独立于大数据系统,运行时是否良好,指标是否正确,传过来的数据是否正确。(数据治理包括元数据管理、质量监控。)
19年6月国家发起一份白皮书,说数仓必须有建模、元数据管理、数据质量监控,就倒逼各大企业加强完善。美团和oppo都做得不错。

二、思考题
1、项目技术如何选型?
数据量大小(小/一千万条-mysql,TB/亿条-hive)、业务需求(文件-flume,mysql-sqoop来导入导出)、行业内经验、技术成熟度(1.0/2.0/3.0而不是0.几的)、开发维护成本、总成本预算(有些框架是收费的)。

  • 数据采集传输:flume,kafka,sqoop,logstash,datax.前三个配套用会更好些。flume用于处理读取文件,kafka用于缓存,sqoop负责从mysql中导数据的。 flume-logstash 都可采集文件,logstash是ELK这套系统的(用于没有大数据的场景,没有hadoop集群,因为它的数据量还可以的,大于mysql,小于大数据);sqoop-datax 历史原因选择sqoop。

  • 数据存储:
    mysql-存储可视化的展示数据,同时也用于模拟javaee后台产生的数据。
    hdfs :hive
    hbase:kylin是一种预查询,结果会存在hbase。实时往里面写 kv 数据。
    redis:相当于缓存。
    mongodb:前端和python用的比较多。特点:存储数据量不是特别大,到一定程度时会用hbase存储。
    用的多的是hdfs、mysql,hbase也会用一下。

  • 数据计算:
    hive: 底层是MR,比较慢。
    Tez:基于内存的,速度会快很多。
    spark: 直接替换hive,sql和分析不用变化,用户应用层没有感知,查询速度相对快。
    flink:有盖过spark的趋势。支持实时处理和批处理。阿里收购了,形成一个框架叫blink,1.10是合并了新功能的版本。
    storm:纯实时。被淘汰了。

  • 数据查询:
    presto:基于内存。apache一般会用presto,安装起来比较方便
    druid:实时和批处理的结合。只能处理单张表,多表join处理不了,那就用spark/flink有优势。
    impala:impala也是基于内存。cdh会选择impala,是内部集成了。
    kylin:预计算,可多维度查询,查询快。

  • 数据可视化:
    echarts(百度开源的,开发有一定难度,需要写java代码,包括对数据进行对接,图形还要绘画,相对来说麻烦些)、
    superset(开源免费的,这个图形没这么多,主要是柱状图、饼状图、折线图,一般中小型公司够用)、
    quickbi、datav(这两个好用些,收费)

  • 任务调度:azkaban、oozie(不是很好用,企业也用的少,配套cdh用的,内部集成了)

  • 集群监控:zabbix 监控集群内存、磁盘使用情况、进程情况-挂了可以发给钉钉/邮箱/二次开发-打电话。

  • 元数据管理:atlas(hive里面有元数据)

  • 数据质量监控:griffin,监控数仓运行是否正常、指标是否正确等。

2、框架版本如何选型?
apache框架:

框架型号
hadoop2.7.2
flume1.7.0
kafka0.11.0.2
hive2.3
sqoop1.4.6
mysql5.6.24
azkaban2.5.0
java1.8
zookeeper3.4.10
presto0.189

3、服务器使用物理机还是云主机?
阿里云、华为云、腾讯云、网易云、京东云,云主机里阿里云用户占有量最多。
资金紧张的话可以选云主机,融资后改为物理机。
一般核数是线程数的一半。一个线程就是一个并发。
云主机可以按天按月来买,也不需要运维人员,剩下成本。一般建议物理机,数据安全。
配置如 128G内存,8T机械硬盘,2T固态硬盘,20核CPU,40线程的戴尔单台报价4W,还需要专门的运维人员。

4、如何确认集群规模?
每天100G数据,要买多少台服务器?
公司发展的不同阶段,埋点的数据会不一样,比如初期可能一人一天十条埋点数据,中期100条,后期200条。
用户行为数据 一天有 100w日活*100条人均埋点数据量=1亿条日志
每条日志0.5~2k大小,随着字段数量增多也增大,1K大小左右是合理的,100000000/1024/1024=100G。
场景:100w日活=100G数据量/天,还要半年不扩容 (*180),保存3副本(*3),预留20%~30%Buf (/0.7) ,即需要77T,zabbix-集群监控-超过阈值会报警发钉钉/邮件,就需要往集群增加磁盘或服务器了。故,每台服务器8T磁盘的话,即需要10台服务器。还要考虑数仓分层-会增大使用空间 和 数据压缩-会减少使用空间,这个后面再提。

把内存大的服务尽量分开,像NameNode 和ResourceManager 和 SecondaryNameNode。
把框架联系比较紧密的、通讯比较频繁的服务放在同一台服务器上,通讯会更快。
在这里插入图片描述
服务器时间戳和事件json的客户端时间戳 如果相差太大,就是网络传输有问题,就需要查询原因。一条日志的事件有多个,是因为这是批处理。今日头条的话就是实时的,一条日志一个事件。
5、数据采集模块
5.1、项目经验之HDFS存储多目录
什么时候需要配置多目录?
df -h看到多块磁盘使用率达到80%以上,就要考虑配置多目录+开启数据均衡命令(不用一直开着,因为这是实时的检测,浪费资源,差不多了就关掉)。注意,多目录必须真实存在。

5.2、项目经验之支持LZO配置
企业开发中,就两个主流的压缩,一个LZO,一个Snappy。LZO支持切片。
采用LZO压缩,默认就支持切片吗?不是。需要创建索引。

5.3、项目经验之基准测试:hadoop提供了测试的jar包,不需要自己造数据。一般是读性能比较快,100-200M/s。

5.4、 项目 经验之 之 Hadoop 参数
5.4.1、HDFS 参数调优 hdfs-site.xml,设置 dfs.namenode.handler.count=20 * log2(Cluster Size)。
原理:NameNode 有一个工作线程池,用来处理不同 DataNode 的并发心跳以及客户端并发
的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大参数
dfs.namenode.handler.count 的默认值 10。

5.4.2、YARN 参数调优 yarn-site.xml
场景:数据统计主要用 HiveSQL,没有数据倾斜,小文件已经做了合并处理,开
启的 JVM 重用,而且 IO 没有阻塞,内存用了不到 50%。但是还是跑的非常慢,而且数据
量洪峰过来时,整个集群都会宕掉。内存
原因:利用率不够。这个一般是 Yarn 的 2 个配置造成的,单个任务可以申请的最大内存
大小,和 Hadoop 单个节点可用内存大小。调节这两个参数能提高系统内存的利用率。

  • mapTask和reduceTask的默认内存大小是 1G。根据mapTask的数据量进行调整,还有1G mapTask 可能就要4G reduceTask了,reduceTask也要进行调整。
  • 单个任务可申请的最大内存,默认8G。
  • yarn单节点内存,默认8G。

在这里插入图片描述

5.4.3、Hadoop 宕机
hadoop宕机:重启就行了,因为有三个副本。但是也要分析原因:
(1)如果 MR 造成系统宕机。此时要控制 Yarn 同时运行的任务数,和每个任务申请的
最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物
理内存量,默认是 8192MB)
(2)如果写入文件过量造成NameNode 宕机。那么调高 Kafka 的存储大小,控制从 Kafka
到 HDFS 的写入速度,flume 的batch size可控制。高峰期的时候用 Kafka 进行缓存,高峰期过去数据同步会自动跟上。

5.4.4、hadoop参数调优:
nodeManager的默认内存是8G ,实际上要根据服务器实际内存(128G)配置,不然会OOM。任务默认内存为8G,如wordCount。里面会有x个mapTask 和 reduceTask,默认内存都为1G。如果块大小 128M,对应1G内存,这样就不用调了。但是汇总的时候,进入到reduce时的数据是多少。如果RT用了2G内存,那么任务内存就要调为10G(1G数据=8G MT内存 + 2G RT)。

5.5、 项目经验之 Linux 环境 变量
shell分两种环境:登录式shell( 采用用户名登录。会自动加载/etc/profile/)和非登录式shell (ssh server cmd。会自动加载~/.bashrc,它未来会加载etc/profile.d下所有后缀为sh的文件)
/etc/profile 配置环境变量,或者/etc/profile.d/env.sh。

5.6、项目经验之Flume使用
5.6.1、Flume组成
flume 监控器 ganglia – 查看flume运行情况。
souce:

  • taildir source 断点续传、多目录。
  • exec source 实时搜集数据,在flume不运行或shell出错时,会丢失
  • spooling directory source 监控目录,不支持断点续传。
    batchSize如何设置? 经验值:event 1K 左右时,每批次拉取500-1000个event(默认为100)。

channel

channel特点场景
MemoryChannel传输数据速度更快,但因为数据保存在 JVM 的堆内存中,Agent 进程挂掉会导致数据丢失,适用于对数据质量要求不高的需求。传输的是普通日志信息(京东内部一天丢 100 万-200 万条,这是非常正常的),通常选择 MemoryChannel。
FileChannel传输速度相对于 Memory 慢,但数据安全保障高,Agent 进程挂掉也可以从失败中恢复数据。金融类公司、对钱要求非常准确的公司通常会选择 FileChannel
kafka channelkafka channel 省去了sink,提高了效率。1.7以前的flume-kafka channel 是有问题的,因为它会把header的信息混在内容写入kafka消息中,就需要自己截取掉。。kafka channel的数据是存在在kafka里面。kafka存储数据,是基于磁盘的,和fileChannel 一样故可靠性高。

channel选择器 有 multiplexing 和 replicating,前者可指定 channel。
配置flume 完全依赖官方手册/尚大笔记。(a1.channels.c1.parseAsFlumeEvent 要指定为 false,否则后面要做额外的操作。)
flume进程是application。注意还有一些进程也是application。如何代表唯一呢?配置文件的名称,如file-flume-kafka.conf,即用grep代替。

具体:ps -ef | grep application | grep -v grep | awk '{print $2}'
说明:查找application进程的进程号。grep -v 是排除功能;awk的默认分隔符就是空格;在脚本中的话$2前面要有个转义字符 \。
| xargs kill -9 。表示前面运算完的结果作为后面命令的参数。
nohup,该命令可以在你退出账户/终端之后继续运行相应的进程。nohup就是不挂起的意思,不挂断地运行命令。

etl拦截器、类型区分拦截器
1.实现interceptor接口
2.重写四个方法:初始化、关闭、单event、多event)
event 能获取到body、header
etl => body => 主要判断的就是json数据是否以 { 开头,以}结尾,服务器时间长度=13 且由数字组成
分类型拦截器 => body header=>根据body区分类型,把相应数据添加到header(map值为 topic,start_topic/event_topic)
3.静态内部类Builder
new 对象
4.打包、上传集群

5.6.2、FileChannel 优化
通过配置 dataDirs 指向多个路径,每个路径对应不同的硬盘,增大 Flume 吞吐量。
checkpointDir 和 backupCheckpointDir 也尽量配置在不同硬盘对应的目录中,保证
checkpoint 坏掉后,可以快速使用 backupCheckpointDir 恢复数据。

5.7、项目经验之kafka使用
进程名就是kafka。
kafka集群有broker.id,不得重复。内部集成了zookeeper,一般用外部的。
kafka 开启和停止的时间都比较长,所以要加延时,否则集群不会照我们希望的启动和停止。
kafka监控有kafka manager、monitor、eagle。eagle是企业用的比较多的kafka监控框架。
kafka压测,正常集群应该达到 百兆/s 的消费能力和生产能力。4G内存的写入吞吐量为 2M/s,消费吞吐量为2M/s。
kafka消费能力,可以通过增加分区提高并发度提高。
kafka 机器数量 = 2*(峰值生产速度*副本数/100)+1 = 3台。(kafka峰值生产速度通常小于50M/s,副本数一般为2 居多。)

5.7.1、场景:日志消费 Flume,kafka source - file channel - hdfs sink。
file channel相关:

  • 需要一个磁盘路径,那如何能找到存储的位置,那就需要一个索引文件。索引文件相当于NN,磁盘相当于DN。故配置文件含两个设置 ,checkpointDir 为索引文件路径,dataDirs 为数据存储路径。
  • channel容量 capacity,file channel能存100w 个event,memory channel 只能存100个event。

hdfs sink 相关的:

  • maxFileSize 为文件到达多大自动再形成一个文件。
  • fileType设置为 CompressedStream。
  • 压缩流编码方式 codeC 为lzop。hive一般会设置压缩和列式存储。控制输出文件是原生文件,一般会设置压缩。100G lzo 压缩可以到 10G,三个副本就是 30G。
  • hdfs sink每天的文件夹是和日期有关的,即后面会在hive成分区表。默认1分钟产生一个文件夹,设置这三个参数则修改产生文件夹的频率。hdfs.round、hdfs.roundValue、hdfds.roundUnit 。
  • 设置这3个参数配置 产生文件的频率,flume采集到一条/一批次,就会在hdfs形成一个小文件。
参数含义
rollInterval一般配置为3600s-一小时 或两小时,区别在于是否1小时能达到128M。
rollSize大小达到。一般设为128M=134217728B。
rollCount达到event 个数。一般设为0,因为event 大小不可控,容易导致不均匀。

put事务相关:

  • keep-alive 为put(source->channel) 操作的等待时间,默认为3s。如果event数量达到最大值,就会提交失败,就会回滚(重新put),如果时间内take出了数据,put 就能继续。

6、杂项
6.1、zookeeper的进程名为 jps–QuorumPeerMain,但是光看到这个不能证明zk是正确启动的,需要查询 bin/zkServer.sh status,有leader就是正常启动了–半数选举机制。
6.2、jar包运行方式:java -classpath jar包 全类名 或者 java -jar jar包
两者场景:解压jar包,如果META-INF文件夹的mainfest.inf 文件的最后一行有main-class有值时,就可以使用java -jar。
6.3、真正的技术含量是你分析问题、解决问题的能力,而不是死记硬背命令等东西。如 不用flume,如何实现kafka 数据上传到 hdfs? java代码,先消费kafka数据,再上传数据到HDFS。点形成面/连线。spark streaming 也是可以的。
待做:要整理自己的知识库、功能代码库。如kafka生产者代码,消费者代码,上传hdfs代码,下载hdfs代码。

6.4、常用
ssh -t 通常用于ssh远程执行sudo命令。
写多台服务器上执行同样命令的脚本以提高开发效率。
daemon 表示在后台运行。

6.5、常用三种脚本:启动停止脚本、导入导出脚本、层级内部的导入(如ods到dwd)。
6.6、集群时间同步脚本参考hadoop集群时间同步。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值