首页 技术 正文
技术 2022年11月7日
0 收藏 737 点赞 626 浏览 2262 个字

                 Hadoop基础-HDFS数据清理过程之校验过程代码分析

                                          作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  

  想称为一名高级大数据开发工程师,不但需要了解hadoop内部的运行机制,还需要掌握hadoop在写入过程中的报文分析。当然代码的调试步骤是一个开发必须得会的技能!想要掌握这三个技能,我们就可以拿HDFS写入过程来练练手,了解一下平时就几行的代码在它的内部是如何帮我们实现数据传输的。

一.Idea代码调试简介

1>.编写测试代码

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils; import java.io.FileInputStream;
import java.io.IOException; public class WriterToHdfs {
public static void main(String[] args) throws IOException {
//设置访问hdfs的用户名为“yinzhengjie”
System.setProperty("HADOOP_USER_NAME","yinzhengjie");
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
//定义需要在hdfs中写入的路径,别忘记把core-site.xml文件放在resources目录下哟!并fs.defaultFS的值设置为"hdfs://s101:8020"
Path p = new Path("/yinzhengjie.sql");
//通过fs对象create方法创建一个输出流,第一个参数是hdfs路径,第二个参数表示当hdfs中存在时是否覆盖
FSDataOutputStream fos = fs.create(p,true);
FileInputStream fis = new FileInputStream("D:\\10.Java\\IDE\\yhinzhengjieData\\MyHadoop\\yinzhengjie.sql");
//通过hadoop提供的IOUtils工具类对拷数据
IOUtils.copyBytes(fis,fos,1024);
fis.close();
fos.close();
}
}

2>.进入调试模式

Hadoop基础-HDFS数据清理过程之校验过程代码分析

3>.查看源码执行过程,流程控制按键介绍:

Hadoop基础-HDFS数据清理过程之校验过程代码分析

4>.断点列表管理

Hadoop基础-HDFS数据清理过程之校验过程代码分析

 

二.查看 “FileSystem fs = FileSystem.get(conf)” 的由来

1>.查看conf的返回值

Hadoop基础-HDFS数据清理过程之校验过程代码分析

2>.进入“FileSystem.get”方法(我们需要在return那一行右击就可以弹出图中的对话框,其实不用刻意去选中getDefaultUri)

Hadoop基础-HDFS数据清理过程之校验过程代码分析

3>.查看“getDefaultUri(conf)”返回的参数

Hadoop基础-HDFS数据清理过程之校验过程代码分析

4>.通过“CACHE.get(uri, conf)”返回文件系统

Hadoop基础-HDFS数据清理过程之校验过程代码分析

5>.返回文件系统

Hadoop基础-HDFS数据清理过程之校验过程代码分析

三.查看“fs.create(p, true)”创建流的详细过程

1>.单步进入“fs.create(p, true)”创建流

Hadoop基础-HDFS数据清理过程之校验过程代码分析

2>.经过断电跟踪,发现最后返回的是HDFSOutputStream,也就是创建流,此时还没有真正的写入数据

Hadoop基础-HDFS数据清理过程之校验过程代码分析

3>.在写入过程中进入到write1方法

Hadoop基础-HDFS数据清理过程之校验过程代码分析

4>.再进入到FlushBuffer,目的是清理chunk

Hadoop基础-HDFS数据清理过程之校验过程代码分析

5>.验证chunk大小为512字节

Hadoop基础-HDFS数据清理过程之校验过程代码分析

6>.我们通过打断点的方式查出来chunk的大小为512字节,这个大小意思的是每个512字节就会进行一次校验。

Hadoop基础-HDFS数据清理过程之校验过程代码分析

7>.使用“sum.calculateChunkedSums”来计算校验和,使用循环冗余校验(CRC32C),大小4个字节

Hadoop基础-HDFS数据清理过程之校验过程代码分析


四.知识点小结

1>.chunk数据块

  第一:通过断点调试估计大家也知道chunk的做作用了,它就是数据块,512字节,在上面调试代码中看到的”sum.getBytesChecksum()”的大小就是512,它的意思就是每个512字节进行依次校验;

  第二:上图调试中的”sum.caculateChunkedSums”是来计算校验和的,使用 循环冗余校验(CRC32C),占用4个字节;

2>.data数据

  数据包括两个方面,估计你也猜到了,没错,就是真实数据和校验数据。校验数据大小 = 7字节头 + 检验和个数(每512字节进行依次校验)  x 4

   不管你信不信,反转我是信了,我们举个例子,如下:

Hadoop基础-HDFS数据清理过程之校验过程代码分析

  比如上面的“blk_1073741826”大小是700字节,将其除以512字节,商为2(如果有余数的话商要加1)。那么校验大小就应该是”7 + 4 x 2 = 15″,即校验和为15字节,

 

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,086
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,561
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,410
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,183
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,820
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,903