设为首页 收藏本站
查看: 1190|回复: 0

[经验分享] Hadoop学习笔记(3) Hadoop I/O

[复制链接]

尚未签到

发表于 2017-12-17 06:49:56 | 显示全部楼层 |阅读模式
  1. HDFS的数据完整性
  HDFS会对写入的所有数据计算校验和,并在读取数据时验证校验和。datanode负责在验证收到的数据后存储数据及其校验和。正在写数据的客户端将数据及其校验和发送到由一系列datanode组成的管线,管线中的最后一个datanode负责验证校验和。如果datanode检测到错误,客户端便会收到一个ChecksumException异常。
  客户端从datanode读取数据时,也会验证校验和,将它们与datanode中存储的校验和进行比较。每个datanode均持久保存有一个用于验证的校验和日志,所以它知道每个数据块的最后一次验证时间。客户端成功验证一个数据块后,会告诉这个datanode,datanode由此更新日志。
  不只是客户端在读取数据块时会验证校验和,每个datanode也会在后台线程中运行一个DataBlockScanner,从而定期验证存储在这个datanode上的所有数据块。
  客户端在读取数据块时,如果监测到错误,就像namenode报告已损坏的数据块及其正在尝试读操作的这个datanode,最后才抛出ChecksunException异常。namenode将这个已损坏的数据块的复本标记为已损坏,之后安排这个数据块的一个复本复制到另一个datanode,如此一来,数据块的复本因子又回到期望水平。此后,已损坏的数据块复本便被删除。
  禁用校验和的方法:在的、使用open()方法读取文件之前,将false值传递给FileSystem对象的setVerifyChecksum()方法。
  (1) LocalFileSystem执行客户端的校验和验证,意味着在你写入名为filename的文件时,客户端会在包含每个文件块校验和的同一个目录内新建一个名为filename.crc的隐藏文件。读取文件时需要验证校验和,若检测到错误,LocalFileSystem将抛出ChecksumException异常。
  禁用校验和,可使用RawLocalFileSystem代替LocalFileSystem。
  (2) ChecksumFileSystem
  LocalFileSystem通过ChecksumFileSystem来完成校验,有了该类,向其他文件系统加入校验和就非常简单。
  2. 压缩
  压缩格式:
DSC0000.jpg

  所有压缩算法都需要权衡空间/时间:压缩和解压缩速度更快,其代价通常是只能节省少量的空间。表中的压缩工具提供9个不同的选项来控制压缩时间时必须考虑的权衡:-1为优化压缩速度,-9为优化压缩时间。
  codec实现了一种压缩-解压缩算法。在Hadoop中,一个对CompressionCodec接口的实现代表一个codec。
DSC0001.jpg

  (1) 通过CompressionCodec对数据流进行压缩和解压缩
  如果要对写入输出数据流的数据进行压缩,可用createOutputStream(OutputStream out)方法新建一个CompressOutputStrean对象,相反,对输入数据流中读取的数据进行解压缩时,调用createInpueStream(InputStream in)获取CompressionInputStream。
  

public>
public static void main(String[] args) {  

// 将CompressionCodec实现的完全合格名称作为第一个命令行参数  
String codecClassname = args[0];
  
Class<?> codecClass =>  
Configuration conf = new Configuration();
  

  
// 使用ReflectionUtils构建一个新的codec实例
  
CompressionCodec codec = (CompressionCodec)ReflectUtils.newInstance(codecClass,conf);
  
// 在System.out上包裹一个压缩方法。
  
CompressionOutputStream out = codec.createOutputStream(System.out);
  
IOUtils.copyBytes(System.in,out,4096,false);
  // 调用finish()方法,要求压缩方法完成到压缩数据流的写操作,但不关闭这个数据流
  
out.finish();
  
}
  
}
  

  例:通过GzipCodec的Stream对象对字符串"Text"进行压缩,然后使用gunzip从标准输入中对它进行读取并解压缩:
  % echo "Text" | hadoop StreamCompressor org.apache.hadoop.io.compress.GzipCodec | gunzip
  (2) 通过CompressionCodecFactory推断CompressCodec
  CompressionCodecFactory的getCodec()方法可以将文件扩展名映射到一个CompressionCodec,该方法去文件Path对象欧威参数。
  例:由文件扩展名推断而来的codec对文件进行解压缩
  

public>
public static void main(String[] args) {
  
String uri
= args[0];  
Configuration conf
= new Configuration();  
FileSystem fs
= FileSyste.get(URI.create(uri),conf);  

  
Path inputPath
= new Path(uri);  
CompressionCodecFactory factory
= new CompressionCodecFactory(conf);  
CompressionCodec codec
= factory.getCodec(inputPath);  

if(codec == null){  
System.err.println(
"No codec found for "+uri);  
System.exit(
1);  
}
  

  // 一旦找到对应的codec,便去除文件扩展名行成输出文件名
  
String outputUri
= CompressionCodecFactory.removeSuffix(uri,codec.getDefaultExtension());  
InputStream
in = null;  
OutputStream out
= null;  
try{
  

in = codec.createInputStream(fs.open(inputPath));  
out
= fs.create(new Path(outputUri));  
IOUtils.copyBytes(
in,out,conf);  
}finally{
  
IOUtils.closeStream(
in);  
IOUtils.closeStream(out);
  
}
  
}
  
}
  

  例:一个名为file.gz的文件可以通过下面的程序压缩为名为file的文件:
  % hadoop FileDecompressor file.gz
  下表为压缩codec的属性:
DSC0002.jpg

  (3) 原生类库
  原生类库可以提供压缩/解压缩性能。注意:并非所有格式都有原生实现。
DSC0003.jpg

  可以通过Java系统的java.library.path属性指定原生代码库。默认情况下,Hadoop会根据自身运行的平台搜索原生代码库。禁用原生代码库,将属性hadoop.native.lib的值设置成false即可。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424896-1-1.html 上篇帖子: Hadoop-2.7.2集群的搭建 下篇帖子: Hadoop之HDFS及NameNode单点故障解决方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表