hdfs FileStatus的accesstime的变更

背景:

hdfs文件系统有很多小文件,这些小文件会定期合并到大文件中,合并完成之后要删除这些小文件。但是有可能当前其他人正在读取这些小文件,此时如果将这些小文件删除,会导致当前用户无法正确获取到文件。

这一点hdfs做的有点恶心:最初我的理解是如果有线程A正在读取这个小文件,其他线程B删除这个小文件时应该会失败(至少应该要抛出异常)。但是测试发现不是这样的。实际的结果是:线程B默默的将小文件直接删除了,导致线程A只下载了这个文件的一部分,然后就卡在这里不动了。

针对这个问题的一个解决方案是:小文件被合并到大文件之后,保留30分钟后再删除,具体做法是通过FileStatus中的accesstime来获取上次的访问时间,如果当前时间减去accesstime超过了30分钟才真正的删除这个小文件。(也就是给30分钟的缓冲时间。小文件合并到到文件之后,以后新的请求都是从大文件中下载数据)

但是问题又出现了。

@Test

public void fileStatusByRead() {

// modification_time=1426037170715; access_time=1426037170138

String desPath = "hdfs://******//8000000014268147637640-793038384000000014260371637637117";

FSDataInputStream in = null;

OutputStream outputStream = null;

// 初始化主集群

HDFSSystem hdfsSystem;

try {

hdfsSystem = new HDFSSystem();

FileStatus fileStatus = hdfsSystem.getFileStatus(new Path(desPath));

System.out.println("+++1:" + fileStatus.toString());

Thread.sleep(82 * 1000);

in = hdfsSystem.open(new Path(desPath));

long copySize = 8;

outputStream = new FileOutputStream("D:\\input\\ttttt1.txt");

// 读取数据

IOUtils.copyBytes(in, outputStream, copySize, true);

fileStatus = hdfsSystem.getFileStatus(new Path(desPath));

System.out.println("+++2:" + fileStatus.toString());

} catch (Exception e) {

e.printStackTrace();

}

}

测试发现System.out.println("+++1:" + fileStatus.toString()); 和System.out.println("+++2:" + fileStatus.toString());打印的时间居然一模一样

解决方法:

修改hdfs-site.xml中的

<property>

<name>dfs.namenode.accesstime.precision</name>

<value>3600000</value>

<description>The access time for HDFS file is precise upto this value.

The default value is 1 hour. Setting a value of 0 disables

access times for HDFS.

</description>

</property>

将默认的一小时改为10分钟。  但是这回带来一定的性能消耗。理想的解决办法是将文件的保留时间修改为1个小时或者2个小时。

时间: 2024-10-13 01:07:42

hdfs FileStatus的accesstime的变更的相关文章

HDFS API基本操作

对HDFS API基本操作都是通过 org.apache.hadoop.fs.FileSystem类进行的,以下是一些常见的操作: package HdfsAPI; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; i

HADOOP docker(九):hdfs权限

1. 概述2. 用户身份标识3. 组映射4.关于权限的实现5.文件系统API的变更6.应用程序shell的变更7.超级用户8.ACLs9.ACL 文件系统API10.ACL命令11.参数配置12.总结 骚年们,我们今天来学习hdfs的权限~ 请忽略4,5两段内容~ 文档:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html 中文文档参考:http://hadoo

HDFS跨集群数据合并方案之ViewFileSystem

前言 在很多时候,我们会碰到数据融合的需求,比如说原先有A集群,B集群,后来管理员认为有2套集群,数据访问不方便,于是设法将A,B集群融合为一个更大的集群,将他们的数据都放在同一套集群上.一种办法就是用Hadoop自带的DistCp工具,将数据进行跨集群的拷贝.当然这会带来很多的问题,如果数据量非常庞大的话.本文给大家介绍另外一种解决方案,ViewFileSystem,姑且可以叫做视图文件系统.大意就是让不同集群间维持视图逻辑上的唯一性,不同集群间还是各管各的. 传统数据合并方案 为了形成对比,

Alex 的 Hadoop 菜鸟教程: 第18课 用Http的方式访问HDFS - HttpFs 教程

声明 本文基于Centos 6.x + CDH 5.x HttpFs 有啥用 HttpFs可以干这两件事情 通过HttpFs你可以在浏览器里面管理HDFS上的文件 HttpFs还提供了一套REST 风格的API可以用来管理HDFS 其实很简单的一个东西嘛,但是很实用 安装HttpFs 在集群里面找一台可以访问hdfs的机器安装HttpFs $ sudo yum install hadoop-httpfs 配置 编辑/etc/hadoop/conf/core-site.xml <property>

HDFS的操作SHELL和API

HDFS的shell操作和JavaAPI的使用: WEB WEB端口50090查看SecondaryNameNode信息.可以查看Hadoop的版本,NameNode的IP,Checkpoint等信息. WEB端口50070可以查看HDFS的信息和目录结构 SHELL 查看 hdfs dfs -ls [-d][-h][-R] <paths> [-d]:返回path [-h]:按照KMG数据大小单位显示文件大小,默认B [-R]:级联显示paths下文件 创建文件夹 hdfs dfs -mkdi

几种访问HDFS文件的客户端的总结

HDFS是英文Hadoop Distributed File System的缩写,中文翻译为Hadoop分布式文件系统,它是实现分布式存储的一个系统,所以分布式存储有的特点,HDFS都会有,HDFS的架构图: 上图中HDFS的NameNode其实就是对应着分布式存储的Storage master,主要是用来存储元数据的,根据这些元数据就可以管理所有的机器节点和数据块 HDFS的DataNodes其实就是对应着分布式存储的Storage slaves,主要就是真正存储数据的 在HDFS中,一个大文

三: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初探之旅

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