Hadoop的FileSystem类是与Hadoop的某一文件系统进行交互的API,虽然我们主要聚焦于HDFS实例,但还是应该集成FileSystem抽象类,并编写代码,使其在不同的文件系统中可移植,对于测试编写的程序非常重要。可以使用本地文件系统中的存储数据快速进行测试。

一、从Hadoop FileSystem读取数据

1、java.net.URL

  1. private FileSystem fs;
  2. /**
  3. * 通过FsUrlStreamHandlerFactory实例调用java.net.URL对象的setURLStreamHandlerFactory方法,让java程序识别Hadoop的HDFS url
  4. 每个java虚拟机只能调用一次这个方法,因此通常在静态方法中调用。这个限制意味着如果程序的其他组件已经声明了一个setURLStreamHandlerFactory实例,你
  5. 将无法使用这种方法从hadoop中读取数据
  6. */
  7. static {
  8. URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
  9. }
  10. /**
  11. * 读取hadoop文件系统中文件的内容(不推荐使用)
  12. */
  13. @Test
  14. public void catFiles(){
  15. InputStream inputStream=null;
  16. try {
  17. //调用java.net.URL对象打开数据流
  18. inputStream=new URL("hdfs://s100:8020/user/enmoedu/test.txt").openStream();
  19. //调用copyBytes函数,可以在输入流和输出流之间复制数据,
  20. //System.out输出到控制台,第三个参数是设置缓冲区大小,最后一个,设置复制结束后是否关闭数据流
  21. IOUtils.copyBytes(inputStream, System.out, 1024,false);
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }finally{
  25. //关闭数据流
  26. IOUtils.closeStream(inputStream);
  27. }
  28. }

执行结果:

  1. hello chengpingyijun
  2. hello enmoedu

2、org.apache.hadoop.fs.FileSystem

  1. /**
  2. * 读取hadoop文件系统中文件的内容(推荐使用)
  3. */
  4. @Test
  5. public void fileSystemCat(){
  6. String url="hdfs://s100:8020/user/enmoedu/test.txt";
  7. Configuration configuration=new Configuration();
  8. InputStream inputStream=null;
  9. try {
  10. //通过给定的URI方案和权限来确定要使用的文件系统
  11. fs=FileSystem.get(URI.create(url),configuration);
  12. //FileSystem实例后,调用open()来获取文件的输入流
  13. inputStream=fs.open(new Path(url));
  14. //调用copyBytes函数,可以在输入流和输出流之间复制数据,
  15. //System.out输出到控制台,第三个参数是设置缓冲区大小,最后一个,设置复制结束后是否关闭数据流
  16. IOUtils.copyBytes(inputStream, System.out, 1024,false);
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }finally {
  20. //关闭数据流
  21. IOUtils.closeStream(inputStream);
  22. }
  23. }

执行结果:

  1. hello chengpingyijun
  2. hello enmoedu

查看HDFS上test.txt中的内容

3、在HDFS上创建目录

