大数据/Hadoop
文章平均质量分 74
莫言静好、
这个作者很懒,什么都没留下…
展开
-
Hadoop之高可用原理
我们首先看一下普通的HA, 由于发生故障时需要依赖于管理员手动切换NameNode,由于管理员不可能随时随地监控集群,所以自动主备切换很有必要。一 HA整体架构HA总共有2个NameNode, ActiveNameNode和StandbyNameNode,2个NameNode互为主备,处于Active状态的是主NameNode,处于Standby状态的是备NameNode,转载 2017-11-24 09:07:51 · 1382 阅读 · 0 评论 -
MapReduce之RecordWriter理解
RecordWriter:其实主要就是负责将task的key/value结果写入内存或者磁盘 一 方法分析1.1 write:写key/value键值对1.2 close: 关闭RecordWriter 二 RecordWriter运行流程分析2.1 Map Task Record Writer运行流程分析#Map Task#runNewMapper会根据是否当前程原创 2017-11-17 09:27:27 · 2214 阅读 · 0 评论 -
MapReduce之OutputFormat理解
一 OutputFormat作用1校验job中指定输出路径是否存在2将结果写入输出文件 二 OutputFormat的实现2.1DBOutputFormat: 发送Reduce结果到SQL表中2.2FileOutputFormat: 将Reduce结果写入文件中2.2.1MapFileOutputFormat: 主要是处理MapFile(特殊的SequenceFile)原创 2017-11-17 09:22:51 · 1084 阅读 · 0 评论 -
MapReduce之join操作
一 前言在很多时候,我们可能需要处理的不是一个单独的文件,而是几个有关联的文件,比如账户信息和订单信息=>账户信息:customerIdname address telephone订单信息:orderIdcustomerId price productName我们很可能就需要用到这2个文件,并且他们的关系通过用户id进行关联或者join. 两个文件的关联点作为key,后面原创 2017-11-17 09:20:50 · 560 阅读 · 0 评论 -
MapReduce之InputFormat理解
一 InputFormat主要作用:#验证job的输入规范#对输入的文件进行切分,形成多个InputSplit文件,每一个InputSplit对应着一个map任务#创建RecordReader,从InputSplit分片中读取数据供map使用 二 有几个比较重要的实现2.1FileInputFormat: 主要用于处理文件的一个InputFormat类,它包括子类:2.原创 2017-11-17 09:18:06 · 2285 阅读 · 0 评论 -
MapReduce之combiner的理解
一 Combiner组件意义有一个文件,总共620M, 有5个数据块,每一个数据块有三个副本,比如如上图所示,有5台机器,那这文件的数据块分布如图示:按照InputSplit,那有可能就是5个map任务,而且这5个Map任务很有可能2个或者3个分配同一台机机器运行,这取决于YARN中ContainerAllocator如何分配资源的问题,所以这一台机器可能需要溢写溢写数据到原创 2017-11-17 09:15:52 · 793 阅读 · 0 评论 -
MapReduce之collect过程分析
我们知道map任务在处理完一个key/value之后,就会进行collect操作:分区,排序,溢写等操作,这些操作都属于collect操作。 我们在map方法中,处理完一对key:value,就会调用write方法,本质上就是调用MapTask初始化的NewOutputCollector的write方法, 进而调用collect方法,开始collect流程 一 计算key落在哪一个转载 2017-11-17 09:11:08 · 888 阅读 · 0 评论 -
MapReduce 之shuffle过程
我们知道在MapReduce程序在map阶段和reduce阶段之间,会进行shuffle操作。那么我们来详细分析一下shuffle的过程或者原理在MapTask调用Mapper#map方法之前,会构造一个RecordWriter对象,如果Job没有reduce操作,那么new一个NewDirectOutputCollector如果包含Reduce操作,就new一个NewOutp原创 2017-11-17 09:06:34 · 737 阅读 · 0 评论 -
DataNode之BlockSender分析
一 BlockSender发送数据的格式详解BlockSender主要负责从DataNode的磁盘读取数据块,然后发送数据块到接收方。需要注意的是,BlockSender发送的数据是以一定的结构组织的。BlockSender发送的数据格式包括两部分:校验信息头(ChecksumHeader)和数据包序列(packets)1.1 ChecksumHeader用于描述当原创 2017-11-22 09:13:33 · 2276 阅读 · 0 评论 -
hadoop之BlockPoolManager源码分析
在HDFS Federation架构中, 一个HDFS集群可以创建多个命名空间,每一个DataNode都可以存储多个BlockPool的的数据块,所以在DataNode定义了一个BlockPoolManager用于管理DataNode上所有的块池。DataNode 其他模块要对BlockPool操作必须通过BlockPool Manager来执行,每一个DataNode都有一个BlockM原创 2017-11-22 09:11:09 · 1804 阅读 · 0 评论 -
HDFS读写流程
一 HDFS 客户端读文件流程1打开HDFS文件: HDFS客户端首先调用DistributedFileSystem.open方法打开HDFS文件,底层会调用ClientProtocal.open方法,返回一个用于读取的HdfsDataInputStream对象2从NameNode获取DataNode地址:在构造DFSInputStream的时候,对调用ClientPort原创 2017-11-16 09:46:57 · 9720 阅读 · 0 评论 -
HDFS节点内数据平衡
Hadoop集群使用久了,我们会发现一个问题,各个DataNode数据不平衡了,多的达到70-80%,少的达到10-20%。面对这种场景,我们一般使用HDFS自带的Blancer工具对其数据进行平衡。也就是他只能保证每一个节点的数据大小均衡。 但是有的时候,你会发现节点数据平衡了但是DataNode内部各个磁盘块上的数据不平衡了,这个Blancer就干不了这活儿。 比如某一个Dat转载 2017-11-16 09:43:46 · 7953 阅读 · 0 评论 -
MapReduce之RecordReader理解
RecordReader:其作用就是将数据切分成key/value的形式然后作为输入传给Mapper。 一 方法分析:1.1initialize: 初始化RecordReader,只能被调用一次。1.2nextKeyValue: 读取下一个key/value键值对1.3getCurrentKey: 获取当前的key1.4getCurrentValue: 获取当前的value原创 2017-11-17 09:26:04 · 2883 阅读 · 0 评论 -
MapReduce之Partitioner的理解
我们知道在执行map任务的时候,会将key/value写入内存或者磁盘。这个时候我们在往内存写数据的时候,会根据key创建分区。 问题一:为什要创建分区? 我们如果文件很大,我们只使用一个reducer,这个reducer就要负责去所有map端取数据。那么势必会带来性能问题,而且服务器资源也没有合理利用起来 如果要合理利用,则需要多起几个reducer,那这几个redu转载 2017-11-17 09:24:10 · 1822 阅读 · 3 评论 -
DataNode启动流程源码分析
DataNode启动流程源码分析原创 2017-11-23 08:54:25 · 1022 阅读 · 0 评论 -
NameNode之DataNode管理
NameNode启动之后,回加载fsimage和editlog文件重建文件系统目录树,但是对于数据块与DataNode之间的映射关系却需要在DataNode上报后动态构建。DataNode启动之后,除了会与NameNode握手,注册以及上报数据块,还会定时向NameNode发送心跳及数据块副本汇报,并执行NameNode的传回的指令。所以NameNode中会有很大一部分逻辑是与DataNode原创 2017-11-24 09:07:09 · 1652 阅读 · 0 评论 -
NameNode之启动流程分析
NameNode启动流程分析 public staticvoid main(Stringargv[]) throws Exception { if (DFSUtil.parseHelpArgument(argv, NameNode.USAGE, System.out,true)) { System.exit(0); }原创 2017-11-24 09:06:53 · 394 阅读 · 0 评论 -
NameNode之数据块管理
一 Block、Replica、BlocksMapHDFS使用Block类抽象NameNode中的数据块,Block实现了Writable接口,是可以序列化的,并且实现了Comparable接口,可以按照blockid大小排序。定义了三个字段:blockId:唯一标识符numBytes:数据块大小generationStamp:这个数据块的时间戳 BlockInfo类扩原创 2017-11-24 09:06:38 · 1708 阅读 · 0 评论 -
NameNode之文件系统目录树
NameNode会为维护文件系统的命名空间,命名空间是以/目录为开始的整棵目录树,整棵目录树是通过FSDirectory来管理的。在HDFS中,无论是目录还是文件都是,在文件系统目录树中都被看做是一个INode节点,如果是目录则对应的类是INodeDirectory,如果是文件,则对应的类是INodeFile. INodeDirectory包含一个children集合,其子目录或者文件会被保存原创 2017-11-23 08:56:57 · 1749 阅读 · 0 评论 -
NameNode之租约管理
我们知道HDFS文件是一次性,多次读,并且客户端不支持并行写操作。那么这里就需要一种机制保证对HDFS文件互斥操作。HDFS提供了租约(Lease)机制来实现这个功能 什么是租约?是NameNode给与租约持有者(LeaseHolder)一般是客户端在规定时间内拥有文件权限的合同 在HDFS,客户端写文件时,需要先从租约管理器(LeaseManager)申请一个租约,成功申请租原创 2017-11-23 08:56:48 · 697 阅读 · 0 评论 -
hadoop之DataBlockScanner
每一个DataNode都会初始化一个数据块扫描器(DataBlockScanner),用于周期性检测DataNode上的存储的所有数据块的正确性。如果发现有损坏的数据块则报告给NameNode。由于DataNode的数据块都是放在块池里面的,所以会持有一个BlockPoolSliceScanner对象,每一个BlockPoolSliceScanner对象负责验证一个指定的块池下数据块的正确性和完整原创 2017-11-23 08:56:32 · 579 阅读 · 0 评论 -
DataNode之文件系统数据集FsVolumeList
BlockPoolSlice: 管理一个Block Pool在指定存储目录下的所有block.由于Data Node可以定义多个存储目录,所以Block Pool的block可能会分布在多个存储目录下,一个Block Pool会拥有多个BlockPoolSlice对象,这个BlockPool对应的所有BlockPoolSlice对象共同管理Block Pool中所有的Block FSV原创 2017-11-23 08:56:14 · 678 阅读 · 0 评论 -
Checksum 校验和
一 校验数据的一般算法比较都是通过对数据进行校验产生一个校验值,用来校验数据完整性。不同点:算法不同: CRC采用多项式除法,MD5和SHA1使用的是替换、轮转等方法;校验值的长度不同:CRC校验位的长度跟其多项式有关系,一般为16位或32位;MD5是16个字节(128位);SHA1是20个字节(160位);安全性不同:这里的安全性是指检错的能力,即数据的错误能通过原创 2017-11-23 08:56:06 · 18581 阅读 · 0 评论 -
DataNode之DirectoryScanner分析
DirectoryScanner的作用就是定期扫描磁盘上的数据块,检查磁盘数据块信息是否和FsDataSetImpl的数据块信息一致,如果不一致则进行更新,他只会检查内存和磁盘上FINALIZED状态的数据块是否一致比较核心的字段:异步收集磁盘上数据块信息的线程池privatefinal ExecutorServicereportCompileThreadPool;主线程,原创 2017-11-23 08:55:53 · 879 阅读 · 0 评论 -
DataStorage分析
我们知道DataNode一个重要的功能就是管理磁盘存储的数据块,DataNode将这个功能切分为2个部分:管理与组织磁盘目录,由DataStorage实现;管理与组织数据块及其元数据,这部分由FSDatasetImpl实现。在这里,我们先分析DataStorage:StorageInfo:用于描述存储的基本信息核心字段:publicint layoutVersion;p原创 2017-11-23 08:55:39 · 3559 阅读 · 0 评论 -
DataNode逻辑结构
一 DataNode 作用1Data Node以数据块的形式存储HDFS文件2Data Node 响应HDFS 客户端读写请求3Data Node 周期性向NameNode汇报心跳信息4Data Node 周期性向NameNode汇报数据块信息5Data Node 周期性向NameNode汇报缓存数据块信息6Name Node根据汇报内容,修改NameNode的命名空间,同原创 2017-11-23 08:55:27 · 751 阅读 · 0 评论 -
DataNode的流式接口
DataNode最重要的功能就是管理物理存储上的数据块,并与NameNode和客户端通信执行读写数据块的操作。这里的读写涉及到大量的数据传输,例如DFSClient将数据块写入DataNode, DFSClient从DataNode读取数据,以及将DataNode数据块复制到其他数据节点。这些操作都涉及大量的I/O 在DataNode实现中,对这些读写操作提供了基于TCP流的数据访问接口D原创 2017-11-23 08:54:48 · 1446 阅读 · 1 评论 -
HDFS租约机制
HDFS中,当一个客户端往HDFS某个文件写入数据的时候,为了保持数据的一致性,其他客户端是不允许同时写入的。为了实现这一机制,HDFS引入了租约的概念。简而言之,租约是HDFS 给与客户端可以写入某个文件的临时许可证,没有此证件或者租约到期都不能继续向该文件写入数据。一 租约的属性或者要素:1、租约持有者(holder):一般是指客户端,每一个客户端持有一个租约。2、租约对应的文件列原创 2017-11-16 09:42:10 · 1470 阅读 · 0 评论 -
HDFS的读写限流方案
我们的集群有的时候一跑几个大的任务,就会把机房网络带宽瞬间打满,导致线上部分服务抖动.所以我们就想到了在HDFS对普通读写的限流.所以说,本文可以实质上说是一篇总结报告,阐述了方案的设想,实现以及结果. 在hadoop自身内部,就有一些限流操作:1、Blancer平衡数据限流2、FsImage镜像文件上传下载数据传输流3、VolumeScanner: 磁盘扫描的数据读操作转载 2017-11-16 09:40:54 · 1474 阅读 · 0 评论 -
HDFS数据恢复模式
在现有的HDFS中,为了保证元数据的高可用性,我们可以在配置项dfs.namenode.name.dir中配置多个元数据存储目录来达到多备份的作用。这样一来,如果其中一个目录文件损坏了,我们可以选择另外可用的文件。那么问题来了,如果所有备用的元数据都损坏了,不能用了,这个时候怎么办,那么是否就意味着集群就永远启动不起来了呢?这将会是一个多么糟糕的结果啊。在这里,我们就要引出本文的主题:HDFS的数原创 2017-11-16 09:38:45 · 3115 阅读 · 0 评论 -
如何在Hadoop中控制Map&Reduce任务的数量
一 如何控制Map任务数量既然要讨论如何控制map任务数量,那么我们就得知道有哪些因素会影响map任务的数量。 我们知道,map任务的数量是由在提交job的时候,进行文件切片的时候,文件的切片数决定的。 在这个时候,无论你是否在配置文件设置mapreduce.job.maps参数,都将会重新设置这个值为文件的切片数。 而这个文件切片数又是由splitSize决定的。如果原创 2017-11-18 10:29:33 · 2492 阅读 · 0 评论 -
map任务和reduce任务个数如何计算
一 MapTask个数的决定因素首先,我们需要明确以下几点:1Map Task个数不能通过配置文件指定2Map Task个数是在进行文件的切分时动态计算的3FileInputFormat负责切分文件进行split操作1.1分析源码:intmaps = writeSplits(job, submitJobDir);privateint writeSplits(or原创 2017-11-18 10:26:43 · 1871 阅读 · 0 评论 -
Mapreduce的工作流程
一 Job的提交过程1.1创建Job(我们可以理解为一个需要运行的MapReduce应用程序的作业)1.2设置Job需要运行的应用程序1.3校验Job输出路径1.4设置Mapper类和输入key和输出value的数据类型1.5设置Reduce类和输入key和输出value的数据类型1.6Job创建JobSubmitter实例,并调用其submitInternal方法提交应用原创 2017-11-18 10:25:04 · 756 阅读 · 0 评论 -
Mapreduce的工作原理
1YarnChild 调用MapTask#run方法 2在执行MapTask的时候,会产生一个Mapper实例,然后调用其run方法,run方法又会调用map方法。 3map方法会初始化一些操作,然后从Context判断是否存在下一个key-value文本键值对,其本质是根据RecordReader#nextKeyValue读取的,如果存在则取出这个key和value传入到map方原创 2017-11-18 10:23:25 · 551 阅读 · 0 评论 -
MapReduce之如何给运行在YARN上的MapReduce作业配置内存
关于mapreduce程序运行在yarn上时内存的分配一直是一个让我蒙圈的事情,单独查任何一个资料都不能很好的理解透彻。于是,最近查了大量的资料,综合各种解释,终于理解到了一个比较清晰的程度,在这里将理解的东西做一个简单的记录,以备忘却。首先,先将关于mapreduce和yarn关于内存分配的参数粘贴上:yarn.scheduler.minimum-allocation-mbyarn.原创 2017-11-18 10:21:59 · 2533 阅读 · 0 评论 -
MapReduce之如何处理失败的task
一 常见容错场景分析1.1作业某个任务阻塞了,长时间占用资源不释放1.2在MapTask任务运行完毕,ReduceTask运行过程中,某个MapTask节点挂了,或者某个MapTask结果存放的那磁盘坏掉了 二 作业某个任务阻塞了,长时间占用资源不释放这种问题通常是由于程序bug,数据特性造成的,会让程序阻塞,任务运行停滞不前。在我们表面上看来是任务停滞不前。 这种问题原创 2017-11-18 10:20:40 · 4447 阅读 · 0 评论 -
MapReduce之二次排序
有时候,一个文件有多个字段,但是我们希望首先根据第一个字段排序,然后key相同的情况下,在进行第二个字段的排序。原创 2017-11-18 10:18:45 · 367 阅读 · 0 评论 -
Initialization failed for Block pool
一 启动HBase master就挂掉2016-11-21 20:14:06,926 FATAL [master:hadoop09-linux:60000] master.HMaster: Unhandled exception. Starting shutdown.org.apache.hadoop.ipc.RemoteException(java.io.IOException): Fi转载 2016-11-21 20:33:16 · 3812 阅读 · 0 评论 -
Hadoop系列-分布式集群
一 分布式集群机器规划本机物理机:内存32G,硬盘1T, CPUi7 四核我规划三台虚拟机参与集群,每一台分配3G内存,30G硬盘,CPU 单核。 二 克隆虚拟机clone--> 修改机器名称-->Full Done --> clone然后vim/etc/udev/rules.d/70-persistent-net.rules把第一行删掉把第二条原创 2016-10-23 11:43:54 · 506 阅读 · 0 评论 -
Hadoop系列-YARN RM HA 高可用集群
三 ResourceManager HA集群3.1修改 yarn-site.xml 3.2 yarn-site.xml分发到其他节点scpyarn-site.xml hadoop@hadoop-cluster-02:/opt/app/hadoop-2.5.0/etc/hadoopscpyarn-site.xml hadoop@hadoop-cluster-0原创 2016-10-23 20:43:34 · 4343 阅读 · 0 评论