hadoop(离线数据分析处理)
Spark 实时数据
- 构建Hadoop集群
- HDFS操作与编程
- MapReduce程序设计及优化
- MapReduce高级应用及
- 方便
hadoop的优势: - 弹性-易扩展和卸载
- 健壮-自动恢复和监测
- 简单-编写并行分布式代码
Hadoop Common
为Hadoop其他项目提供一些常用的工具,如配置工具Configuration,远程过程过程调用RPC序列化机制,Hadoop抽象文件系统FileSystem等。
FileSystem可以透明的看到散落在个节点的“文件”(合在一起的)。
MapReduce
(半成品框架)用于并行计算,运行作业
zookeeper
一个分布式服务框架,解决了分布式计算中的一致性问题。
可用于解决分布式应用中遇到的数据管理问题,如统一命名服务、状态同步服务、集群管理、分布式应用配置等
pig
数据流语言和运行环境,用以检索非常庞大的数据集。且运行在HDFS和MapReduce之上。
Hive
数据仓库框架。
Hive管理HDFS中存储的数据,并提供基于SQL表中的操作。
Flume
数据采集,常用作日志采集器
Sqoop
SQL-to-Hadoop的缩写。
Mahout
机器学习和数据挖掘的库,提供聚类、回归测试和统计建模常见算法的MapReduce实现。
集群入口
HDFS
:9870
MapReduce
:8088
Hadoop修改文件:
core-site.xml
mapred-site.xml
yarn-site.xml
hdfs-site.xml
hadoop的三种启动模式
- 独立模式(Local或Standalone Mode)
- 默认情况下,hadoop处于该模式,用于开发和调试
- 伪分布式()
- 运行在同一台机器上
- 全分布式(Full-Distributed)
- 运行在一个集群上
Namenode维护整个文件系统(matedata)
- 文件权限,类型,大小,链接号,文件最后修改时间,文件名
- 文件分块顺寻,文件块存储的从节点计算机的IP,块的编号,UUID,备份因子等
管理两个文件
fsimage:
存储的某个时刻整个文件系统的树状层次结构,从根路径开始
存在形式两种
启动主节点的时候在把fsimage文件加载到内存
在本地也会有fsimage文件对应
edits:
记录用户的行为
e.g.:上传文件的过程中cluster奔溃,再次启动时cluster中的数据将不会完整,再次启动时将会检查edits中的用户行为,将会继续执行
注意:上传文件的时候并不会立刻在fsimage中添加对应文件元信息,edits文件达到阈值的时候edits将会和fsimage文件合并。
保证可靠性的措施
- 冗余条件
- 副本存放
- 心跳检测
sequenceFile 二进制文件
可以类比map集合
- 存储的是二进制文件
- 存储的是数据都是key-value类型,要求key不能重复
- 存储的对象必须序列化
- 序列化使用的是hadoop自己封装的序列化,实现writable
- 内部的数据可以进行压缩
- 存入数据的键值类型读取的时候
sequenceFile中:
- header
- 文件的seq标记,key-value的类型 压缩格式
- record
- 一个record就是一个key-value
- record length = key length+value length
- key length
- key
- value
- 同步标记 读取数据的时候可以跳过多个record 直接从sync标记后开始读取
基于Record的压缩策略,可支持三种压缩的类型
- NONE:
- record length = key length+value length
- key length
- key
- value
- RECORD:值压缩,只对value进行压缩
- record length = key length+value length
- key length
- key
- compressed value
- BLOCK:两个同步标记之间的所有键值进行压缩
- number of records 键值对的组数
- Compressed key length 压缩的键的长度
- compressed keys 压缩的所有的键值
- Compressed values length 压缩的值的长度
- Compressed values 压缩的所有的值
writable
- serializable中
- transient修饰的值 序列化的时候值会恢复默认值
MapReduce
- 数据分块后,块与块之间不可以存在依赖
- TextInputFormat 作为"读取器"
- 一行一行的度
- key作为偏移量
- value作为值
- shuffle(洗牌)
- 分组的过程
- key相同的归为一组,key作为一个,value划在一个组中。
- 中间洗牌,一组结果调用一次reduce
- TextOutputFormat 作为"写出器"
分区
基于hashcode值分区,计算hashcode/reduce个数 并取余=划分的值
SequenceFileOutputFormat
job.setPartitionerClass();
等价于重写了key中的hashcode
job.setPartitionerClass(TotalOrderPartitioner.class);
TotalOrderPartitioner.class和采样器结合使用
采样器:在客户端运行,随机采集进入map的key值,均匀的分成指定的区域范围。范围的个数不是分区的个数,当分区个数小于区域个数,区域合并,分区个数大于区域个数,reduce多于范围个数的reduce空闲。
构建采样器
在客户端执行采样器
获取采样生成的范围文件 _partitioner.lst(sequenceFile个数的数据)
mapper
- chainMapper.addPammer()
链式map任务
- inverseMapper
- regexMapper
- TokenCounterMapper
reducer
- chainreducer:链式reduce任务,可以再交给map进行 二次处理
- IntSumreducer/LongSumReducer。累加求和
采样器构建流程
- 构建采样器
// 构建采样器
InputSampler.RandomSampler<LongWritable, Text> sampler = new InputSampler.RandomSampler<LongWritable, Text>(1, 100, 2);
// 将采样器写到分区文件中
InputSampler.writePartitionFile(job,sampler);
String path = TotalOrderPartitioner.getPartitionFile(conf);
// System.out.println("file:" + path);
// 将采样文件有客户端分发值所有map所在的计算机节点
job.addCacheFile(new URI(path));