文档章节

Hadoop 2.6.5 FileSystem和Configuration两个对象的探究

goldbin
 goldbin
发布于 2017/07/10 14:33
字数 1444
阅读 4
收藏 0

Hadoop 2.6.5 FileSystem和Configuration两个对象的探究

 

本文章由尚学堂旗下云数学院周老师做内容指导,梅同学编辑发布,如需转载,请标明出处。

QQ技术交流群:299142667

 

 (结论)

通过尚学堂旗下云数学院大数据周老师的讲解可以得到以下结论:用相同的地址获取的FileSystem对象是同一个; 第一次获取对象后会有类似于缓存的机制, 即使改变了configuration参数, 只要地址没有发生变化, 获取的FileSystem 对象不会改变.

[从bug开始]

在测试上传数据到HDFS集群时, 想更改blocksize的大小来测试小文件分块的情况, 使用了如下代码(为了便于阅读, 删去了JUNIT的注解):

 

Configuration conf = null;

FileSystem fs = null;

//初始化fs对象

conf = new Configuration(true);

fs = FileSystem.get(conf);

//更改blocksize大小

conf.set("dfs.blocksize", "1048576");

fs = FileSystem.get(conf);

//上传文件

Path srcPath = new Path("d:\\testup.txt");

Path dstPath = new Path("/user/root/test03.txt");

fs.copyFromLocalFile(srcPath, dstPath);

 

从结果来看, 生成的文件大小并没有改变:

那我们重新定义一个FileSystem来尝试一下:

于是接着上段代码, 有了如下代码:

 

//初始化fs2对象

Configuration conf2 = new Configuration(true);

conf2.set("dfs.blocksize", "1048576");

FileSystem fs2 = FileSystem.get(conf2);

//上传文件

Path dstPath2 = new Path("/user/root/test04.txt");

fs2.copyFromLocalFile(srcPath, dstPath2);

 

 

 

然而结果并不乐观:

 

此时其他的小伙伴@2元店主 已经完成了测试, 上传文件成功, 并且设置分块大小也没有问题, 他的代码如下:

//初始化fs对象

Path srcPath = new Path("d:\\testup.txt");

Path dstPath = new Path("/user/root/test07.txt");

Configuration confnew = new Configuration(true);

confnew.set("dfs.blocksize", "1048576");

FileSystem fsnew = FileSystem.get(confnew);

//上传文件

fsnew.copyFromLocalFile(srcPath, dstPath);

 

对比可以发现, 其中的核心代码并没有什么差异, 那么是什么问题引起的blocksize改变不成功呢?

经过尚学堂同班同学的大力协助, 我们确定了差异点, 在我的测试代码中, 先从配置(conf)生成过了一次FileSystem对象, 更改的blocksize后再次生成FileSystem对象. 可能是这个过程出现了问题.

如果是这个问题, 那么我的第二次测试的代码也失效根本说不过去, 因为我是全新的对象, 与之前对象并无关联.

到了这里, 我们对bug的产生有了一些思路.

 

[进一步测试]

为了明确具体的问题所在, 有了如下代码:

因为下面的代码长得我都不想仔细读, 所以在这里说一下大概思路:

测试代码两两一组, 每组获取FileSystem对象用的地址是相同的;

第一组读取本地配置文件, 先生成FileSystem对象后更改blocksize配置, 再次生成FileSystem对象

第二组不读取本地配置文件, 地址是node01, 先更改blocksize为1M, 生成FileSystem对象, 改变blocksize为128M, 再次生成FileSystem对象

第三组不读取本地配置文件, 地址是192.168的具体地址, 先更改blocksize为128M, 生成FileSystem对象, 改变blocksize为1M, 再次生成FileSystem对象

最后, 输出所有的FileSystem对象toString方法

 

//第一组

Configuration confa = new Configuration(true);

FileSystem fsa = FileSystem.get(confa);

confa.set("dfs.blocksize", "1048576");

fsa = FileSystem.get(confa);

System.out.println(fsa.getDefaultBlockSize());



Configuration confb = new Configuration(true);

confb.set("dfs.blocksize", "1048576");

FileSystem fsb = FileSystem.get(confb);

System.out.println(fsb.getDefaultBlockSize());

 

 

 

//第二组

Configuration confc = new Configuration(false);

confc.set("fs.defaultFS", "hdfs://node01:8020");

confc.set("dfs.blocksize", "1048576");

FileSystem fsc = FileSystem.get(confc);

System.out.println(fsc.getDefaultBlockSize());



Configuration confd = new Configuration(false);

