Hadoop 利用FileSystem API 执行hadoop文件读写操作

简介:

 因为HDFS不同于一般的文件系统,所以Hadoop提供了强大的FileSystem API来操作HDFS.

核心类是FSDataInputStream和FSDataOutputStream

读操作:

我们用FSDataInputStream来读取HDFS中的指定文件(第一个实验),另外我们还演示了这个类的定位文件位置的能力,然后从指定位置开始读取文件(第二个实验)。

代码如下:


  
  
  1. /*  
  2.  */ 
  3. package com.charles.hadoop.fs; 
  4.  
  5.  
  6. import java.net.URI; 
  7.  
  8. import org.apache.hadoop.conf.Configuration; 
  9. import org.apache.hadoop.fs.FSDataInputStream; 
  10. import org.apache.hadoop.fs.FileSystem; 
  11. import org.apache.hadoop.fs.Path; 
  12. import org.apache.hadoop.io.IOUtils; 
  13.  
  14. /** 
  15.  * 
  16.  * Description: 查看Hadoop文件系统中的文件,利用hadoop FileSystem接口中的FSDataInputStream 
  17.  * FSDataInputStream还具有流定位的能力,可以从文件的任意位置开始读取 
  18.  * 
  19.  * @author charles.wang 
  20.  * @created May 26, 2012 12:28:49 PM 
  21.  *  
  22.  */ 
  23. public class ReadFromHadoopFileSystem { 
  24.  
  25.     /** 
  26.      * @param args 
  27.      */ 
  28.     public static void main(String[] args) throws Exception{ 
  29.         // TODO Auto-generated method stub 
  30.          
  31.         //第一个参数传递进来的是hadoop文件系统中的某个文件的URI,以hdfs://ip 的theme开头 
  32.         String uri = args[0]; 
  33.         //读取hadoop文件系统的配置 
  34.         Configuration conf = new Configuration(); 
  35.         conf.set("hadoop.job.ugi""hadoop-user,hadoop-user"); 
  36.          
  37.         //FileSystem是用户操作HDFS的核心类,它获得URI对应的HDFS文件系统 
  38.         FileSystem fs = FileSystem.get(URI.create(uri),conf); 
  39.         FSDataInputStream in = null
  40.         try
  41.             //实验一:输出全部文件内容 
  42.             System.out.println("实验一:输出全部文件内容"); 
  43.             //让FileSystem打开一个uri对应的FSDataInputStream文件输入流,读取这个文件 
  44.             in = fs.open( new Path(uri) ); 
  45.             //用Hadoop的IOUtils工具方法来让这个文件的指定字节复制到标准输出流上 
  46.             IOUtils.copyBytes(in, System.out,50,false);   
  47.             System.out.println(); 
  48.              
  49.              
  50.             //实验二:展示FSDataInputStream文件输入流的流定位能力,用seek进行定位 
  51.             System.out.println("实验二:展示FSDataInputStream文件输入流的流定位能力,用seek进行定位"); 
  52.              
  53.             //假如我们要吧文件输出3次 
  54.             //第一次输入全部内容,第二次输入从第20个字符开始的内容,第3次输出从第40个字符开始的内容 
  55.             for (int i=1;i<=3;i++){ 
  56.                 in.seek(0+20*(i-1)); 
  57.                 System.out.println("流定位第 "+i+" 次:" ); 
  58.                 IOUtils.copyBytes(in, System.out,4096,false);  
  59.             } 
  60.         }finally
  61.             IOUtils.closeStream(in); 
  62.         } 
  63.  
  64.     } 
  65.  

我们传入的命令行参数为我们要读的HDFS文件系统中某文件的URI:


  
  
  1. hdfs://192.168.129.35:9000/user/hadoop-user/textfile.txt 

最终输出结果为:


  
  
  1. 实验一:输出全部文件内容 
  2. This is a text file edited by charles to test the hadoop distributed file system's features. 
  3.  
  4. 实验二:展示FSDataInputStream文件输入流的流定位能力,用seek进行定位 
  5. 流定位第 1 次: 
  6. This is a text file edited by charles to test the hadoop distributed file system's features. 
  7. 流定位第 2 次: 
  8. edited by charles to test the hadoop distributed file system's features. 
  9. 流定位第 3 次: 

 

 

