一、集群启动/停止方式
1)各个模块分开启动/停止(配置ssh是前提)
(1)整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh/stop-yarn.sh
2)各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
二、HDFS的shell操作
1.基本语法
hadoop fs 具体命令 或者 hdfs dfs 具体命令
2.上传
(1)-moveFromLocal:从本地剪切粘贴到HDFS
(2)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
(3)-put:等同于copyFromLocal,生产环境更习惯用put
(4)-appendToFile:追加一个文件到已经存在的文件末尾
3.下载
(1)-copyToLocal:从HDFS拷贝到本地
(2)-get:等同于copyToLocal,生产环境更习惯用get
4.HDFS直接操作
1)-ls: 显示目录信息
2)-cat:显示文件内容
3)-chgrp、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
4)-mkdir:创建路径
5)-cp:从HDFS的一个路径拷贝到HDFS的另一个路径
6)-mv:在HDFS目录中移动文件
7)-tail:显示一个文件的末尾1kb的数据
8)-rm:删除文件或文件夹
9)-rm -r:递归删除目录及目录里面内容
10)-du:统计文件夹的大小信息
11)-setrep:设置HDFS中文件的副本数量
三、HDFS_API
1.1测试:创建文件夹、文件上传、下载、删除、文件的更名和移动
1.2获取文件详细信息
1.3文件和文件夹的判断
2.参数优先级
(1)在项目资源目录下的配置文件
以设置文件副本数量为例
(2)在代码里面配置
四、HDFS的读写流程
1.1HDFS写数据流程
1.2网络拓扑-节点距离计算
节点距离:两个节点到达最近的共同祖先的距离之和。
2.HDFS读数据流程
3.NN与2NN工作机制
4. DataNode工作机制
五、MapReduce
1.mapreduce进程:
一个完整的MapReduce程序在分布式运行时有三类实例进程:
(1)MrAppMaster:负责整个程序的过程调度及状态协调。
(2)MapTask:负责Map阶段的整个数据处理流程。
(3)ReduceTask:负责Reduce阶段的整个数据处理流程。
2.常用数据序列化类型
3.MapReduce编程规范:
用户编写的程序分成三个部分:Mapper、Reducer和Driver。
4.WordCount 案例:
(1)Driver类
(2)Mapper类
(3)Reducer类
5.Writable序列化 :
以自定义bean对象实现序列化接口为例
具体实现bean对象序列化步骤如下7步。
(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
(3)重写序列化方法(write())
(4)重写反序列化方法(readFields())
(5)注意反序列化的顺序与序列化的顺序完全一致
(6)要想把结果显示在文件中,需要重写toString(),可用"\t"分开,方便后续用。
(7)如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框中的Shuffle过程要求对key必须能排序。bean对象做为key传输,需要实现WritableComparable接口重写compareTo方法,就可以实现排序。
6.MapTask并行度决定机制
数据块:Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位。
数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。
7.FileInputFormat
(1)FileInputFormat切片机制
a.简单地按照文件的内容长度进行切片
b.切片大小,默认等于Block大小
c.切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
(2)FileInputFormat实现类
FileInputFormat常见的接口实现类包括:TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat和自定义InputFormat等。
(3)TextInputFormat
TextInputFormat是默认的FileInputFormat实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable类型。值是这行的内容,不包括任何行终止符(换行符和回车符),Text类型。
(4)CombineTextInputFormat:用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。
a.虚拟存储切片最大值设置
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m
注意:虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。
b.切片机制
生成切片过程包括:虚拟存储过程和切片过程二部分。
虚拟存储过程:将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。
切片过程:判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
c.使用
8.MapReduce工作机制
9.shuffle机制:
Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle。
(1)MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中
(2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
(3)多个溢出文件会被合并成大的溢出文件
(4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
(5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
(6)ReduceTask会抓取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
(7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)
10.partition分区
(1)自定义Partition步骤
a.自定义类继承Partitioner,重写getPartition()方法
b.在Job驱动中,设置自定义Partitioner
job.setPartitionerClass(...);
c.自定义Partition后,要根据自定义Partitioner的逻辑设置相应数量的ReduceTask
job.setNumReduceTasks(...);
(2)分区总结:
a.如果ReduceTask的数量>getPartition的结果数,则会多产生几个空的输出文件part-r-000xx
b.如果1<ReduceTask的数量<getPartition的结果数,则会报错
c.如果ReduceTask数量=1,则不管MapTask端输出多少个分区文件,最终结果都交给一个ReduceTask,最终也只有一个结果文件part-r-00000
d.分区号必须从零开始,逐一累加
11.排序
12.Combiner合并
(1)自定义Combiner实现步骤:
a.自定义一个Combiner继承Reducer,重写Reduce方法
b.在Job驱动类中设置:job.setCOmbinerClass(WordCountCombiner.class)
13.OutputFormat数据输出
(1)自定义OutputFormat步骤
a.自定义一个类继承FileOutputformat
b.改写RecordWriter,具体改写输出数据的方法write()
(2)使用自定义的outputformat:
在Job驱动类中设置:job.setOutputFormatClass(LogOutputFormat.class)
14.MapTask工作机制
15.ReduceTask工作机制