zoukankan      html  css  js  c++  java
  • HADOOP HDFS的设计

    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的内存里面,这是需要注意的一点。

  • 相关阅读:
    洛谷P2770 航空路线问题 最小费用流
    洛谷P2766 最长不下降子序列问题 网络流_DP
    洛谷P2763 试题库问题 最大流
    洛谷P2756 飞行员配对方案问题 网络流_二分图
    洛谷P2045 方格取数加强版 最小费用流
    洛谷P1231 教辅的组成 网络流
    LA3231 Fair Share 二分_网络流
    [CTSC1999]家园 分层图网络流_并查集
    力扣题目汇总(丑数,重复N的元素,求众数)
    力扣题目汇总(最长连续递增序列,旋转图像(中等),宝石与石头)
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/5207747.html
Copyright © 2011-2022 走看看