hadoop 数据一致模型
cookqq ›博客列表 ›hadoop

hadoop 数据一致模型

2013-04-26 13:01:57.0|分类: hadoop|浏览量: 1392

摘要: 文件系统的一致模型描述了对文件读写的数据可见性。HDFS为性能牺牲了一些POSIX请求,因此一些操作可能比想像的困难。 在创建一个文件之后,在文件系统的命名空间中是可见的,如下所示: path p = new Path(...

文件系统的一致模型描述了对文件读写的数据可见性。HDFS为性能牺牲了一些POSIX请求,因此一些操作可能比想像的困难。

在创建一个文件之后,在文件系统的命名空间中是可见的,如下所示:

path p = new Path("p");   

 
 
 
 
 
  1. Fs.create(p);  
  2. assertThat(fs.exists(p),is(true)); 

但是,写入文件的内容并不保证能被看见,即使数据流已经被刷新。所以文件长度显示为0:

Path p = new Path("p");   

 
 
 
 
 
  1. OutputStream out = fs.create(p);  
  2. out.write("content".getBytes("UTF-8"));  
  3. out.flush();  
  4. assertThat(fs.getFileStatus(p).getLen(),is(0L)); 

一旦写入的数据超过一个块的数据,新的读取者就能看见第一个块。对于之后的块也是这样。总之,它始终是当前正在被写入的块,其他读取者是看不见它的。

HDFS提供一个方法来强制所有的缓存与数据节点同步,即在文件系统数据输出流使用sync()方法。在sync()返回成功后,HDFS能保证文件中直至写入的最后的数据对所有新的读取者而言,都是可见且一致的。万一发生冲突(与客户端或HDFS),也不会造成数据丢失:

 path p = new Path("p");   

 
 
 
 
 
  1. FSDataOutputStream out = fs.create(p);  
  2. out.write("content".getBytes("UTF-8"));  
  3. out.flush();  
  4. out.sync();  
  5. assertThat(fs.getFileStatus(p).getLen(),  is(((long) "content".length()))); 

此行为类似于Unix中的fsync系统调用-- 为一个文件描述符提交缓冲数据。例如,利用Java API写入一个本地文件,我们肯定能够看到刷新流和同步之后的内容:

 

 
 
 
 
 
  1. FileOutputStream out = new FileOutputStream(localFile);  
  2. out.write("content".getBytes("UTF-8"));  
  3. out.flush(); // flush to operating system  
  4. out.getFD().sync(); // sync to disk  
  5. assertThat(localFile.length(), is(((long) "content".length()))); 

在HDFS中关闭一个文件其实还执行了一个隐含的sync():

 Path p = new Path("p");  

 
 
 
 
 
  1. OutputStream out = fs.create(p);  
  2. out.write("content".getBytes("UTF-8"));  
  3. out.close();  
  4. assertThat(fs.getFileStatus(p).getLen(), is(((long) "content".length()))); 

应用设计的重要性

这个一致模型与具体设计应用程序的方法有关。如果不调用sync(),那么一旦客户端或系统发生故障,就可能失去一个块的数据。对很多应用来说,这是不可接受的,所以我们应该在适当的地方调用sync(),例如在写入一定的记录或字节之后。尽管sync()操作被设计为尽量减少HDFS负载,但它仍然有开销,所以在数据健壮性和吞吐量之间就会有所取舍。应用依赖就比较能接受,通过不同的sync()频率来衡量应用程序,最终找到一个合适的平衡。

一键分享文章

分类列表

  • • struts源码分析
  • • flink
  • • struts
  • • redis
  • • kafka
  • • ubuntu
  • • zookeeper
  • • hadoop
  • • activiti
  • • linux
  • • 成长
  • • NIO
  • • 关键词提取
  • • mysql
  • • android studio
  • • zabbix
  • • 云计算
  • • mahout
  • • jmeter
  • • hive
  • • ActiveMQ
  • • lucene
  • • MongoDB
  • • netty
  • • flume
  • • 我遇到的问题
  • • GRUB
  • • nginx
  • • 大家好的文章
  • • android
  • • tomcat
  • • Python
  • • luke
  • • android源码编译
  • • 安全
  • • MPAndroidChart
  • • swing
  • • POI
  • • powerdesigner
  • • jquery
  • • html
  • • java
  • • eclipse
  • • shell
  • • jvm
  • • highcharts
  • • 设计模式
  • • 列式数据库
  • • spring cloud
  • • docker+node.js+zookeeper构建微服务
版权所有 cookqq 感谢访问 支持开源 京ICP备15030920号
CopyRight 2015-2018 cookqq.com All Right Reserved.