zoukankan      html  css  js  c++  java
  • Hadoop实战笔记

    一、基础知识(里面的内容包含大部分的Hadoop的内容,耐心的看完,肯定有收获,如有不同可留言或者上某度)

    1、Hadoop生态系统介绍

    (1)HBase

    Nosql 数据库,key-value存储

    最大化利用内存

    (2)HDFS

    简介:Hadoop distribute file system 分布式文件系统

      最大化利用磁盘

    HDFS的设计原则:

    文件以块(block)方式存储,默认块(64M)(如果一个文件没有64M,仍然占用一个block,但是物理内存可能没有没有64M)也可以自定义

    通过副本机提高可靠度和读取吞吐量

    每个区块至少分到三台DataNode上

    单一master(NameNode)来协调存储元数据(metadata)单点故障? 一般是standby nameNode 或者采用NFS服务避免单点故障

    客户端对文件没有缓存机制(No data caching)

    NameNode主要功能提供名称查询服务,它是一个jetty服务器

    NameNode保存metadata信息包括

    (I)文件owership 和Permissions

    (II)文件包含哪些块

    (III)Block保存在哪个DataNode(由DataNode启动时上报)

    NameNode的metadata信息在启动后会加载到内存

    metadata存储在磁盘文件名为"fsimage" 和Block 的位置信息不会保存到fsimage中(hdfs/namenode/current fsimage)

    DataNode(DN):保存block,启动DataNode线程的时候会向NN(NameNode)汇报block信息

    通过向NN发送心跳保持与其联系(3秒一次),如果NN 10分钟没有收到DN(DataNode)的心跳,则认为其已经lost,则copy其他的block 过来

    Block的副本放置策略:

    一般情况是保存三份:

    第一份副本:放置在上传文件的DN,如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点

    第二份副本:放置在于第一个副本不同的机架的节点上

    第三份副本:放置在和第二份副本同一个机架的另一个节点上(ps:一个NameNode带动4000节点)

    Block大小和副本数由Client端上传文件HDFS时设置,其中副本数可以变更,Block是不可以再上传后变更的

    数据损坏处理(可靠性):

    当DN读取block的时候,它会计算checksum,如果计算后的checksum与block创建时值不一样,说明该block已经损坏的

    Client读取其它DN上的block;NN标记该块已经损坏,然后复制block达到预期设置的文件备份数

    DN在其文件创建后三周验证其checksum

    SecondNameNode(SNN):(企业内很少使用,可以了解原理)(重点是fsimage和edits的机制)

    将本地fsimage导入

    是namenode的冷备份(无法做到自动的切换)

    修改cluster所有的DN的NameNode地址

    修改client端NameNode地址

    or修改SNN IP为原NNIP

    它的工作时帮助NN合并edits log  减少NN启动的时间

    fsimage和edits(面试经常问到的问题):

    当edits文件很大的时候,NameNode在启动的时候需要逐一每条的执行这些edits文件,这就严重影响到了整个HDFS的启动时间,这问题在SecondaryNameNode机制将edits文件合并到fsimage中,使其得到解决,SecondaryNameNode的工作流程(fsimage和edits log):

    1、SNN在一个checkpoint时间点和NameNode进行通信,请求NameNode停止使用edits文件记录相关操作而是暂时将新的writes操作写到新的文件edit.new来

    2、SNN从NN上copy fsimage and edits ,通过HTTP Get的方式从NameNode中将fsimage和edits文件下载回来本地目录中

    3、SNN中合并edits和fsimage,SNN将从NameNode中下载回来的fsimage加载到内存中,然后逐条执行edits文件中的各个操作项,使得加载到内存中的fsimage中包含edites中的操作,这个过程就是所谓的合并了。

    4、在SNN中合并完fsimage和edites文件后,需要将新的fsimage回传到NameNode上,这个是通过HTTP Post方式进行的

    5、NameNode将从SNN接受到的新的fsimage替换掉旧的fsimage,了,同时edites.new文件转换了通常的edites文件,这样edites文件的大小就得到了减少,SNN整个合并以及和NameNode

    安全模式:

    NameNode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作

    一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件,这个操作不需要secondaryNameNode和一个空的编辑日志

    NameNode开始监听RPC和Http请求

    此刻namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的

    系统中数据块位置并不是有namenode维护的,而是以块列表形式存储在datanode中

    查看namenode处于哪个状态

    Hadoop dfsadmin -safemode get

    进入到安全模式(Hadoop)启动的时候是在安全模式

    hadoop dfsadmin -safemode enter

    退出安全模式;

    hadoop dfsadmin -safemode leave

    HDFS的读写过程(Hadoop 学习的精髓部分,编程开发必备前提知识,没有理由,必须学好^_^!):

    (1)客户端(client)用FileSystem的open()函数打开文件

    (2)DisbutedFileSystem用RPC调用元数据节点,得到文件的数据块信息

    (3)对于每一个数据块,元数据节点返回保存数据块的数据节点的地址

    (4)DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据

    (5)客户端调用Stream的read()函数开始读取数据

    (6)DFSInputStream 连接保存此文件第一个数据块的最近的数据节点

    (7)Data从数据节点读取到客户端(client)

    (8)当此数据块读取完毕时,DFSInputStream关闭和此数据节点的链接,然后连接此文件下一个数据最近的节点

    (9)当客户端读取完毕数据的时候,调用FSDataInputStream的close函数

    (10)在读取数据的过程中,如果客户端在于数据节点通信出现错误,则尝试连接包含此数据库的下一个数据节点

    失败的数据节点将被记录,以后不再连接

    写文件的过程:

    (1)客户端调用creat()来创建文件

    (2)DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件

    (3)元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件

    (4)DistributedFileSystem返回DFSOutStream,客户端用于写数据

    (5)客户端开始写入数据,DFSOutStream 将数据分成块,写入data queue

    (6)Data Stream 将数据块写入pipeline中的第一个数据节点,第一个数据节点将数据块发送给第二个数据节点,第二个数据节点将数据发送给第三个数据节点

    (7)DFSOutStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入

    如果数据节点在写入的过程中失败:

    关闭pipeline,将ack queue中的数据块放入data queue的开始

    当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块已经过时

    ,会被删除

    失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点

    元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份

    当客户端结束写入数据,则调用stream的close函数,此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。

    HDFS开发常用的命令(类shell语言):

    创建一个文件夹:

    Hadoop fs -mkdir 文件夹

    eg:Hadoop fs -mkdir /usr/hadoop/myfile

    (文件夹)

    上传一个文件:

    Hadoop fs -put 文件 Hadoop的文件夹

    eg:Hadoop fs -put /wordcount.jar /usr/hadoop/myfile

    删除文件

    Hadoop fs -rm 文件

    查看一个文件夹里面有哪些内容文件?

    Hadoop fs -ls 文件

    查看文件的内容

    Hadoop fs -text/ 文件

    Hadoop管理员常用命令:

    Hadoop job -list 列出正在运行的job

    hadoop job -kill<job_id> kill job

    Hadoop fsck 检查HDFS块状态,是否损坏

    Hadoop dfsadmin -report 检查HDFS块状态,包括DN信息

    Hadoop distcp hsfs:/// hdfs:// 并行拷贝

    (3)MapReduce

    (1)编程模型,主要用来做数据的分析

    (2)最大化利用CPU

  • 相关阅读:
    JDK的几种分析工具
    心理价值
    通过Proxool辅助数据库优化
    人生缄言
    grep 用法
    多服务器快速定位
    RandomAccessFile读取远程系统日志
    20101116 视频处理几个常用指令
    Flickr架构
    JAVA正则表达式语法
  • 原文地址:https://www.cnblogs.com/coolitzhm/p/4678370.html
Copyright © 2011-2022 走看看