1.hdfs:
靠谱:有备份写入hdfs系统时,生成一个校验和,传输数据时再生成一个校验和,传输完成时又生成一个校验和。对比上传前后校验和。
每个datanote运行一个守护线程datablockscanner数据块扫描器。
2.namenode刚启动工作过程:
进入安全模式,加载fsimage和edit日志(镜像和编辑日志)。如果满足最小副本条件(99.9%的块存在一个副本,默认值是1)
datanode节点向namenode注册,namenode会生成一个dataNode集合。datanode不断向namenode发送心跳,
相邻的两个心跳间隔大于namenode设定的间隔时,则默认断链。datanode在发送心跳时也可以包含其他的信息,
TaskTracker定期向JobTracker发送心跳,除了保持活动以外,还会报告TaskTracker当前可以执行的Map和Reduce的剩余配额(还剩下多少数据待处理)。
Hadoop优先追求Map的Data-local,也就是输入数据存放在本地。如果不能满足,则退而求其次,追求Rack-local,也就是输入数据存放在同一机架的其他机器上,
这样的话网络开销对性能影响一般不会太大
3.MR运行原理:job配置+job执行
1.与spark类似,spark会创建新的RDD,然后交由master分配executor。job会根据配置(读取文件路径,mapper输入KEY、Value类型等)先计算出分片等生成临时文件,存放
到hdfs上,资源管理器根据生成的分片等信息分配datanote
2.如果处理的文件小时,启动map和reduce线程占用作业的时间比就会很大,增大了资源管理器的开销。
3.mapper输出的结果会写到磁盘里面,spark优先是对着内存进行操作的
4.MR执行过程:
split -> map -> spill -> partition ->shuffle(排序、分组) -> [combiner] -> reduce
map reduce作业初始化的时间是比较长的
在map根据默认key的hash值往分区写key-value时,shuffle可以并行执行key排序及分组,都是在磁盘上做的操作
全排序(采样器),二次排序-组合key(客户文件和订单文件,同一个客户下的订单放到同一个分区里).重写分区类,使同一个key分到同一个分区内,这样在reduce里就不用聚合用一个key的values值,节省reduce时间。
InputFormat(定义数据源)->RecordReader -> map -> shuffle[排序、分组、聚合] -> reduce ->OutputFormat
5.切片法则:
在切片最大值、切片最小值、blocksize中选择一个max(splitMinx,min(blocksize, splitMax))。确定好切片大小之后,根据文件总大小,除于切片大小,得出分片数量
6.当job启动的mapper数量太多
而超出了系统限制时,就会导致Hadoop抛出异常。该场景有:
1.输入文件size巨大,切片不是很大,导致有很多的分区
2.输入文件数量巨大,但都是小文件。MR默认一个文件对应一个map作业。
7.分片:
使用fileSplit进行InputFormat文件划分,有文件存放位置Path file,有起始文件既偏移量,分片长度既大小,所属服务器集合。
可能一个分片包含了多个block(例如combineFileInputFormat)。继承InputFormat,里面有个划分片的接口.
8.分布式缓存:
如果一方数据集文件量小时,可以直接加载到内存中。比如客户文件和订单文件。客户文件较小,就可以直接放到内存中。
//将hdfs上的文件加入分布式缓存
job.addCacheFile(new URI("hdfs://url:port/filename#symlink"));
之后在map/reduce函数中可以通过context来访问到缓存的文件,一般是重写setup方法来进行初始化
protected void setup(Context context) throws IOException, InterruptedException {
super.setup(context);
if (context.getCacheFiles() != null && context.getCacheFiles().length > 0) {
String path = context.getLocalCacheFiles()[0].getName();
File itermOccurrenceMatrix = new File(path);
FileReader fileReader = new FileReader(itermOccurrenceMatrix);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String s;
while ((s = bufferedReader.readLine()) != null) {
//TODO:读取每行内容进行相关的操作
}
bufferedReader.close();
fileReader.close();
}
}
9.chainMapper链条Mapper
在job配置中,连续两次job.addMapper即可。
11.hadoop模块
Common hdfs mapreduce yarn
12.部署模式
独立/本地模式:解压缩包就是了
伪分布式:在一台服务器做了配置
完全分布式:在多台服务器上做了配置
13.hadoop优化:
1.分布式缓存
2.防止启动过多的mapper线程和reduce线程(包含数据量过大或小文件过多两种情况)。因为他们初始化时间太长,增加系统开销。
3.防止数据倾斜,合理进行分区,避免出现一台数据节点忙死,一台数据节点闲死。
hadoop优化这一块写的不是太详细,后续会跟hive结合起来做一次优化记录