DistributedRaidFileSystem引起的HDFS RAED不准问题

一、问题描述

在测试环境和线上运行相同的hql,而且表对应的数据量都是95G左右,但是发现在测试环境和线上的counter:HDFS RAED不一致,而且差一个数量级,线上只有8G左右,而测试环境达到95G,基本上就是全文件扫描,没有体现出RCFile的优势。

hql:

select gender,count(gender) from mds_user_info where dt="20150106" group by gender;

二、问题原因

最后发现是因为测试环境配置了fs.hdfs.impl为DistributedRaidFileSystem导致的这个问题。

hive在读取RCFile的时候,会用到RCFile的内部类Reader,由于咱们配置了fs.hdfs.impl,所以Reader在打开输入流时会走DistributedRaidFileSystem的open方法:

DRFS中open方法返回的是ExtFSDataInputStream,而ExtFSDataInputStream中真正使用的时ExtFsInputStream。由于RCFile是按列储存的,所以在查询时会过滤掉很多不需要扫描的列,如下seekToNestKeyBuffer,会调用输入流中的skip方法。

以下是在ExtFsInputStream的skip方法:

注意红框部分,每次skip的时候,都会进行read操作,导致全文件读取。所以测试环境的counter计数和线上就不一致了。

如果咱们不配置fs.hdfs.impl,读取FCFile文件时就会走DistributedFileSystem,DistributedFileSystem的open方法打开的输入流是DFSInputStream,以下是DFSInputStream的skip方法:

没有read方法,而且最后会执行seek方法,设置下一次读取文件的位置。

三、解决办法

从上面的第二点分析得出问题出在ExtFsInputStream的skip方法,那就从skip方法入手:

1、按照DFSInputStream的skip方法修改:

去掉read方法,最后调用seek方法设置下一次文件读取偏移量。

以下是这种修改的测试情况:

(1)、hql测试

测试了前面提到的hql:

select gender,count(gender) from mds_user_info where dt="20150106" group by gender;

结果:测试环境的HDFS READ 和线上一致。

(2)、文本文件raid之后执行wordcount使用DistributedRaidFileSystem恢复测试

结果:丢块在执行wordcount时能通过DistributedRaidFileSystem正常恢复,并输出结果,由于是普通文本,直接进行全文件扫描,不会调用ExtFsInputStream中的skip方法。

(3)、RCFile文件raid之后执行hql使用DistributedRaidFileSystem恢复测试

hql:select count(*) from test_mds_user_info;

结果:出现异常,根据日志显示,出现了MissingBlock异常,而且进行了恢复操作,但是下次读的时候没有从恢复流里面读,而是还是从错误流里面读取数据了。

原因:先执行了skip方法调用了seek,设置偏移量,导致读取的时候如果出现异常并进行恢复时,恢复起始位置不对,导致恢复的输入流不可用。

2、综合DFSInputStream的skip方法和ExtFsInputStream的skip方法进行修改:

在read方法:

思路:DFSInputStream类新增skipNeedRead字段,默认为true。

1、如果先执行read方法,并且一起正常,设置skipNeedRead为false,后面在执行skip方法的时候执行seek,如果执行read方法出现异常,并通过raid进行恢复了,设置skipNeedRead为true,后面在执行skip方法的时候执行read。

2、如果先执行skip方法,由于skipNeedRead默认为true,所以skip方法会执行read操作,read数据时如果出现异常并进行恢复,设置skipNeedRead=true,以后执行skip时都会执行read操作,如果skip执行read方法未出现异常,则以后执行skip时执行seek操作,设置下一次文读取偏移量。

测试结果都OK。

时间: 2024-12-04 23:44:50

DistributedRaidFileSystem引起的HDFS RAED不准问题的相关文章

三:QJM HDFS高可用

本文介绍的是HDFS的一种HA方案.虽然有checkpoint node \backup node等,但是不能实现自动的failover. http://hadoop.apache.org/docs/r2.6.3/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html 1.在2.0.0版本以下,namenode是单个的,如果namenode宕机,就会导致整个集群不可用.QJM 是HA的一种实现方式,通过master/sla

