数仓 - 知识图谱,技术组件,面试问题
2024-11-19 17:16:14 13 举报
AI智能生成
数仓 - 数据仓库,技术组件,面试问题; datahouse, dataware, extract, transform, load, etl, mq, hive, hbase, linux
作者其他创作
大纲/内容
数仓
采集通道
前端埋点产生日志行为数据logfile
flume
kafka
flume/java
hdfs
后台产生的业务数据mysq
sqoop/datax/kettle
hdfs
数仓建模
hdfs
hive、spark
数据分析
即时查询 kylin、prosto
可视化
superset
输出
报表系统、用户画像、推荐系统
权限管理
元数据管理:atlas
数据质量
shell griffin
hive
组成
元数据
多人开发 mysql
客户端
4个器 编译器、解析器、优化器、执行器
sql变换
mapreduce
hdfs
与mysql区别
hive
大数据
数据量大快
海量数据查询
mysql
小数据
数据量小块
小数据量查询
内部表和外部表
内部表
删除数据:元数据、原始数据
外部表
删除数据:元数据
企业中,临时使用创建内部表,绝大多数外部表
4个by
order by
全局排序 (数据倾斜)
很少使用
sort by
排序
depart by
分区
企业一般分区+排序
class by
sort by+depart by
系统函数
date_add
date_sub
next_day
last_day
get_json_object
自定义函数
自定义UDF函数
1进1出 一行
定义类,继承UDF,重写evaluate方法
自定义UDTF函数
多进多出 一进多出
定义类继承G..UDTF,重写里面3个方法初始化(定义名称、校验返回值类型)、close process
打包+上传HDFS=》在hive客户端创建
窗口函数
rank
over
topn
优化
mapjoin 默认打开,不要关闭
行列过滤 join where=》where join
分区
小文件
spark
定义
Apache Spark是一个开源的分布式计算系统,旨在提供高性能、易用性和通用性。
Spark的设计目标是解决传统的 Hadoop MapReduce 的局限性,包括高延迟、低效率和限制性的API
组件
Driver(驱动器)
Spark应用程序的主要入口点,驱动器负责管理应用程序的整体执行流程。
驱动器程序通常运行在一个独立的进程中,负责与集群管理器交互,将工作分发给集群的Executor。
驱动器负责将用户的应用程序转换为任务,并协调Executor的执行。
驱动器程序通常运行在一个独立的进程中,负责与集群管理器交互,将工作分发给集群的Executor。
驱动器负责将用户的应用程序转换为任务,并协调Executor的执行。
Executor(执行器)
在Spark集群中运行的工作单元,负责执行任务并存储数据。
每个Executor通常运行在独立的JVM进程中,并由集群管理器分配给特定的节点。
Executor负责执行驱动器分配的任务,并在需要时缓存数据,以便后续重用。
每个Executor通常运行在独立的JVM进程中,并由集群管理器分配给特定的节点。
Executor负责执行驱动器分配的任务,并在需要时缓存数据,以便后续重用。
Cluster Manager(集群管理器)
负责管理Spark集群中的 资源分配 和 任务调度。
Spark支持多种集群管理器,包括独立部署模式、Apache Mesos 和 Hadoop YARN等。
集群管理器负责启动和停止Executor,以及监视集群中的资源使用情况以便动态调整资源。
Spark支持多种集群管理器,包括独立部署模式、Apache Mesos 和 Hadoop YARN等。
集群管理器负责启动和停止Executor,以及监视集群中的资源使用情况以便动态调整资源。
RDD(Resilient Distributed Dataset)
弹性分布式数据集,是Spark中的核心抽象概念。
RDD是分布式对象的集合,可以在集群中进行并行操作。
RDD具有容错性,可以通过存储每个分区的转换操作来重新计算丢失的数据。
RDD是分布式对象的集合,可以在集群中进行并行操作。
RDD具有容错性,可以通过存储每个分区的转换操作来重新计算丢失的数据。
Block Manager(块管理器)
负责管理Executor节点上的数据存储和数据传输。
Block Manager负责将数据分割为固定大小的数据块,并在集群中的不同节点之间进行传输和复制。
它还负责在Executor节点上管理内存和磁盘上的数据存储,以便在需要时进行快速访问。
负责管理Executor节点上的数据存储和数据传输。
Block Manager负责将数据分割为固定大小的数据块,并在集群中的不同节点之间进行传输和复制。
它还负责在Executor节点上管理内存和磁盘上的数据存储,以便在需要时进行快速访问。
Spark SQL(结构化数据处理)
优势
实时数据处理和流式分析(real time streaming)
案例
批量数据处理和ETL(Extract, Transform, Load)
案例
机器学习和数据挖掘
案例
图数据分析
利用context案例
实时推荐系统
案例
技术栈
SparkContext API
SparkContext是Spark应用程序的入口点,用于与Spark集群进行通信和管理资源。它负责创建RDD、广播变量和累加器,并启动Spark作业的执行。
RDD API
RDD(Resilient Distributed Dataset)是Spark中的核心数据抽象,代表分布式的对象集合。
RDD支持各种转换操作(如map、filter、reduce等)和行动操作(如collect、count、saveAsTextFile等),用于进行数据处理和分析。
RDD支持各种转换操作(如map、filter、reduce等)和行动操作(如collect、count、saveAsTextFile等),用于进行数据处理和分析。
DataFrame API
DataFrame是基于RDD的高级抽象,提供了类似于关系型数据库表的数据结构和操作接口。
DataFrame支持SQL查询、结构化数据处理和机器学习任务,具有更高的性能和易用性。
DataFrame支持SQL查询、结构化数据处理和机器学习任务,具有更高的性能和易用性。
Streaming API
Streaming API用于实时数据流处理,可以从各种流式数据源中读取数据,并进行实时处理和分析。
它提供了丰富的转换操作(如window、map、reduceByKey等)和输出操作(如saveAsTextFiles、foreachRDD等)。
它提供了丰富的转换操作(如window、map、reduceByKey等)和输出操作(如saveAsTextFiles、foreachRDD等)。
MLlib API
MLlib是Spark中的机器学习库,提供了各种常用的机器学习算法和工具,如分类、回归、聚类、推荐等。
它支持分布式模型训练和批量预测。并具有高性能。
MLlib是Spark中的机器学习库,提供了各种常用的机器学习算法和工具,如分类、回归、聚类、推荐等。
它支持分布式模型训练和批量预测。并具有高性能。
计算
作业提交、任务调度、数据处理、结果返回
kafka
基本信息
producer
broker
consumer
zookeeper
Zookeeper是Kafka集群的协调者,负责管理Broker的状态、Partition的分配和 Offset 偏移量的管理。
broker
id
partition
number
comsumer
offset
没有producer
副本
提高可靠性
默认一个 一般2
副本多:可靠性高,性能降低
分区
提高并发度
先设置1-3个
生产者峰值生产速率tp、消费者峰值消费速率tc
期望的吞吐量t
期望的吞吐量t 100m/s 分区数=t/min(tp,tc)
100/20= 5个分区
分区分配策略
range 默认
统一发生数据倾斜
roundrobin
采用hash方式打散,再采用轮询的方式执行
数据量
可以存储TB级别的数据量
100万日活 100条 1k 每天一亿条
一亿条/(24h*3600s)=1150条/s
数据保存多久
7-3天
磁盘空间
100g*2个副本*5天/0.7
topic合适
满足下一级所有消费者
挂了
短期:flume channel缓冲数据
长期:日志服务器保留30天日志
解决leader选举
Zookeeper的多节点和顺序性
ZNode(节点):Zookeeper的基本数据单元,类似于文件系统中的文件或目录。
每个ZNode都有一个唯一的路径标识符,可以包含数据和子节点。
数据:每个ZNode可以存储一些数据,这些数据可以是任意类型的字节流。
子节点:每个ZNode可以有多个子节点,子节点可以包含数据和更多的子节点,形成一个树状结构。
版本号:每个ZNode都有一个版本号,用于实现乐观锁机制,确保数据的一致性。
每个ZNode都有一个唯一的路径标识符,可以包含数据和子节点。
数据:每个ZNode可以存储一些数据,这些数据可以是任意类型的字节流。
子节点:每个ZNode可以有多个子节点,子节点可以包含数据和更多的子节点,形成一个树状结构。
版本号:每个ZNode都有一个版本号,用于实现乐观锁机制,确保数据的一致性。
丢了
ack
0 发过来数据,不需要应答
可靠性最差,传输性能最好
1 发过来数据,leader应答
可靠性一般,传输性一般
-1 发过来数据,leader和follower共同应答
重复了
事务、幂等性+ack=-1
幂等性
单分区单会话内数据不重复
关闭就重启
利用id判断重复
效率低
事务
同步,效率低
下一级处理
在业务端使用幂等
积压了
增加分区,增加消费者对应cpu核数
1个cpu两个线程,消费两个分区
增加消费者batchsize
提高消费速度,如日志是1k,1000条/s
优化
日志保存3天
两个副本
增加通信延迟
减少重传
内存
默认1G,不要超过6G
高效读写
使用集群、分区
顺序读写600m/s 随机速写100m/s
零拷贝
内存到内核,内核到内存
传输了一条2m日志文件
卡顿现象
调整最大字节数
过期数据清理
删除或者压缩
数据是否有序
单分区有序,多分区分区与分区间无序
shell
三剑客
awk
awk '{print $1}' data.txt
grep
grep "an" data.txt
sed
sed 's/world/everyone/' data.txt
要将文件中的"world"替换为"everyone",可以使用sed
其他技巧
sort
sort file.txt
sort -r file.txt
docker ps -a | sort -V
du -m -d 1 | sort -n
du -m -d 1 | sort -k 2
cut
sudo sh -c 'echo 1 > /proc/sys/vm/drop_caches'
sudo sh -c 'echo 2 > /proc/sys/vm/drop_caches'
输入法安装
用户环境
.bashrc: 这个文件主要用于交互式的非登录shell。当你启动一个新的终端窗口或标签页时,通常会加载.bashrc文件。
.profile: 这个文件则主要应用于登录shell。当通过SSH登录到机器,或者使用诸如su -这样的命令切换到另一个用户时,系统会启动一个登录shell,并读取.profile文件(如果存在)。
进程管理
top
top
htop
top -p id
ps -ef | grep xxx
查看XXX进程
端口管理
natstat
查看端口号
使用netstat命令查看所有端口的详细参数:
netstat -tuln
netstat -tuln
使用lsof命令查看指定端口的应用详细参数:
lsof -i :端口号
lsof -i :端口号
ufw
检查防火墙设置
sudo ufw status
查看防火墙状态
sudo ufw status verbose
查看防火墙规则
sudo ufw enable
启用防火墙
sudo ufw allow ssh
如果防火墙开启了SSH端口(默认为22),可以使用以下命令允许SSH连接
80端口服务:
sudo ufw allow 80/tcp
对于UDP协议:
sudo ufw allow 53/udp
若要允许来自特定IP地址的连接到某个端口(如SSH端口22):
sudo ufw allow from 192.168.1.100 to any port 22
sudo ufw allow 80/tcp
对于UDP协议:
sudo ufw allow 53/udp
若要允许来自特定IP地址的连接到某个端口(如SSH端口22):
sudo ufw allow from 192.168.1.100 to any port 22
sudo ufw delete [规则编号]
如果防火墙设置了其他规则导致SSH连接受阻,可以使用以下命令删除相应规则
ip link
查看网卡状态
ip address
查看网卡的ip地址信息
curl 命令是一个用于传输数据的工具,支持多种协议(HTTP、HTTPS、FTP)
curl -X POST -H "Authorization: Bearer token" -d "username=user&password=pass" -i https://www.example.com/login
文件系统格式
FAT32(File Allocation Table 32)
是一种较为古老的文件系统格式
支持最大单个文件4GB,最大磁盘容量为2TB。
FAT32格式通常用于移动设备和存储设备,如U盘、SD卡等。几乎所有操作系统都支持FAT32格式。
NTFS(New Technology File System)
是Windows操作系统中常用的文件系统格式
支持单个文件大小达到16TB,最大磁盘容量为256TB。
NTFS格式支持文件加密、压缩、权限控制等功能。Windows操作系统完全支持NTFS格式,其他操作系统 macOS, Linux 可以读取 NTFS格式的磁盘。
exFAT(Extended File Allocation Table)
一种针对移动设备和闪存存储设备设计的文件系统格式
支持单个文件大小达到16EB,最大磁盘容量为128PB。
exFAT格式通常用于大容量移动硬盘、闪存卡等设备。Windows、macOS和Linux 等操作系统都支持exFAT格式。
HFS+(Hierarchical File System Plus)
是苹果公司开发的文件系统格式,用于Mac OS X操作系统。
HFS+支持单个文件大小达到8EB,最大磁盘容量为8EB。
HFS+格式在macOS系统中得到完全支持,但在Windows和Linux系统中需要安装额外的驱动程序才能读取HFS+格式的磁盘。
分配单元大小
是指在磁盘上分配存储空间的最小单位。选择合适的单元大小可以影响磁盘的性能和空间利用率。
原理:分配单元大小的选择会影响文件系统的存储效率。
对于大容量的磁盘,可以选择较大的单元大小,以减少碎片化;
对于小容量的磁盘,可以选择较小的单元大小,以提高空间利用率。常见的分配单元大小有4KB、8KB、16KB等。
磁盘管理
查看磁盘
fdisk -l
详情
lsblk
结构,总结
查看磁盘空间
df -h
df 默认以 K 计算大小
挂载磁盘
格式化磁盘
mkfs.ext4 /dev/sdb
挂载到目录
mount /dev/sdb /data
自动挂载/models案例
/etc/fstab 是 Linux 系统中的一个重要配置文件,定义系统启动时挂载
自动挂载案例
迁移docker到挂载盘案例
查看磁盘分区
parted /dev/sdc print
修改磁盘分区大小,扩容
parted /dev/sdc
内存管理
sync:将内存中的数据同步到磁盘中,确保数据的完整性。这个命令通常用于在关机之前执行,以确保数据已经保存到磁盘中。
echo 1 > /proc/sys/vm/drop_caches
清空页缓存,即释放被占用的内存。但需要注意的是,这个命令只会清空页缓存,不会清空缓冲区和缓存区。
echo 2 > /proc/sys/vm/drop_caches
清空页缓存和目录项缓存,释放缓存占用的内存。
free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h
一个综合性的清理内存命令:会先显示当前内存使用情况,然后执行sync命令将数据同步到磁盘中,接着清空缓存,最后再次显示内存使用情况。
用户管理
adduser:用于添加新用户
常用参数:
-m:创建用户的同时创建用户的家目录。
-g:指定用户所属的初始用户组。
-m:创建用户的同时创建用户的家目录。
-g:指定用户所属的初始用户组。
usermod:用于修改用户属性
常用参数:
-aG:将用户添加到指定的用户组。
-l:修改用户名。
-aG:将用户添加到指定的用户组。
-l:修改用户名。
对于基于 Debian 的系统(如 Ubuntu),使用:
sudo usermod -aG sudo peter
对于基于 Red Hat 的系统(如 CentOS),使用:
sudo usermod -aG wheel peter
sudo usermod -aG sudo peter
对于基于 Red Hat 的系统(如 CentOS),使用:
sudo usermod -aG wheel peter
deluser:用于删除用户
常用参数:
--remove-home:删除用户的同时删除用户的家目录。
passwd:用于修改用户密码。
--remove-home:删除用户的同时删除用户的家目录。
passwd:用于修改用户密码。
su:切换用户
sudo:以超级用户权限执行命令。
whoami:显示当前登录用户的用户名。
groups:显示当前用户所属的用户组。
id:显示用户的 UID 和 GID。
组管理
addgroup:用于添加新用户组
groupadd:同addgroup,用于添加新用户组
delgroup:用于删除用户组
groupdel:同delgroup,用于删除用户组
usermod:用于修改用户属性,包括用户所属的用户组
常用参数:
-g:修改用户的初始用户组。
-aG:将用户添加到指定的用户组。
-g:修改用户的初始用户组。
-aG:将用户添加到指定的用户组。
usermod -aG root
groups:显示用户所属的用户组
权限管理 permision
含义
最前面 - 代表的是类型
中间那三个 rwx 代表的是所有者(user)
然后那三个 rw- 代表的是组群(group)
最后那三个 r-- 代表的是其他人(other)
中间那三个 rwx 代表的是所有者(user)
然后那三个 rw- 代表的是组群(group)
最后那三个 r-- 代表的是其他人(other)
权限
r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
- 表示相应的权限还没有被授予
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
- 表示相应的权限还没有被授予
其中:rwx也可以用数字来代替
r ------------4
w -----------2
x ------------1
- ------------0
r ------------4
w -----------2
x ------------1
- ------------0
操作
其中:
u 代表所有者(user)
g 代表所有者所在的组群(group)
o 代表其他人,但不是u和g (other)
a 代表全部的人,也就是包括u,g和o
chmod a+r xxx.xx
表示给所有人读取xxx.xxx这个文件的权限
chmod go-rw xxx.xx
表示删除xxx.xxx中组群和其他人的读和写的权限
u 代表所有者(user)
g 代表所有者所在的组群(group)
o 代表其他人,但不是u和g (other)
a 代表全部的人,也就是包括u,g和o
chmod a+r xxx.xx
表示给所有人读取xxx.xxx这个文件的权限
chmod u+rwx xxx.xx
表示给所有者 添加读写执行的权限
表示给所有者 添加读写执行的权限
chmod go-rw xxx.xx
表示删除xxx.xxx中组群和其他人的读和写的权限
其他常用样例
sudo chmod 600 ××× (只有所有者有读和写的权限)
sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)
sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)
sudo chmod 666 ××× (每个人都有读和写的权限)
sudo chmod 777 ××× (每个人都有读和写以及执行的权限)
sudo chmod -R 777 文件或文件夹的名字(若分配给某个文件所有权限)
sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)
sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)
sudo chmod 666 ××× (每个人都有读和写的权限)
sudo chmod 777 ××× (每个人都有读和写以及执行的权限)
sudo chmod -R 777 文件或文件夹的名字(若分配给某个文件所有权限)
hadoop
入门
端口号
9870
hdfs
50070
8088
yarn
19888
查看任务情况
9000、8020、9820
外部访问
9000、8020
配置文件
core-site.xml
hdfs-site.xml
yarn-site.xml
mapred-site.xml
workers
slaves
hdfs
读写流程
小文件
危害
namenode受不了
一个文件块150字节
128g/150bytes=128 *1024m*1024kb*1024bytes=9亿
一个文件块->一个maptask 1g内存
解决
CombineTextinputformat
减少maptask
har归档
类似文件压缩
jvm重用
配置文件
副本
3
块大小
1.x 64m
2.x 3.x 128m
本地 32m
企业开发 128m、256m
块大小根据传输速率设置
mapreduce
shuffle
map方法之后,reduce方法之前混洗的过程
map
getpartition 标记数据是哪一个分区的
环形缓冲区 100m 80% 溢写
归并
写入磁盘
拉取到内存,不够持久化到磁盘
归并
reduce
reduce之后压缩:
永久保存,压缩越小
下一个map输入:数据量小:快 spappy/lzo 数据量大:切片 bzip2/lzop
分组
默认拉取5个 优化性能高10-20个
优化增加内存
优化:压缩,减少磁盘io
快 spappy/lzo
默认一次拉取10个,可优化20个
优化 200m 90%,影响溢写文件个数
排序:快排
对key的索引排序
按照字典顺序排
溢写文件
对溢写文件提前combiner 不影响最终结果
优化:自定义分区
map之前压缩
数据量小:快 spappy/lzo
数据量大:切片 bzip2/lzop
排序
map 快排、归并
reduce 归并、分组
内存参数
nodemanager
默认8g->100g
单任务默认内存8G 分布式
128M数据->1G内存
maptask 1G
128M数据->1G内存
reducetask 1G
128M数据->1G内存
yarn
工作机制
client
resourcemanager
接受appid请求并返回集群路径
向路径提交
xml
配置文件 参数
jar
代码
切片
决定maptask数量
resourcemanager
申请 appmaster task
task管理
nodemanager container 空闲就来领取task 成为appmaster
从路径获取文件
切片决定maptask数量
向resourcemanager申请maptask
nodemanager container 空闲就来领取task 由appmaster开启maptask 完成之后持久化到磁盘等待reduce
开启reducetask
调度器
fifo
先进先出
单队列,串行,几乎不用
容量调度器
底层是fifo
支持多队列,可以借用其他队列资源
先进入的任务优先执行
默认1个队列,按照分析引擎创建队列(spark、flink、hive),按照业务分:登录、注册、购物车
公平调度器
支持多队列,可以借用其他队列资源
公平享有队列资源,谁的缺额多,分配资源多
apache 默认容量调度
并发度要求比较高,选择公平,中大型
并发度低,服务器性能差,选择容量
zookeeper
选举机制
半数机制
安装台数
10-3
20-5
50-7
100-7
台数越多,增加可靠性,效率低
flume
组成
source、channel、sink、put、take
taildirsource
断点续传、多目录
1.7实现
自定义实现source
offset持久化到磁盘
taildirsource挂了
不会丢数据、有可能有重复数据
自身
采用事务方式、效率低
下一级处理
hive、dwd、sparkstream,groupby,开窗取窗口第一条
不支持递归遍历文件夹
不支持
自定义
递归+读取数据
channel
file channel
基于磁盘,可靠性高,性能低
memory channel
基于内存,可靠性低,性能高
kafka channel
数据存储在kafka里面,磁盘,可靠性高
优于memory,直接进入kafka
下一级kafka选择memory
下一级不是 可靠选file、性能选memory
hdfs sink
小文件
大小128m、时间1-2小时,event格式禁止0
拦截器
etl拦截器
提前过滤
时间戳拦截器
获取日志里面的数据时间,根据这个时间创建hdsf目录
自定义拦截器
定义类实现interceptor接口,重写里面4个方法初始化、关闭、单event、多event,builder
可以不用,到下一步再处理
选择器
replicating 默认
把数据发往下一级所有通道
muliplexing
把数据选择性发往指定通道
监控器
监控put/take事务尝试提交的次数远远的大于最终提交成功的次数说明flume异常。
自身:增加内存
找兄弟:增加服务器
优化
file channel 能配置多目录就配置多目录
三个器
拦截器、选择器、监控器
挂了怎么办
channel
memory
100个
file
100w个
taildir source
不会丢失,可能重复
database
0 条评论
下一页