Hadoop提供的对其HDFS上的数据的处理方式,有以下几种,

1 批处理,mapreduce

2 实时处理:apache storm, spark streaming , ibm streams

3 交互式: 如pig , spark shell 都可以提供交互式地数据处理

4 sql: hive , impala 提供接口,可以使用sql标准语言进行数据查询分析

5 迭代处理:尤其是机器学习相关的算法,需要对数据反复数据,mapreduce不适应这种计算方式,它总是把它的中间结果输出到磁盘,这样处理起来效率不高,新式的spark很好地支持了这种方式。

6 搜索 :使用solr ,索引存储在hdfs上面的文件,帮助其快速进行文档搜索

HPC(高性能计算)通常是把任务分发到集群计算机上,使用的是SAN(共享存储网络),这对于计算密集型的作业是很有好处的,但是对于IO密集型的就是限制,因为SAN不能提供很好的IO并发。

Hadoop streaming 就是利用类似unix/linux上面的标准输入输出流的思路,适合对文本进行mr的处理,而不用写java程序,可以使用shell,python,ruby等。

它的原理是使用java实现了一个包装用户程序的mr程序,该程序负责调用mapreduce java接口获取key/value对输入,创建一个新的进程启动包装的用户程序,将数据通过管道传递给包装的用户程序处理,然后调用mapreduce java接口将用户程序的输出切分为key/value对输出。

    1 Hadoop Streaming默认只能处理文本数据,无法直接对二进制数据进行处理

2Streaming中的mapper和reducer默认只能向标准输出写数据,不能方便地多路输出

Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如:

采用shell脚本语言中的一些命令作为mapper和reducer(cat作为mapper,wc作为reducer)

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar \
-input myInputDirs \
-output myOutputDir \
-mapper cat \
-reducer wc

HDFS 设计的初衷是

大文件:几百M,GB,PB?

流式数据访问:适合一次写入,多次读的情况

普通商用硬件:不使用高成本 的存储,可以接受普通硬件的损坏

不适用于:

1。低延迟的数据访问 建议使用hbase

2。 大量的小文件

消耗大量的NN内存来存储

例如,一百万个文件(每一个文件一个block) ,将会花费大约300M的内存.一个文件使用150bytes。

问题:如何检查你所在的HDFS集群是否存在大量的小文件?

文件为什么要切分为块?

1。可以容纳文件大小大于单个磁盘的文件

2。块是固定的逻辑大小,简化了存储系统的设计

3。提高了可用性与容错性

根据块进行分布式处理,文件不分块不能提高分布式计算的效率,某一块出现错误时,只需要处理单个块即可,不用处理整个文件。

块为什么分得那么大?

减少因为查找文件而浪费的时间,提高执行效率。(如果一个块太小,譬如在mapreduce处理时,其他操作的开销超过了这个块数据处理本身,存储也是)

HDFS HA 的设计

1。有一个共享存储目录来存储 edit log. 通过QJM 或者NFS

2。Datanodes 要同时发送block mapping 给这两个namenodes, 因为block mapping 没有序列化在磁盘上,是存储在nn的内存中的。

3。客户端需要有机制去处理nn的切换 ,对用户来说是透明的,他在请求文件访问的时候,不关心当前活动的NN

4。Secondnamenode的角色被 standby的nn接手,即定期生成检查点(即合并当前的fsimage与edit log 并上传给active nn)

读文件详解

客户端生成DFS对象通过RPC访问namenode,namenode返回一些file的blocks。细些说,一个file的block会有多个备份,返回哪一个?

Namenode会根据配置的网络拓扑返回排过序的datanodes.第一个最近,一般 读取第一个datanode即可。一个文件可能会有多个blocks,

是分批发送给客户端的,读完一批后,再返回下一批。按顺序读取blocks.

当前的设计时,客户端在namenode的指导下,根据返回的最近的datanode,然后客户端直接与datanode建立连接,读取数据。

写文件详解

1。客户端通过RPC向nn发送创建文件的请求

2。NN检查文件是否存在并检查用户写权限

3。如果通过检查,创建文件,并返回给客户端FSDataOutputStream对象,供客户端 写数据

4。 datastreamer来向nn请求block ,然后被分配block的datanodes形成pipeline来写数据

5。如果在传送数据的过程中,pipe line中有datanode失败,会发生什么情况?

当前的pipeline关闭,出问题的datanode会被从pipelie中移除,然后下次启动的时候上次写的block会被删除。

剩余的dataodes组成一个新的pipeline,把剩余的数据传送完闭,这个文件被标识为没有满足副本要求,会在后面进行同步。

多个dataodes失败的情况下,只要满足最低的dfs.namenode.replication.min副本(默认是1),就算文件写入成功。

然后会异步复制以满足副本的要求。

一致性模型

即读写文件时文件系统中文件的可见性。

我们往HDFS写入一个文件的时候,我们可以在文件系统中看到这个文件,但是一开始,文件是长度是0。

其中的内容是不可见的,至致其中第一个block写入完毕。

一个正在写入的block是不可见的。

如果不调用hsync命令,数据还是存储在datanode的内存里面,这是需要注意的一点。