hadoop client与datanode的通信协议分析_java

本文主要分析了hadoop客户端read和write block的流程. 以及client和datanode通信的协议, 数据流格式等.

hadoop客户端与namenode通信通过RPC协议, 但是client 与datanode通信并没有使用RPC, 而是直接使用socket, 其中读写时的协议也不同, 本文分析了hadoop 0.20.2版本的(0.19版本也是一样的)client与datanode通信的原理与通信协议.  另外需要强调的是0.23及以后的版本中client与datanode的通信协议有所变化, 使用了protobuf作为序列化方式.

Write block

1. 客户端首先通过namenode.create, 向namenode请求创建文件, 然后启动dataStreamer线程

2. client包括三个线程, main线程负责把本地数据读入内存, 并封装为Package对象, 放到队列dataQueue中.

3. dataStreamer线程检测队列dataQueue是否有package, 如果有, 则先创建BlockOutPutStream对象(一个block创建一次, 一个block可能包括多个package), 创建的时候会和相应的datanode通信, 发送DATA_TRANSFER_HEADER信息并获取返回. 然后创建ResponseProcessor线程, 负责接收datanode的返回ack确认信息, 并进行错误处理.

4. dataStreamer从dataQueue中拿出Package对象, 发送给datanode. 然后继续循环判断dataQueue是否有数据…..

下图展示了write block的流程.

下图是报文的格式

Read block

主要在BlockReader类中实现.

初始化newBlockReader时,

1. 通过传入参数sock创建new SocketOutputStream(socket, timeout), 然后写通信信息, 与写block的header不大一样.

//write the header.

out.writeShort( DataTransferProtocol.DATA_TRANSFER_VERSION );

out.write( DataTransferProtocol.OP_READ_BLOCK );

out.writeLong( blockId );

out.writeLong( genStamp );

out.writeLong( startOffset );

out.writeLong( len );

Text.writeString(out, clientName);

out.flush();

2. 创建输入流 new SocketInputStream(socket, timeout)

3. 判断返回消息 in.readShort() != DataTransferProtocol.OP_STATUS_SUCCESS

4. 根据输入流创建checksum : DataChecksum checksum = DataChecksum.newDataChecksum( in )

5. 读取第一个Chunk的位置: long firstChunkOffset = in.readLong()

注: 512个字节为一个chunk计算checksum(4个字节)

6. 接下来在BlockReader的read方法中读取具体数据: result = readBuffer(buf, off, realLen)

7. 一个一个chunk的读取

int packetLen = in.readInt();

long offsetInBlock = in.readLong();

long seqno = in.readLong();

boolean lastPacketInBlock = in.readBoolean();

int dataLen = in.readInt();

IOUtils.readFully(in, checksumBytes.array(), 0,

checksumBytes.limit());

IOUtils.readFully(in, buf, offset, chunkLen);

8. 读取数据后checksum验证; FSInputChecker.verifySum(chunkPos)

时间: 2024-11-18 05:22:58

hadoop client与datanode的通信协议分析_java的相关文章

[Hadoop]Hadoop添加节点datanode

部署hadoop 和普通的datanode一样.安装jdk,ssh 修改host 和普通的datanode一样.添加namenode的ip 修改namenode的配置文件conf/slaves 添加新增节点的ip或host 在新节点的机器上,启动服务 [root@slave-004 hadoop]# ./bin/hadoop-daemon.sh start datanode [root@slave-004 hadoop]# ./bin/hadoop-daemon.sh start tasktra

053_《Delphi网络通信协议分析与应用实现》

<Delphi网络通信协议分析与应用实现> Delphi 教程 系列书籍 (053) <Delphi网络通信协议分析与应用实现> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 书名: Delphi网络通信协议分析与应用实现 作者: 钟军 汪晓平等著 出版社: 人民邮电出版社 书号: 7115110034 出版日期:2003年1月 开本: 787*1092 1/16 页码: 483 版次: 2003年1月北京第一版第一次印刷 内容简介 本书介绍如何

[文档]基于Hadoop/Hive的web日志分析系统的设计