写操作:

我们用FSDataOutputStream来写文件到HDFS系统中,或者说从本地文件系统中复制文件到HDFS文件系统中。其中这个本地文件系统是相对于运行这段java代码的宿主系统。

代码如下:


  
  
  1. /*  
  2.  */ 
  3. package com.charles.hadoop.fs; 
  4.  
  5. import java.io.BufferedInputStream; 
  6. import java.io.FileInputStream; 
  7. import java.io.InputStream; 
  8. import java.io.OutputStream; 
  9. import java.net.URI; 
  10.  
  11. import org.apache.hadoop.conf.Configuration; 
  12. import org.apache.hadoop.fs.FileSystem; 
  13. import org.apache.hadoop.fs.Path; 
  14. import org.apache.hadoop.io.IOUtils; 
  15. import org.apache.hadoop.util.Progressable; 
  16.  
  17. /** 
  18.  * 
  19.  * Description: 这个类展示如何将一个文件从本地文件系统复制到 HDFS 
  20.  * 
  21.  * @author charles.wang 
  22.  * @created May 26, 2012 1:00:39 PM 
  23.  *  
  24.  */ 
  25. public class WriteToHadoopFileSystem { 
  26.  
  27.     /** 
  28.      * @param args 
  29.      */ 
  30.     public static void main(String[] args)throws Exception{ 
  31.         // TODO Auto-generated method stub 
  32.          
  33.         //两个参数分别是本地文件系统的的输入文件路径和HDFS中的输出文件位置 
  34.         //如果这段代码最终运行在Hadoop所在的服务器上,那么本地文件系统是相对于那台服务器的本地文件系统 
  35.         //如果这段代码运行在我们Windows PC上,那么本地文件系统是这台Window PC的文件系统 
  36.         String localSrc = args[0]; 
  37.         String dst= args[1]; 
  38.          
  39.         //因为本地文件系统是基于java.io包的,所以我们创建一个本地文件输入流 
  40.         InputStream in = new BufferedInputStream( new FileInputStream(localSrc)); 
  41.          
  42.         //读取hadoop文件系统的配置 
  43.         Configuration conf = new Configuration(); 
  44.         conf.set("hadoop.job.ugi""hadoop-user,hadoop-user"); 
  45.          
  46.          
  47.         //仍然用FileSystem和HDFS打交道 
  48.         //获得一个对应HDFS目标文件的文件系统
  49.         FileSystem fs = FileSystem.get(URI.create(dst), conf); 
  50.         //创建一个指向HDFS目标文件的输出流 
  51.         OutputStream out = fs.create(new Path(dst) ); 
  52.         //用IOUtils工具将文件从本地文件系统复制到HDFS目标文件中 
  53.         IOUtils.copyBytes(in, out, 4096,true); 
  54.          
  55.         System.out.println("复制完成"); 
  56.          
  57.     } 
  58.  

我们传入2个命令行参数,一个是本地文件系统中被复制的文件路径,第二个要复制到的HDFS文件系统中的目标文件路径:


  
  
  1. copyMe.txt
  2. hdfs://192.168.129.35:9000/user/hadoop-user/copyMe.txt

我们去文件系统中去检查文件,果然文件被复制上去了:

打开这个目标文件,果然内容与预期一样:





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/878921,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
2月前
|
存储 JavaScript 前端开发
Blazor 调用 Clipboard API 读写剪贴板数据
【10月更文挑战第14天】Blazor 是一个使用 .NET 和 C# 构建交互式 Web UI 的框架。由于浏览器安全策略,直接访问某些原生 API(如 Clipboard API)受限。通过 JavaScript 互操作性(JS Interop),可在 Blazor 中调用这些 API。首先在 HTML 定义 JavaScript 函数,再通过 `IJSRuntime` 调用。此外,需注意不同浏览器对 Clipboard API 的支持程度及用户隐私授权问题。
|
2月前
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(二)
49 3
|
2月前
|
分布式计算 Java Hadoop
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示(一)
47 2
|
2月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
43 1
|
2月前
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
56 1
|
3月前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
3月前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
4月前
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
122 1
|
5月前
|
分布式计算 Hadoop Java
Hadoop编辑hadoop-env.sh文件
【7月更文挑战第19天】
362 5