zookeeper节点类型
Znode有两种, 分别为临时节点和永久节点
节点的类型在创建时即被确定, 并且不能改变
1) 临时节点: 该节点的生命周期依赖于创建他们的会话. 一旦会话结束, 临时节点将被自动删除, 当然也可以手动删除. 临时节点不允许拥有子节点.
2) 永久节点: 该节点的生命周期不依赖于会话, 并且只有在客户端显示执行删除操作的时候, 他们才能被删除.
Znode还有一个序列化的特性, 如果创建的时候指定的话, 该Znode的名字后面会自动追加一个不断增加的序列号. 序列号对于此节点的父节点来说是唯一的, 这样便会记录每个子节点创建的先后顺序. 他的格式为"%10d" .
这样便会存在四种类型的Znode节点, 分别对应:
1) 永久非序列化节点
2) 临时非序列化节点
3) 永久序列化节点
4) 临时序列化节点
NameNode
SecondaryNameNode
hdfs优化、面试:小文件存储问题?
小文件吃NN内存 文件再小也需要一条元数据记录。
解决:合并
上传之前 本地合并----java python程序合并
上传之中 appendtofile追加上传
上传之后 archive归档 再使用程序合并
MapReduce---分布式计算框架 解决海量数据计算问题。
-
思想:先分再合、分而治之。
1、大的拆分成若干个小的 并行处理各个小的 -----map阶段
2、将上一步的结果全局汇总合并----reduce阶段
限制条件:
能不能分?
分为之后有没有依赖?
mr思想效率:拆分并行处理上 如果不能并行处理 也没必要mr
MapReduce执行流程
-
mapper|map阶段-------程序maptask
-
1、如何分?启动几个maptask? ---逻辑切片 逻辑规划机制
split size ==block size==128M
1个split启动1个maptask
2、maptask读数据
TextInputFormat 一行一行读 按行读取数据 返回kv键值对
3、读取数据进行map阶段业务逻辑处理
4、对输出的结果进行partition分区的计算(哈希取模法)
key.hashcode % reducetask个数 ==余数 ==分区标号
5、写入缓冲区
100M 0.8触发溢写
6、spill溢出 溢写
把缓冲区的数据写入磁盘临时文件中 写的时候排序:默认key字典序 a-z
7、merge 合并
再次排序 key的字典序
reducer|reduce阶段-----程序reducectask
1、启动几个reducetask? ---默认只有1个
2、copy 拉取数据 放入内存缓冲区
从maptask拉取属于自己处理的数据
3、merge合并 排序sort 默认key字典序 a-z
4、分组
key一样的分为一组
5、一组数据处理一次 进行reduce阶段业务逻辑处理
6、输出结果
TextOutPutFormat
MapReduce的shuffle机制
-
shuffle描述了数据从无序到有序的一个过程。
-
shuffle指的是MapReduce当中一个过程,一个阶段。
-
从map处理完业务逻辑开始
-
到reduce准备处理业务逻辑之前
-
-
shuffle是一个横跨MapReduce两个阶段的一个过程。
-
map阶段shuffle
-
partition分区
-
collect 收集到缓冲区
-
spill溢写到磁盘
-
merge合并
-
sort排序
-
Combiner 归并(该组件默认不存在)
-
-
reduce阶段shuffle
-
copy拉取数据
-
merge合并
-
sort 排序
-
grouping 分组
-
-
-
ResourceManager RM
-
资源申请分配的入口 仲裁者 调度的管理
-
-
NodeManager NM
-
负责每台机器的资源管理
-
通过响应RM的命令 启动回收资源容器container
-
-
ApplicationMaster AM
-
每个程序内部的老大 负责程序内部的资源申请 执行监督 管理
-
向RM汇报程序的执行情况 资源申请
-
mr程序提交yarn运行交互流程
-
client提交程序-------->RM------->申请资源运行本次程序AM
-
AM---->向RM注册 保持通信
-
AM根据切片数量-------->RM申请资源----->maptask ----->队列排队
-
AM---->NM 配合启动容器 运行maptask 监督执行情况
-
AM----->RM申请资源 reducetask 监督执行情况
-
所有task运行完毕 AM----->RM 汇报执行情况 回收资源
-
把自己给注销掉
内部表和外部表的区别
EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(Location),Hive创建内部表时,会将数据移动到数据仓库指定的路径下;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删出数据。
优化表
-
分区表 partitioned table
-
分区裁剪 减少全表扫描
-
静态分区 动态分区插入
-
分区字段值是如何决定的?
-
用户sql中写死的 ------>静态分区
-
通过查询结果决定的---->动态分区
-
-
-
常见的分区字段
-
时间: 年月日(day dayinfo daysrt dt dt_date)
-
地域: 省市县
-
类别: 学科、产品
-
-
-
分桶表 Bucketed Table
-
join优化 提高join效率
-
减少笛卡尔积
-
使用map端join
-
-
高阶函数应用及案例
-
explode UDTF函数 输入一行输出多行
-
lateral view 侧视图
-
行列转换问题
-
多行转单列 collect_set 收集
-
单列转多行 explode +侧视图
-
-
json处理问题
-
内置json函数
-
jsonSerDe序列化类
-
-
url解析问题
-
parse_url_tuple
-
-
开窗函数的应用
-
累加求和问题
-
sum + row between 注意range between数字区间
-
-
分组topN问题
-
row_number和它的兄弟们函数 去重
-
-
连续登陆访问问题
-
lead lag函数
-
-
几分之几的问题
-
ntile函数
-
-
通用调优
-
数据文件格式 压缩问题
-
列式存储 压缩的优缺点 ORC+snappy ORC的两种索引
-
-
数据倾斜调优
-
数据倾斜是什么意思? 分布式程序中 数据分配不平均
-
数据倾斜造成原因?
-
数据本身问题
-
分的规则
-
受业务影响 数据短期剧烈波动问题
-
-
数据倾斜后果
-
数据倾斜通用调优
-
分步执行 将倾斜的数据拆散 分别处理 最终再合并
-
-
hive中哪些地方会数据倾斜呢?解决方案
-
group by 、count(distinct )
-
map预聚合 map.agg
-
倾斜时负载均衡 skewindata
-
自己手动将倾斜的数据拼接随机字符串 打散
-
-
join
-
不走reduce端join 就不会倾斜 如何才能不走reduce端join
-
join之前先过滤 所谓小表
-
bucket map join SMB
-
skew join
-
-
-
-
join的调优
-
hive join语句底层MapReduce是如何执行的?
-
map端join---效率最高的
-
reduce端join
-
优化的方向 如何让它走map端join
-
join之前先过滤 所谓小表
-
bucket map join SMB
-
-
-
-
task个数调整
-
maptask 直接去hdfs调整文件 小文件合并 大文件提高block size
-
reducetask 不设置 hive自己编译推算 用户可以自己设置 设置不一定生效 order by
-
-
其他
-
执行计划 explain
-
并行机制
-
推测执行机制
-
严格模式
-
fetch本地抓取
-
mr本地模式
-