基于Hadoop/Hive的web日志分析系统的设计 刘永增,张晓景,李先毅 利用Hadoop.Hive设计了一个用于处理web日志分析的系统,既充分利用了Hadoop的海量数据处理的能力,又降低了开发的难度.通过与单机实验的对比,证明系统是有效的和有价值的. 关键词:web日志:云计算:Hadoop:Hive [下载地址]http://bbs.chinacloud.cn/showtopic-12968.aspx

org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in receiveBlock for block

Hbase依赖的datanode日志中如果出现如下报错信息:DataXceiverjava.io.EOFException: INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in receiveBlock for block  解决办法:Hbase侧配置的dfs.socket.timeout值过小,与DataNode侧配置的 dfs.socket.timeout的配置不一致,将hbase和datanode的该配置调成

从Hadoop实践到基于业务的分析

Hadoop.google 3大论文的开源实现,让开发者可以在商用服务器上做海量数据处理,其批处理方式虽然不适用于实时场景,但却可以让用户以更低廉的成本做离线数据分析,这也是为什么当下流处理框架林立,Hadoop仍然被广泛使用及讨论的原因.本期活动将从Hadoop开始,为大家打开基于业务的数据分析之门. 首先上场分享的是来自九城技术部负责Hadoop的架构师,周诚.他同时也是我们CSDN高性能计算板块Hadoop板块的板主,网名是撸大湿 ,相信经常登录论坛的同学都会有所了解.今天周诚带来的主题是

Hadoop项目实战-用户行为分析之应用概述(一)

1.概述 本课程的视频教程地址:<Hadoop 回顾> 好的,下面就开始本篇教程的内容分享,本篇教程我为大家介绍我们要做一个什么样的Hadoop项目,并且对Hadoop项目的基本特点和其中的难点做有针对性的剖析,完成项目环境的基本配置,以及项目工程和Hadoop插件的相关准备等工作. 本课程主要包含以下课时,其内容如下图所示: 本节为大家分享的是第一节--<Hadoop 回顾>,下面开始今天的分享内容. 2.内容 从这节开始,我们将进入到Hadoop项目的实战学习,本节课程为大家介

Hadoop项目实战-用户行为分析之应用概述(三)

1.概述 本课程的视频教程地址:<项目工程准备> 本节给大家分享的主题如下图所示: 下面我开始为大家分享今天的第三节的内容--<项目工程准备>,接下来开始分享今天的内容. 2.内容 从本节开始,我们将进入到Hadoop项目的工程准备一节学习,本节课程为大家介绍的主要知识点有一下内容,如下图所示: 首先,我给大家介绍开发Hadoop项目的IDE和相关插件的使用,其内容包含的知识点如下图所示: 在开发Hadoop项目时,我们使用的开发语言时Java,编写Java的相关代码,都是在IDE

Hadoop项目实战-用户行为分析之应用概述(二)

1.概述 本课程的视频教程地址:<项目整体概述> 本节给大家分享的主题如下图所示: 下面我开始为大家分享第二节的内容--<项目整体概述>,下面开始今天的分享内容. 2.内容 从本节开始,我们将进入到Hadoop项目的整体概述一节学习,本节课程为大家介绍的主要知识点有一下内容,如下图所示: 下面,我们首先来看看项目的整体流程,其流程如下图所示: 项目流程可以分为4个模块,他们分别是数据收集,集群存储,分析计算和结果处理. 下面我分别为大家讲解这4个模块的作用. 我们知道,在做统计时,

hadoop助力python构建mapreduce日志分析平台

如果将http://www.aliyun.com/zixun/aggregation/867.html">流量比较大的日志直接写入Hadoop的话,对Namenode无疑会负载过大,因此入库前合并,可以把各个节点的日志凑并成一个文件写入HDFS. 分析下日志的大小,像200G的dns日志文件,压缩到18G,要是用awk perl当然也可以,但是处理速度肯定没有分布式来的那样迅速 Hadoop Streaming原理 mapper和reducer会从标准输入中读取用户数据,一行一行处理后发送