在HDFS上查看在user/目录下没有test文件

  1. /**
  2. * 创建目录
  3. */
  4. @Test
  5. public void creatDir(){
  6. String url="hdfs://s100:8020/user/test";
  7. //configuration封装了HDFS客户端或者HDFS集群的配置信息,
  8. //该方法通过给定的URI方案和权限来确定要使用的文件系统
  9. Configuration configuration=new Configuration();
  10. try {
  11. //通过给定的URI方案和权限来确定要使用的文件系统
  12. fs=FileSystem.get(URI.create(url), configuration);
  13. fs.mkdirs(new Path(url));
  14. System.out.println("========================");
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }

执行结果

4、在HDFS上删除目录

  1. /**
  2. * 删除目录
  3. */
  4. @Test
  5. public void deleteDir(){
  6. String url="hdfs://s100:8020/user/test";
  7. Configuration configuration=new Configuration();
  8. try {
  9. //通过给定的URI方案和权限来确定要使用的文件系统
  10. fs=FileSystem.get(URI.create(url), configuration);
  11. fs.delete(new Path(url));
  12. System.out.println("========================");
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }

执行结果:

5、列出目录下的文件或目录名称示例

  1. /**
  2. * 列出目录下的文件或目录名称示例
  3. */
  4. @Test
  5. public void listFiles(){
  6. String urls[]={"hdfs://s100:8020/user/","hdfs://s100:8020/user/test.txt"};
  7. Configuration configuration=new Configuration();
  8. try {
  9. //通过给定的URI方案和权限来确定要使用的文件系统
  10. fs=FileSystem.get(URI.create(urls[1]), configuration);
  11. //FileStatus类中封装了文件系统中文件和目录的元数据,包括文件的长度、块大小、复本、所有者、及权限信息
  12. FileStatus file=fs.getFileStatus(new Path(urls[1]));
  13. //文件大小
  14. long lenthg=file.getLen();
  15. //块大小
  16. long size=file.getBlockSize();
  17. //最近修改时间
  18. long time=file.getModificationTime();
  19. //复本数
  20. int n=file.getReplication();
  21. //所有者
  22. String owner=file.getOwner();
  23. //权限信息
  24. String chmod=file.getPermission().toString();
  25. System.out.println("user目录下的方件有");
  26. System.out.println("====================================");
  27. //调用FileSystem中的listStatus()方法返回一个FileStatus[]数组
  28. FileStatus[] listFiles=fs.listStatus(new Path(urls[0]));
  29. //遍历listFiles
  30. for (int i = 0; i < listFiles.length; i++) {
  31. FileStatus fileStatus = listFiles[i];
  32. System.out.println(fileStatus.getPath().toString());
  33. }
  34. System.out.println("user目录下的文件所具有的属性");
  35. System.out.println("====================================");
  36. System.out.println("文件大小是:"+lenthg);
  37. System.out.println("块大小"+size);
  38. System.out.println("最近修改时间:"+time);
  39. System.out.println("复本数"+n);
  40. System.out.println("文件所有者"+owner);
  41. System.out.println("权限信息"+chmod);
  42. //关闭输入流
  43. fs.close();
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. }
  47. }

执行结果

  1. user目录下的方件有
  2. ====================================
  3. hdfs://s100:8020/user/enmoedu
  4. hdfs://s100:8020/user/hao.txt
  5. hdfs://s100:8020/user/test
  6. hdfs://s100:8020/user/test.txt
  7. hdfs://s100:8020/user/yao.txt
  8. hdfs://s100:8020/user/yhj.txt
  9. user目录下的文件所具有的属性
  10. ====================================
  11. 文件大小是:35
  12. 块大小134217728
  13. 最近修改时间:1491376577359
  14. 复本数3
  15. 文件所有者enmoedu
  16. 权限信息rw-r--r--

6、查看文件系统中文件存储的位置信息

  1. /**
  2. * 查看文件系统中文件存储节点的位置信息
  3. */
  4. @Test
  5. public void locationFile(){
  6. //测试hdfs上hadoop-2.7.2.tar.gz包的位置信息,其中hadoop-2.7.2.tar.gz的大小是212046774kb约202M
  7. String url="hdfs://s100:8020/user/enmoedu/hadoop-2.7.2.tar.gz";
  8. //configuration封装了HDFS客户端或者HDFS集群的配置信息,
  9. //该方法通过给定的URI方案和权限来确定要使用的文件系统
  10. Configuration configuration=new Configuration();
  11. try {
  12. //通过给定的URI方案和权限来确定要使用的文件系统
  13. fs=FileSystem.get(URI.create(url), configuration);
  14. //FileStatus的getFileStatus()方法用于获取文件或目录的FileStatus对象
  15. FileStatus fileStatu=fs.getFileStatus(new Path(url));
  16. //通过getFileBlockLocations方法获取location节点信息,第一个参数FileStatus对象,第二个是起始,第三个是结束
  17. BlockLocation [] locationMsg=fs.getFileBlockLocations(fileStatu, 0, fileStatu.getLen());
  18. //遍历BlockLocation对象
  19. for (int i = 0; i < locationMsg.length; i++) {
  20. //获取主机名
  21. String hosts[] =locationMsg[i].getHosts();
  22. System.out.println("block_"+i+"_location:"+hosts[i]);
  23. }
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }

执行结果

  1. block_0_location:s102
  2. block_1_location:s105

二、Hadoop SequenceFile的读写操作

SequenceFile是HDFS API提供的一种二进制文件支持,这种二进制文件直接将<key,value>序列化到文件中。

1、通过SequenceFile向方件中写入数据

  1. /**
  2. * 通过SequenceFile向方件中写入内容
  3. */
  4. @Test
  5. public void wirteSequenceFile(){
  6. String [] text={"Right Here Waiting","Oceans apart, day after day","and I slowly go insane.",
  7. " I hear your voice on the line,","But it doesn't stop the pain. "};
  8. String url="hdfs://s100:8020/user/testsqu";
  9. Configuration configuration=new Configuration();
  10. //Writer内部类用于文件的写操作,假设Key和Value都为Text类型
  11. SequenceFile.Writer writer=null;
  12. try {
  13. fs=FileSystem.get(URI.create(url), configuration);
  14. //相当于java中的int
  15. IntWritable key=new IntWritable();
  16. Text value=new Text();
  17. writer=SequenceFile.createWriter(fs, configuration, new Path(url), key.getClass(), value.getClass());
  18. for (int i = 0; i < text.length; i++) {
  19. key.set(text.length-i);
  20. value.set(text[i%text.length]);
  21. //通过writer向文档中写入记录
  22. writer.append(key, value);
  23. }
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }finally {
  27. IOUtils.closeStream(writer);
  28. }
  29.  
  30. }

执行结果

2、通过SequenceFile读取文件中的类容

  1. /**
  2. * 读取SequenceFile中的内容
  3. */
  4. @Test
  5. public void readSequenceFile(){
  6. String url="hdfs://s100:8020/user/testsqu";
  7. Configuration configuration=new Configuration();
  8. //Reader内部类用于文件的读取操作
  9. SequenceFile.Reader reader=null;
  10. try {
  11. fs=FileSystem.get(URI.create(url), configuration);
  12. reader=new SequenceFile.Reader(fs, new Path(url), configuration);
  13. Writable key=(Writable) ReflectionUtils.newInstance(reader.getKeyClass(),configuration);
  14. Writable value=(Writable) ReflectionUtils.newInstance(reader.getValueClass(), configuration);
  15. long position=reader.getPosition();
  16. while (reader.next(key, value)) {
  17. System.out.printf("[%s]\t%s\n",key,value);
  18. position=reader.getPosition();
  19. }
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }finally {
  23. IOUtils.closeStream(reader);
  24. }
  25. }

执行结果

  1. [5] Right Here Waiting
  2. [4] Oceans apart, day after day
  3. [3] and I slowly go insane.
  4. [2]  I hear your voice on the line,
  5. [1] But it doesn't stop the pain.

hadoop FileSystem类和SequenceFile类实例的更多相关文章

  1. 【转】C#类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)

    静态类 -------------------------------------------------------------------------------- 静态类就是在class关键字前 ...

  2. Java Class类以及获取Class实例的三种方式

    T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>.   publi ...

  3. Ruby学习: 类的定义和实例变量

    ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 ...

  4. Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例

    本文目录 1. 摘要 2. Redis配置 3. RedisHelper 4.使用实例 5. 总结 1.  摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数 ...

  5. python 类的定义 实例化 实例完后初始化

    先来看看 类的__init__, 类的__new__ , 元类的__new__的执行顺序 class TMetaclass(type): def __new__(cls,name,bases,attr ...

  6. python类属性和类方法(类的结构、实例属性、静态方法)

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  7. python 全栈开发,Day18(对象之间的交互,类命名空间与对象,实例的命名空间,类的组合用法)

    一.对象之间的交互 现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人.现在我们要再创建一个狗类,狗就不能打人了,只能咬人,所以我们给狗一个bite方法.有了狗类,我们还 ...

  8. python的面向对象-类的数据属性和实例的数据属性相结合-无命名看你懵逼不懵逼系列

    1. class Chinese: country='China' def __init__(self,name): self.name=name def play_ball(self,ball): ...

  9. DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例

    当一个类依赖于另一个具体类的时候,这样很容易形成两者间的"强耦合"关系.我们通常根据具体类抽象出一个接口,然后让类来依赖这个接口,这样就形成了"松耦合"关系,有 ...

随机推荐

  1. python爬虫之路——基本文件操作

    介绍python如何打开文件和读取数据 新建TXT文档,为追加模式: f=open('c;/wendang/demo.txt','a+') content="abcdefg123456789 ...

  2. MovieReview—NINE LIVES(九条命)

    Struggle & Family         A successful middle-aged man in the movie became a cat by falling from ...

  3. js各运算符的执行顺序

    本文原链接:https://www.sojson.com/operation/javascript.html https://www.jianshu.com/p/d569c6ca1060 JavaSc ...

  4. CPP-网络/通信:gsoap 的教程和使用

    1.1.1     gSOAP 1.1.1 .1      简介 gSOAP 编译工具提供了一个 SOAP/XML 关于 C/C++ 语言的实现,从而让 C/C++ 语言研发 web 服务或客户端程式 ...

  5. 爬虫遇到HTTP Error 403的问题

    # coding=gbk from bs4 import BeautifulSoup import requests import urllib x = 1 y = 1 def crawl(url): ...

  6. setTimeout,clearTimeout的一些好用法

    if(hidden != 1){ $.ui.showMask(); var _aaa = setTimeout(function(){ $.ui.hideMask(); },5000); } //be ...

  7. Java制作桌面弹球下载版 使用如鹏游戏引擎制作 包含2个精灵球同时弹动

    package com.swift; import com.rupeng.game.GameCore; public class DesktopBouncingBall implements Runn ...

  8. 【思维题 欧拉图】loj#10106. 单词游戏

    巧妙的模型转化 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词.你需要给这些盘子安排一个合适的顺序,使得相邻两个盘子 ...

  9. vue 项目白屏解决方案

    在做的项目是使用 vue-cli 脚手架为基础的,只能使用微信浏览器打开的.在某次更新功能代码后,被反馈在一些手机上会出现白屏.经过一番探索,多管齐下解决了问题 白屏可能的原因: es6 代码没有被编 ...

  10. 【android】安卓平台版本和API版本的对应关系

    安卓平台版本和API版本对应关系