概述
0. Hadoop
开源的分布式系统基础架构
优点
- 对大量数据进行分布式处理
- 可靠, 假设硬件失效为常态, 针对失败节点进行重新分布处理
- 高效, 并行处理提高处理速度
- 可伸缩, 在横向扩展至上千个节点, 可处理PB级数据
- 低成本, 项目开源,与同类产品比较成本低廉
相关组件包括
- HDFS
- MapReduce
- Yarn
- Hive
- HBase
- ZooKeeper
- Sqoop
- Flume
1. Hadoop性能优化
影响性能的主要因素
- 数据倾斜,如reduce端接收的某个key包含多个值,另一个key则很少值
- job数量多,数据表的关联过多
- 求和,计数操作不存在数据倾斜的可能
- count(distinct)无法处理大量数据
优化的方向
- 数据模型
- 避免数据倾斜,如自定义对key分组,需要对数据深入理解
- 减少job数量
- 设定合理的task数
- hive中提供了自动优化解决数据倾斜,但该方法可能导致业务出错,
set hive.groupby.skewindata=true;
- 拒绝使用count(distinct)
- 小文件合并处理,map端建立缓存
优化的手段,调整reducers数量
hive.exec.reducers.bytes.per.reducer
默认1G, 依据输入文件的总大小为一个job分配多少个reducerhive.exec.reducers.max
默认999, 程序允许的reducers最大数量,只有当 input / bytes per reduce > max 才会触发mapred.reduce.tasks
默认-1, 完全自定义reducer的数量,否则由程序自动分配
reducers的影响
- 太少
数据量大时运行缓慢,甚至溢出 - 太多
小文件过多时,合并成本高,namenode存储压力大
1. HDFS
Hadoop Distributed File System 分布式文件系统
优点
- 高可用, 快速自动恢复发生错误的节点, 保证数据拷贝设定的副本数量
- 高吞吐, 流式访问数据集,批处理而非交互, 延迟高
- 数据块存储, 默认128M/块,可修改
- 数据一致性, 一写多读,可追加不可修改
- 移动计算比移动数据划算, 将计算任务移动至最近的数据
- 通过namenode统一管理,维护目录树和文件的块id和datanode节点地址
- 支持元数据快照, 将失效集群回滚到之前的时间点
- 提供web接口, 统一从根目录出发
工作原理
- 客户端与namenode通信获取可写入的datanode地址
- 客户端按块传递给相应datanode
- 完成第一个节点写入后,datanode负责向其他节点拷贝副本
- 客户端发送读取文件路径给namenode
- namenode返回文件元数据给客户端
- 客户端根据元数据找到相应datanode按块读取合并整个文件
- secondary namenode定期完成namenode的备份,用于恢复元数据
- datanode负责存储数据,定期发送心跳给namenode判断是否正常工作,错误则由namenode重新分配新的节点并进行数据拷贝
2. Yarn
- Yet Another Resource Negotiator 另一个资源协调器
- 通用资源管理系统, 为上层应用提供统一的资源管理和调度
- 将JobTracker和TaskTracker分离, 由ResourceManager管理全局资源,NodeManager管理各个节点, 应用是ApplicationMaster表示,一个应用拥有多个容器在节点管理器上运行
3. MapReduce
- 用于大规模数据集并行运算的编程模型
- map端, 根据InputFormat分割文件为多个splits,一个split作为一个输入, 每个map task存在一个环形内存缓冲区, 中间结果写入缓冲区至阈值后启动一个线程将溢出数据写入磁盘. 对key进行快排, 多个溢写文件最后会合并为一个文件,等待下一步处理
- reduce端, 等待map端全部任务完成, 形成多个文件, 默认按key的哈希值分配reduce task, 对Key进行归并排序, reduce端处理后,将输出写入HDFS
4. Hive
- 数据仓库工具
- 将结构化数据映射为一张数据库表,常用MySQL存储
- 提供类sql语句查询功能,在驱动中可进行类sql语句向mapreduce作业的翻译,优化和执行
- 学习成本低,适合进行数据的统计分析
- 实际数据存储在HDFS上,mysql中存储一张映射表用于实现查询功能
- mapreduce的主要缺点有底层依赖java编程,功能不灵活,操作不清晰,代码多维护难,排序连接操作极其繁琐低效,专注于编程而非功能
- Hiveql语句支持大量函数,可通过.hql脚本编程运行
5. HBase
- 基于HDFS存储的分布式面向列的开源数据库
- 随机存取, 支持低延迟单条记录的访问而非HDFS的批处理模式
- 适合于非结构化数据存储, 基于列而非基于行
- 一写多读,自动扩展,自动分割过量数据
- 表是行的集合,行是列族的集合,列族是列的集合,列是键值对的集合
- 由zookeeper负责协调分布式系统成员间的状态信息共享
- 主节点由HMaster管理,负责region分配和数据库创建删除操作,监听zookeeper对备份节点的状态通知
- 从节点由Region Server管理, 负责读写, 可管理1000个region
- 定期向zookeeper发送心跳信息判断节点是否存活
- 客户端首次通过zookeeper获取meta table地址获取region server地址获取目标row key所在region的region server地址,缓存操作信息,建立通讯,实现读写
- 客户端与目标region server建立通讯后发送put请求,顺序写入预写式日志WAL,存入memstore写缓存,写入Hfiles文件,通过block cache读缓存实现读取
6. ZooKeeper
- 分布式开源的应用程序协调服务
- 封装复杂易出错的关键服务,提供简单易用的接口和高效稳定的系统给用户
- 客户端与服务器建立会话,按先进先出顺序执行请求
- 选举机制,自动选举出的leader具有最高执行id权限,避免死锁出现
- 提供明明服务,配置管理,集群管理,锁定或同步服务,数据注册功能
- 支持序列化,默认znodes节点为永久存活
7. Sqoop
- 用于hadoop与mysql间的数据传递的ETL工具
- 实现关系型数据库中的数据与hdfs中的数据交互
8. Flume
- 支持分布式海量日志采集,聚合和传输的日志收集系统
- 支持定制各类数据的发送方,提供简单的数据处理
- 支持多种接收方如HDFS,HBae等
- 收集速度超过写入速度时,自动调整协调读写平衡
- 基于事务,保证一致性
- 可靠,易用,可定制,高容错
最后
以上就是开朗月亮为你收集整理的Hadoop总结的全部内容,希望文章能够帮你解决Hadoop总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复