七:HDFS Permissions Guide 权限

1.权限模式     简单:启动HDFS的操作系统用户即为超级用户,可以通过HADOOP_USER_NAME指定 kerberos: 2.group mapping 组列表由group mapping service完成,该服务由hadoop.security.group.mapping参数决定,默认值是org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback,即由JNI. 如果没有JNI, 使用org.apache.had

HDFS

一.HDFS基础知识 1. namenode 负责: 管理着文件系统命名空间 – 维护着文件系统树及树中的所有文件和目录    存储元数据 – NameNode保存元信息的种类有: • 文件名目录名及它们之间的层级关系 • 文件目录的所有者及其权限 • 每个文件块的名及文件有哪些块组成 元数据保存在内存中 – NameNode元信息并不包含每个块的位置信息 元信息持久化 - 在NameNode中存放元信息的文件是fsimage.在系统运行期间所有对元信息的操作都保存在内存中并被持久化到另一个文件

数据采集之Web端上传文件到Hadoop HDFS

前言 最近在公司接到一个任务,是关于数据采集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志采集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好最近都有在这方面做知识储备.正所谓养兵千日,用兵一时啊.学习到的东西只有应用到真实的环境中才有意义不是么. 环境 这里只做模拟环境,而不是真实的线上环境,所以也很简单,如果要使用的话还需要优化优化. OS Debian 8.7 Hadoop 2.6.5 SpringBoot 1.5.1.RELEASE 说明一下,这

Apache Hadoop集群离线安装部署(一)——Hadoop(HDFS、YARN、MR)安装

虽然我已经装了个Cloudera的CDH集群(教程详见:http://www.cnblogs.com/pojishou/p/6267616.html),但实在太吃内存了,而且给定的组件版本是不可选的,如果只是为了研究研究技术,而且是单机,内存较小的情况下,还是建议安装Apache的原生的集群拿来玩,生产上自然是Cloudera的集群,除非有十分强大的运维. 我这次配了3台虚拟机节点.各给了4G,要是宿主机内存就8G的,可以搞3台2G,应该也是ok的. 〇.安装文件准备 Hadoop 2.7.3:

Hadoop核心组件:四步通晓HDFS

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件上的分布式文件系统,它提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序,那么在实际应用中我们如何来操作使用呢? 一.HDFS操作方式: 1.  命令行操作 –FsShell:$ hdfs dfs 2. 其他的计算框架-如spark 通过URI,比如: hdfs://nnhost:port/file-,调用HDFS的协议.主机.端口或者对外提供的服务媒.以及文件,在spark的程序中实现对HDFS的访问. 3.  其

sqoop同步mysql到hdfs

链接:http://pan.baidu.com/s/1gfHnaVL 密码:7j12 mysql-connector version 5.1.32 若在安装版本过程遇到些问题,可参考http://dbspace.blog.51cto.com/6873717/1875955,其中一些问题的解决办法 下载并安装: cd /usr/local/tar -zxvf sqoop2-1.99.3-cdh5.0.0.tar.gzmv sqoop2-1.99.3-cdh5.0.0 sqoop添加sqoop2到系

eclipse 向HDFS中写入文件报错 permission denied

环境:win7  eclipse    hadoop 1.1.2 当执行创建文件的的时候, 即: fileSystem.mkdirs(Path);//想hadoop上创建一个文件报错 报错: org.apache.hadoop.security.AccessControlException:Permission denied:user=Administrator,access=WRITE,inode="tmp":root:supergroup:rwxr-xr-x 原因: 1. 当前用户

[转载]HDFS初探之旅

转载自 http://www.cnblogs.com/xia520pi/archive/2012/05/28/2520813.html , 感谢虾皮工作室这一系列精彩的文章. Hadoop集群(第8期)_HDFS初探之旅 1.HDFS简介 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上.它所具有的高容错.高可靠性.高可扩展性.高