hadoop FileSystem类和SequenceFile类实例
Hadoop的FileSystem类是与Hadoop的某一文件系统进行交互的API,虽然我们主要聚焦于HDFS实例,但还是应该集成FileSystem抽象类,并编写代码,使其在不同的文件系统中可移植,对于测试编写的程序非常重要。可以使用本地文件系统中的存储数据快速进行测试。
一、从Hadoop FileSystem读取数据
1、java.net.URL
private FileSystem fs;
/**
* 通过FsUrlStreamHandlerFactory实例调用java.net.URL对象的setURLStreamHandlerFactory方法,让java程序识别Hadoop的HDFS url
每个java虚拟机只能调用一次这个方法,因此通常在静态方法中调用。这个限制意味着如果程序的其他组件已经声明了一个setURLStreamHandlerFactory实例,你
将无法使用这种方法从hadoop中读取数据
*/
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
/**
* 读取hadoop文件系统中文件的内容(不推荐使用)
*/
@Test
public void catFiles(){
InputStream inputStream=null;
try {
//调用java.net.URL对象打开数据流
inputStream=new URL("hdfs://s100:8020/user/enmoedu/test.txt").openStream();
//调用copyBytes函数,可以在输入流和输出流之间复制数据,
//System.out输出到控制台,第三个参数是设置缓冲区大小,最后一个,设置复制结束后是否关闭数据流
IOUtils.copyBytes(inputStream, System.out, 1024,false);
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭数据流
IOUtils.closeStream(inputStream);
}
}
执行结果:
hello chengpingyijun
hello enmoedu
2、org.apache.hadoop.fs.FileSystem
/**
* 读取hadoop文件系统中文件的内容(推荐使用)
*/
@Test
public void fileSystemCat(){
String url="hdfs://s100:8020/user/enmoedu/test.txt";
Configuration configuration=new Configuration();
InputStream inputStream=null;
try {
//通过给定的URI方案和权限来确定要使用的文件系统
fs=FileSystem.get(URI.create(url),configuration);
//FileSystem实例后,调用open()来获取文件的输入流
inputStream=fs.open(new Path(url));
//调用copyBytes函数,可以在输入流和输出流之间复制数据,
//System.out输出到控制台,第三个参数是设置缓冲区大小,最后一个,设置复制结束后是否关闭数据流
IOUtils.copyBytes(inputStream, System.out, 1024,false);
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭数据流
IOUtils.closeStream(inputStream);
}
}
执行结果:
hello chengpingyijun
hello enmoedu
查看HDFS上test.txt中的内容

3、在HDFS上创建目录
在HDFS上查看在user/目录下没有test文件

/**
* 创建目录
*/
@Test
public void creatDir(){
String url="hdfs://s100:8020/user/test";
//configuration封装了HDFS客户端或者HDFS集群的配置信息,
//该方法通过给定的URI方案和权限来确定要使用的文件系统
Configuration configuration=new Configuration();
try {
//通过给定的URI方案和权限来确定要使用的文件系统
fs=FileSystem.get(URI.create(url), configuration);
fs.mkdirs(new Path(url));
System.out.println("========================");
} catch (IOException e) {
e.printStackTrace();
}
}
执行结果

4、在HDFS上删除目录
/**
* 删除目录
*/
@Test
public void deleteDir(){
String url="hdfs://s100:8020/user/test";
Configuration configuration=new Configuration();
try {
//通过给定的URI方案和权限来确定要使用的文件系统
fs=FileSystem.get(URI.create(url), configuration);
fs.delete(new Path(url));
System.out.println("========================");
} catch (IOException e) {
e.printStackTrace();
}
}
执行结果:

