hadoop知识点总结

来源:互联网 发布:学ue4编程多重要 编辑:程序博客网 时间:2024/04/29 14:29

hadoop是一个由Apache基金会所开发的分布式系统基础架构。
hadoop的框架中最核心设计就是:HDFS和MapReduce,HDFS提供了海量数据的存储,MapReduce提供了对数据的计算。
1.什么是序列化:
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
把对象转换为字节序列的过程称为对象的序列化
把字节序列恢复为对象的过程称为对象的反序列化
(说的再直接点,序列化的目的就是为了跨进程传递格式化数据。)
2.hadoop的序列化:
参考文档:hadoop深入研究:(十)——序列化与Writable接口
hadoop自身的序列化存储格式就是实现了Writable接口的类,而Writable接口定义了两个方法:
(1)将数据写入到二进制流中,Write();
(2)从二进制数据流中读取数据,ReadFields()。
Writable的实现:
Writable类
3.hadoop的压缩:
参考文档:从零开始学习Hadoop–第5章 压缩
对hadoop来说,有两个地方需要用到压缩:其一,在HDFS上存储数据文件,压缩之后数据体积更小,有利存储;其二,集群间的通讯需要压缩数据,这样可以提高网络带宽的利用率。
4.MapReduce的输入输出:
参考文档:从零开始学习Hadoop–第6章 MapReduce的输入输出
将数据从HDFS传到Mapper是由InputFormat类实现的,将数据从Reducer存储到HDFS是由OutputFormat类实现的。
(1) InputFormat类
InputFormat类是一个抽象类,它定义了两个抽象函数。这两个抽象函数是:

abstract  List<InputSplit>  getSplits(JobContext context) ;

(函数getSplits的功能,是将输入的HDFS文件切分成若干个spit。在Hadoop集群里的每个节点做MapReduce时候处理的时候,每次只处理一个split,所以split是MapReduce处理的最小单元。)

abstract  RecordReader<K,V> createRecordReader(InputSplit split, TaskAttemptContext context) ;

(函数createRecordReader的功能,是创建 RecordReader对象,这个RecordReader对象根据split的内容,将split解析成若干个键值对。在做MapReduce的时候,Mappper会不断地调用RecordReader的功能,从RecordReader里读取键值对,然后用map函数进行处理。)
InputFormat类有3个继承类:
1)DBInputFormat类,(处理从数据库输入);
2)DelegatingInputFormat类,(用在多个输入处理);
3)FileInputFormat类,(处理基于文件的输入)。
以FileInputFormat类为例,它有5个继承类,包括CombineFileInputFormat类, KeyValueTextInputFormat类,NLineInputFormat类,SequenceFileInputFormat类和TextInputFormat类。
(2)OutputFormat类
OutputFormat类将键值对写入存储结构。一般来说,Mapper类和Reducer类都会用到OutputFormat类。Mapper类用它存储中间结果,Reducer类用它存储最终结果。
它是一个抽象类,声明了3个抽象函数:

public abstract RecordWriter<K, V>      getRecordWriter(TaskAttemptContext context);

(最主要的函数是getRecordWriter返回RecordWriter,它负责将键值对写入存储部件)

public abstract void checkOutputSpecs(JobContext context);

(函数 checkOutputSpecs检查输出参数是否合理,一般是检查输出目录是否存在,如果已经存在就报错)

public abstract OutputCommitter getOutputCommitter(TaskAttemptContext context);

(函数 getOutputCommitter获取 OutputCommitter, OutputCommitter类是负责做杂活的,诸如初始化临时文件,作业完成后清理临时目录临时文件,处理作业的临时目录临时文件等等)
OutputFormat类4个继承类:
1)DBOutputFormat,(将键值对写入到数据库);
2)FileOutputFormat,(将键值对写到文件系统);
3)FilterOutputFormat,(提供一种将OutputFormat进行再次封装,类似Java的流的Filter方式);
4)NullOutputFormat,(将键值对写入/dev/null,相当于舍弃这些值)。
以FileOutputFormat为例,它是一个抽象类。它有两个继承类,SequenceFileOutputFormat和TextOutputFormat。SequenceFileOutputFormat将键值对写入HDFS的顺序文件。TextOutputFormat将数据写入HDFS的文本文件。
5.远程过程调用RPC:
Hadoop的最重要的技术组成是远程过程调用RPC(Remote Procedure Call)。
如果本地主机的一个进程,想调用远程主机上的一个进程的某个功能,它应该怎么做呢?
a)远程主机运行服务器端,本地主机运行客户端,通常情况下,远程主机的服务端是一直在运行的。
b)本地主机的客户端通过网络连接到远程主机的指定端口,然后,将要调用的函数名和调用参数通过网络传给远程主机的服务端。
c)远程主机接收到了函数名和调用参数的时候,它根据函数名找到这个函数,然后根据调用参数执行这个函数,然后把结果通过网络返回到本地主机的客户端。
这里的服务端和客户端的通信方式,可以是常规的B/S模式,也可以是NIO的B/S模式。

0 0