confd.set("fs.defaultFS", "hdfs://node01:8020");

confd.set("dfs.blocksize", "134217728");

FileSystem fsd = FileSystem.get(confd);

System.out.println(fsd.getDefaultBlockSize());

 

//第三组

Configuration confe = new Configuration(false);

confe.set("fs.defaultFS", "hdfs://192.168.109.51:8020");

confe.set("dfs.blocksize", "134217728");

FileSystem fse = FileSystem.get(confe);

System.out.println(fse.getDefaultBlockSize());



Configuration conff = new Configuration(false);

conff.set("fs.defaultFS", "hdfs://192.168.109.51:8020");

conff.set("dfs.blocksize", "1048576");

FileSystem fsf = FileSystem.get(conff);

System.out.println(fsf.getDefaultBlockSize());

 

//输出

System.out.println(fsa);

System.out.println(fsb);

System.out.println(fsc);

System.out.println(fsd);

System.out.println(fse);

System.out.println(fsf);

 

这次测试获得了预期的结果:

 

134217728

134217728

1048576

1048576

134217728

134217728

DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_1193042798_1, ugi=root (auth:SIMPLE)]]

DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_1193042798_1, ugi=root (auth:SIMPLE)]]

DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_-1041604824_1, ugi=root (auth:SIMPLE)]]

DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_-1041604824_1, ugi=root (auth:SIMPLE)]]

DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_-1719045568_1, ugi=root (auth:SIMPLE)]]

DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_-1719045568_1, ugi=root (auth:SIMPLE)]]

 

从FileSystem对象的id可以看出, 相同地址获取的对象确实是同一对象, 至此, bug的产生已经可以解释的清楚了

 

[解决bug后的思考]

从最后的测试的结果可以看出, 源码的实现中有缓存处理, 当已经连接过一次之后, 再次获取FileSystem对象时并不会读取configuration中的参数, 只是根据地址与对象, 从类似于kv对的关系返回真实的FileSystem对象. 

 

在debug模式运行代码会发现, 第一次根据配置生成FileSystem对象时有大约10s的延时, 这应该是服务器通讯造成的, 因为服务器通讯的时间成本太高, 所以才会采取这种缓存的方式返回对象.

 

一般使用中并不会对配置参数做调整, 因此这种实现方式不能说有问题, 但是如果需要临时更改配置参数时, 则需对这个问题小心一些.

 

最后, 感谢 尚学堂周老师,在这次解决bug时提供的帮助与思路.

 

如需下载代码和hadoop安装文件下载:

http://www.yunshuxueyuan.com/

 

本文章由尚学堂旗下云数学院周老师做内容指导,梅同学编辑发布,如需转载,请标明出处。

QQ技术交流群:299142667

© 著作权归作者所有

goldbin
粉丝 0
博文 13
码字总数 26896
作品 0
海淀
CTO(技术副总裁)
私信 提问
【hadoop】9.HDFS-客户端操作

简介 通过本章节您可以学习到 hadoop基本开发环境的搭建 hadoop常用操作的客户端操作实现。 1、环境准备 1.1、hadoop jar包安置 1、将hadoop2.7.2.tar.gz解压到指定目录,例如 hadoop2.7.2....

Areya
01/12
83
0
阿里云ECS构建大数据平台实践-基于Apache Hadoop

0. 项目背景 基于阿里云ECS云服务器进行搭建私有的大数据平台,采用Apache Hadoop生态,为大数据提供存储及处理。 1. 购买ECS云服务器实例 在这里,因为实验需要3个节点,所以我们购买3台ECS...

叶康铭
01/09
0
0
HDFS + WEB 项目 报java.lang.VerifyError... 异常

今天在用web项目整合 HDFS 的时候发生了非常诡异的事情。我将java项目的HDFS功能整合至 web项目的时候创建FileSystem对象就报Exception in thread "main" java.lang.VerifyError: (class: c...

霖_柒
2015/12/08
549
0
hadoop java操作hdfs

hfds 是一种文件系统,用于存储hadoop将要处理的数据。适用于大规模分布式数据处理,是一个可扩展行的文件分布式系统; 优点 1、如果出现节点宕机,hdfs,可以持续监视,错误检查,容错处理,...

萧然
2013/08/12
6.6K
0
Hadoop中一些Java Api操作(23)

Hadoop基本文件系统操作: 1.首先从本地文件系统将一个文件复制到HDFS: hadoop fs-copyFromLocal input/docs/quangle.txthdfs://localhost/user/tom/quangle.txt 把文件复制回本地文件系统,...

肖鋭
2014/03/12
494
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部