5、列出目录下的文件或目录名称示例
/**
* 列出目录下的文件或目录名称示例
*/
@Test
public void listFiles(){
String urls[]={"hdfs://s100:8020/user/","hdfs://s100:8020/user/test.txt"};
Configuration configuration=new Configuration();
try {
//通过给定的URI方案和权限来确定要使用的文件系统
fs=FileSystem.get(URI.create(urls[1]), configuration);
//FileStatus类中封装了文件系统中文件和目录的元数据,包括文件的长度、块大小、复本、所有者、及权限信息
FileStatus file=fs.getFileStatus(new Path(urls[1]));
//文件大小
long lenthg=file.getLen();
//块大小
long size=file.getBlockSize();
//最近修改时间
long time=file.getModificationTime();
//复本数
int n=file.getReplication();
//所有者
String owner=file.getOwner();
//权限信息
String chmod=file.getPermission().toString();
System.out.println("user目录下的方件有");
System.out.println("====================================");
//调用FileSystem中的listStatus()方法返回一个FileStatus[]数组
FileStatus[] listFiles=fs.listStatus(new Path(urls[0]));
//遍历listFiles
for (int i = 0; i < listFiles.length; i++) {
FileStatus fileStatus = listFiles[i];
System.out.println(fileStatus.getPath().toString());
}
System.out.println("user目录下的文件所具有的属性");
System.out.println("====================================");
System.out.println("文件大小是:"+lenthg);
System.out.println("块大小"+size);
System.out.println("最近修改时间:"+time);
System.out.println("复本数"+n);
System.out.println("文件所有者"+owner);
System.out.println("权限信息"+chmod);
//关闭输入流
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}

执行结果
user目录下的方件有
====================================
hdfs://s100:8020/user/enmoedu
hdfs://s100:8020/user/hao.txt
hdfs://s100:8020/user/test
hdfs://s100:8020/user/test.txt
hdfs://s100:8020/user/yao.txt
hdfs://s100:8020/user/yhj.txt
user目录下的文件所具有的属性
====================================
文件大小是:35
块大小134217728
最近修改时间:1491376577359
复本数3
文件所有者enmoedu
权限信息rw-r--r--
6、查看文件系统中文件存储的位置信息
/**
* 查看文件系统中文件存储节点的位置信息
*/
@Test
public void locationFile(){
//测试hdfs上hadoop-2.7.2.tar.gz包的位置信息,其中hadoop-2.7.2.tar.gz的大小是212046774kb约202M
String url="hdfs://s100:8020/user/enmoedu/hadoop-2.7.2.tar.gz";
//configuration封装了HDFS客户端或者HDFS集群的配置信息,
//该方法通过给定的URI方案和权限来确定要使用的文件系统
Configuration configuration=new Configuration();
try {
//通过给定的URI方案和权限来确定要使用的文件系统
fs=FileSystem.get(URI.create(url), configuration);
//FileStatus的getFileStatus()方法用于获取文件或目录的FileStatus对象
FileStatus fileStatu=fs.getFileStatus(new Path(url));
//通过getFileBlockLocations方法获取location节点信息,第一个参数FileStatus对象,第二个是起始,第三个是结束
BlockLocation [] locationMsg=fs.getFileBlockLocations(fileStatu, 0, fileStatu.getLen());
//遍历BlockLocation对象
for (int i = 0; i < locationMsg.length; i++) {
//获取主机名
String hosts[] =locationMsg[i].getHosts();
System.out.println("block_"+i+"_location:"+hosts[i]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
执行结果
block_0_location:s102
block_1_location:s105
二、Hadoop SequenceFile的读写操作
SequenceFile是HDFS API提供的一种二进制文件支持,这种二进制文件直接将<key,value>序列化到文件中。
1、通过SequenceFile向方件中写入数据
/**
* 通过SequenceFile向方件中写入内容
*/
@Test
public void wirteSequenceFile(){
String [] text={"Right Here Waiting","Oceans apart, day after day","and I slowly go insane.",
" I hear your voice on the line,","But it doesn't stop the pain. "};
String url="hdfs://s100:8020/user/testsqu";
Configuration configuration=new Configuration();
//Writer内部类用于文件的写操作,假设Key和Value都为Text类型
SequenceFile.Writer writer=null;
try {
fs=FileSystem.get(URI.create(url), configuration);
//相当于java中的int
IntWritable key=new IntWritable();
Text value=new Text();
writer=SequenceFile.createWriter(fs, configuration, new Path(url), key.getClass(), value.getClass());
for (int i = 0; i < text.length; i++) {
key.set(text.length-i);
value.set(text[i%text.length]);
//通过writer向文档中写入记录
writer.append(key, value);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeStream(writer);
} }
执行结果

2、通过SequenceFile读取文件中的类容
/**
* 读取SequenceFile中的内容
*/
@Test
public void readSequenceFile(){
String url="hdfs://s100:8020/user/testsqu";
Configuration configuration=new Configuration();
//Reader内部类用于文件的读取操作
SequenceFile.Reader reader=null;
try {
fs=FileSystem.get(URI.create(url), configuration);
reader=new SequenceFile.Reader(fs, new Path(url), configuration);
Writable key=(Writable) ReflectionUtils.newInstance(reader.getKeyClass(),configuration);
Writable value=(Writable) ReflectionUtils.newInstance(reader.getValueClass(), configuration);
long position=reader.getPosition();
while (reader.next(key, value)) {
System.out.printf("[%s]\t%s\n",key,value);
position=reader.getPosition();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeStream(reader);
}
}
执行结果
[5] Right Here Waiting
[4] Oceans apart, day after day
[3] and I slowly go insane.
[2] I hear your voice on the line,
[1] But it doesn't stop the pain.
hadoop FileSystem类和SequenceFile类实例的更多相关文章
- 【转】C#类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)
静态类 -------------------------------------------------------------------------------- 静态类就是在class关键字前 ...
- Java Class类以及获取Class实例的三种方式
T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>. publi ...
- Ruby学习: 类的定义和实例变量
ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 ...
- Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例
本文目录 1. 摘要 2. Redis配置 3. RedisHelper 4.使用实例 5. 总结 1. 摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数 ...
- python 类的定义 实例化 实例完后初始化
先来看看 类的__init__, 类的__new__ , 元类的__new__的执行顺序 class TMetaclass(type): def __new__(cls,name,bases,attr ...
- python类属性和类方法(类的结构、实例属性、静态方法)
类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...
- python 全栈开发,Day18(对象之间的交互,类命名空间与对象,实例的命名空间,类的组合用法)
一.对象之间的交互 现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人.现在我们要再创建一个狗类,狗就不能打人了,只能咬人,所以我们给狗一个bite方法.有了狗类,我们还 ...
- python的面向对象-类的数据属性和实例的数据属性相结合-无命名看你懵逼不懵逼系列
1. class Chinese: country='China' def __init__(self,name): self.name=name def play_ball(self,ball): ...
- DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例
当一个类依赖于另一个具体类的时候,这样很容易形成两者间的"强耦合"关系.我们通常根据具体类抽象出一个接口,然后让类来依赖这个接口,这样就形成了"松耦合"关系,有 ...
随机推荐
- 多线程程序设计-Thread的一些方法
run():是程序中会和会和其他线程“同时”执行的部分. wait():使得当前线程进入等待状态,等待的线程不会主动进入到线程队列中排队等待cpu资源,必须由其他线程调用notify()方法通知它 ...
- python_98_面向对象_学校
class School(object):#以后都加object(基类) def __init__(self, name, addr): self.name = name self.addr = ad ...
- x86,x64,i386,i686
x64其实就是64位, x86其实就是32位. 1. i386 适用于intel和AMD所有32位的cpu.以及via采用X86架构的32的cpu. intel平台包括8086,80286,80386 ...
- javaweb基础(8)_HttpServletResponse生成验证码
一.HttpServletResponse常见应用——生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类,
- PayPal为什么从Java迁移到Node.js 性能提高一倍 文件代码减少44%
大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal 解释了为什么从Java迁移出来的原因: 开发效率提高一倍(2 ...
- Mysql常用运算符与函数汇总
Mysql常用运算符与函数汇总 本文给大家汇总介绍了mysql中的常用的运算符以及常用函数的用法及示例,非常的全面,有需要的小伙伴可以参考下 我们先把数据表建好 use test;create tab ...
- IOS7的变化
API变化: 1.弃用 MKOverlayView 及其子类,使用类 MKOverlayRenderer: 2.弃用 Audio Toolbox framework 中的 AudioSession A ...
- iOS应用架构谈-part1概述
当我们讨论客户端应用架构的时候,我们在讨论什么? 其实市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: --------------- --------------- ------------ ...
- runtime实践之Method Swizzling
利用 Objective-C 的 Runtime 特性,我们可以给语言做扩展,帮助解决项目开发中的一些设计和技术问题.这一篇,我们来探索一些利用 Objective-C Runtime 的黑色技巧.这 ...
- javascript自定义一个迭代器
js中对象分为可迭代和不可迭代 如果是可迭代哪它就会有一个[Symbol.iterator] 函数 这个函数就是对象的迭代器函数,如用for of 如果遍历的对象没有这个迭代方法那么就会报错 for ...