`
qindongliang1922
  • 浏览: 2188417 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117659
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126065
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60013
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71396
社区版块
存档分类
最新评论

如何使用Java API读写HDFS

阅读更多
HDFS是Hadoop生态系统的根基,也是Hadoop生态系统中的重要一员,大部分时候,我们都会使用Linux shell命令来管理HDFS,包括一些文件的创建,删除,修改,上传等等,因为使用shell命令操作HDFS的方式,相对比较简单,方便,但是有时候,我们也需要通过编程的方式来实现对文件系统的管理。


比如有如下的一个小需求,要求我们实现读取HDFS某个文件夹下所有日志,经过加工处理后在写入到HDFS上,或者存进Hbase里,或者存进其他一些存储系统。这时候使用shell的方式就有点麻烦了,所以这时候我们就可以使用编程的方式来完成这件事了,当然散仙在这里使用的是原生的Java语言的方式,其他的一些语言例如C++,PHP,Python都可以实现,散仙在这里不给出演示了,(其实散仙也不会那些语言,除了刚入门的Python)


下面,散仙给出代码,以供参考:

package com.java.api.hdfs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;


/**
 * @author 三劫散仙
 * Java API操作HDFS
 * 工具类
 * 
 * **/
public class OperaHDFS {
	
	
	public static void main(String[] args)throws Exception {
		
		//System.out.println("aaa");
	//	uploadFile();
		//createFileOnHDFS();
		//deleteFileOnHDFS();
		//createDirectoryOnHDFS();
		//deleteDirectoryOnHDFS();
	//	renameFileOrDirectoryOnHDFS();
		//downloadFileorDirectoryOnHDFS();
		readHDFSListAll();
	}
	
	
	
	
	/***
	 * 加载配置文件
	 * **/
	 static Configuration conf=new Configuration();
	 
	 
	 
	 /**
	  * 重名名一个文件夹或者文件
	  * 
	  * **/
	 public static void renameFileOrDirectoryOnHDFS()throws Exception{
		 
			FileSystem fs=FileSystem.get(conf);
		    Path p1 =new Path("hdfs://10.2.143.5:9090/root/myfile/my.txt");
		    Path p2 =new Path("hdfs://10.2.143.5:9090/root/myfile/my2.txt");
			fs.rename(p1, p2);
			
			fs.close();//释放资源
			System.out.println("重命名文件夹或文件成功.....");
		 
	 }
	 
	 
	 /***
	  *  
	  * 读取HDFS某个文件夹的所有
	  * 文件,并打印
	  * 
	  * **/
	    public static void readHDFSListAll() throws Exception{
	    
	 //流读入和写入
	    	InputStream in=null;
	    	//获取HDFS的conf
	      //读取HDFS上的文件系统
	        FileSystem hdfs=FileSystem.get(conf);
	      //使用缓冲流,进行按行读取的功能
	        BufferedReader buff=null;
	      //获取日志文件的根目录
	        Path listf =new Path("hdfs://10.2.143.5:9090/root/myfile/");
	      //获取根目录下的所有2级子文件目录
	        FileStatus stats[]=hdfs.listStatus(listf);
	      //自定义j,方便查看插入信息
	        int j=0;
	         for(int i = 0; i < stats.length; i++){
	        	//获取子目录下的文件路径
	        	FileStatus   temp[]=hdfs.listStatus(new Path(stats[i].getPath().toString()));
	        	  for(int k = 0; k < temp.length;k++){
	        		  System.out.println("文件路径名:"+temp[k].getPath().toString());
	        	//获取Path
	        	Path p=new Path(temp[k].getPath().toString());
	        	//打开文件流
	        	 in=hdfs.open(p);
	        	 //BufferedReader包装一个流
	        	   buff=new BufferedReader(new InputStreamReader(in));	       	 
	        	 String str=null;
	             while((str=buff.readLine())!=null){
	            	 
	            	 System.out.println(str);
	             }
	                buff.close();
	                in.close();
	        	 
 
	        	 }
	        	 
	        	
	        	 
 
	        	  }
	        	 
	         hdfs.close();
	     

	    }
	 /**
	  * 从HDFS上下载文件或文件夹到本地
	  * 
	  * **/
	 public static void downloadFileorDirectoryOnHDFS()throws Exception{
		 
			FileSystem fs=FileSystem.get(conf);
		    Path p1 =new Path("hdfs://10.2.143.5:9090/root/myfile//my2.txt");
		    Path p2 =new Path("D://7");
			fs.copyToLocalFile(p1, p2);
			fs.close();//释放资源
			System.out.println("下载文件夹或文件成功.....");
		 
	 }
	 /**
	  * 在HDFS上创建一个文件夹
	  * 
	  * **/
	 public static void createDirectoryOnHDFS()throws Exception{
		 
			FileSystem fs=FileSystem.get(conf);
		    Path p =new Path("hdfs://10.2.143.5:9090/root/myfile");
			fs.mkdirs(p);
			fs.close();//释放资源
			System.out.println("创建文件夹成功.....");
		 
	 }
	 
	 /**
	  * 在HDFS上删除一个文件夹
	  * 
	  * **/
	 public static void deleteDirectoryOnHDFS()throws Exception{
		 
			FileSystem fs=FileSystem.get(conf);
		    Path p =new Path("hdfs://10.2.143.5:9090/root/myfile");
			fs.deleteOnExit(p);
			fs.close();//释放资源
			System.out.println("删除文件夹成功.....");
		 
	 }
	 /**
	  * 在HDFS上创建一个文件
	  * 
	  * **/
	 public static void createFileOnHDFS()throws Exception{
		 
			FileSystem fs=FileSystem.get(conf);
		    Path p =new Path("hdfs://10.2.143.5:9090/root/abc.txt");
			fs.createNewFile(p);
			//fs.create(p);
			fs.close();//释放资源
			System.out.println("创建文件成功.....");
		 
	 }
	 
	 /**
	  * 在HDFS上删除一个文件
	  * 
	  * **/
	 public static void deleteFileOnHDFS()throws Exception{
		 
			FileSystem fs=FileSystem.get(conf);
		    Path p =new Path("hdfs://10.2.143.5:9090/root/abc.txt");
			fs.deleteOnExit(p);
			fs.close();//释放资源
			System.out.println("删除成功.....");
		 
	 }
	 
	 
	/***
	 * 上传本地文件到
	 * HDFS上
	 * 
	 * **/
	public static void uploadFile()throws Exception{
		//加载默认配置
		FileSystem fs=FileSystem.get(conf);
		  //本地文件
        Path src =new Path("D:\\6");
        //HDFS为止
        Path dst =new Path("hdfs://10.2.143.5:9090/root/");
        try {
			fs.copyFromLocalFile(src, dst);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        System.out.println("上传成功........");
   
        fs.close();//释放资源
 
		
	}

}




散仙用的是Hadoop1.2的版本,采用hadoop的eclipse插件在eclipse下编写调试的,下面给出截图:

下面给出一个读取某个文件夹下的所有的文件并打印内容的截图:






其实,java操作HDFS还是比较简单的,只要熟悉java IO的一些操作就可以了。

 
                        如有不到位的地方,欢迎指正!

  • 大小: 17.1 KB
  • 大小: 104.6 KB
1
0
分享到:
评论
4 楼 qindongliang1922 2014-02-18  
hpuyancy 写道
您好,我通过java读取本地文件系统的文件夹下的文件列表,但是输出后得到的文件列表不是有序的!会不会是编码问题?但是通过HDFS得到的文件列表却是有序的!本地读取的文件列表输出如下:
file:/home/hadoop/a/0516142310.txt
file:/home/hadoop/a/0516142313.txt
file:/home/hadoop/a/0516142308.txt
file:/home/hadoop/a/0516142311.txt
file:/home/hadoop/a/0516142309.txt
file:/home/hadoop/a/0516142312.txt

不影响结果就行,
3 楼 qindongliang1922 2014-02-18  
dacoolbaby 写道
使用HDFS Api支持大量数据写入吗??
向Scribe和Flume的日志接入方式也是这样吗?

应该不是吧?


可以吧,你测试过没
2 楼 hpuyancy 2014-02-18  
您好,我通过java读取本地文件系统的文件夹下的文件列表,但是输出后得到的文件列表不是有序的!会不会是编码问题?但是通过HDFS得到的文件列表却是有序的!本地读取的文件列表输出如下:
file:/home/hadoop/a/0516142310.txt
file:/home/hadoop/a/0516142313.txt
file:/home/hadoop/a/0516142308.txt
file:/home/hadoop/a/0516142311.txt
file:/home/hadoop/a/0516142309.txt
file:/home/hadoop/a/0516142312.txt
1 楼 dacoolbaby 2013-12-06  
使用HDFS Api支持大量数据写入吗??
向Scribe和Flume的日志接入方式也是这样吗?

应该不是吧?

相关推荐

    java操作Hadoop源码之HDFS Java API操作-创建目录

    本文将详细讲解如何使用Java API来操作HDFS,特别是创建目录的功能。我们将探讨Hadoop的环境配置、HDFS API的使用以及具体创建目录的步骤。 首先,理解Hadoop的环境配置至关重要。在进行Java编程之前,你需要确保...

    利用javaAPI访问HDFS的文件

    ### 使用Java API访问HDFS文件的关键知识点 #### 一、HDFS概述 Hadoop Distributed File System(HDFS)是Apache Hadoop项目的核心组件之一,它为海量数据提供了高吞吐量的数据访问,非常适合大规模数据集的应用...

    使用Java API操作HDFS分布式文件系统

    本文将深入探讨如何使用Java API来操作HDFS。 1. **HDFS基本概念** - **NameNode**:HDFS的主节点,负责管理文件系统的命名空间和元数据,如文件名、文件块信息等。 - **DataNode**:存储实际数据的从节点,执行...

    HDFS文件系统基本文件命令、编程读写HDFS

    HDFS 提供了一个 API,允许开发者使用 Java 语言编写程序来操作 HDFS 文件系统。该 API 包括了 open、read、write、close 等方法,用于读写 HDFS 文件。 使用 HDFS API 可以实现以下操作: 1. 上传本地文件:使用 ...

    Javaapi操作HDFS综合练习.pdf

    在Java API操作HDFS(Hadoop Distributed File System)的过程中,主要涉及了以下几个核心知识点: 1. **依赖管理**: 在进行HDFS操作时,首先需要在项目中引入Apache Hadoop的相关依赖。在Maven项目中,这通常...

    java操作Hadoop源码之HDFS Java API操作-上传文件

    在Java编程环境中,Hadoop分布式文件系统(HDFS)提供了丰富的Java API,使得开发者能够方便地与HDFS进行交互,包括文件的上传、下载、读写等操作。本篇文章将详细探讨如何使用HDFS Java API来实现文件上传的功能。 ...

    Hadoop系统应用之java-API对HDFS的操作实验缺少的两个文件

    在这个实验中,我们关注的是如何使用Java API来操作HDFS,而提到的"winutils&hadoop.dll"文件对于Windows环境下配置Hadoop环境至关重要。 首先,让我们了解HDFS Java API的基本操作。HDFS API主要由`org.apache....

    hdfs-java-api

    而HDFS Java API则是开发人员与HDFS进行交互的主要接口,使得Java应用程序能够便捷地读写HDFS上的文件。本文将深入探讨HDFS Java API的原理、使用方法及其在实际应用中的最佳实践。 一、HDFS基础 1.1 HDFS架构:...

    HDFS存取实例(java)

    Java API是与HDFS交互的主要方式,它提供了一系列的类和方法,使得开发者能够轻松地完成文件的读写操作。主要涉及的类有`FileSystem`和`DFSClient`。 三、HDFS文件上传 1. **配置HDFS环境**:首先需要配置Hadoop的...

    实验二:熟悉常用的HDFS操作

    通过这个实验,学习者不仅能够掌握HDFS的基础操作,还能了解如何在实际项目中使用Java API与HDFS进行交互。这对于后续的大数据处理、MapReduce编程以及Hadoop生态中的其他组件(如HBase)的学习至关重要。理解HDFS的...

    java对大数据HDFS文件操作

    Java作为广泛使用的编程语言,提供了丰富的API来操作HDFS,使得开发者能够方便地进行文件的读取、写入、复制、移动等操作。本文将详细讲解如何使用Java对HDFS进行文件操作,并介绍两个相关的项目示例。 首先,Java...

    java-Hdfs体系结构与基本概念

    Java-HDFS 客户端是 HDFS 的 Java 实现,提供了一个 Java API 来访问 HDFS。Java-HDFS 客户端可以用来开发基于 HDFS 的应用程序。 * RPCClient:RPCClient 是 Java-HDFS 客户端的主要组件,负责与 NameNode 和 ...

    SparkSQL HDFS JAVA调用完整实例

    SparkSQL是Apache Spark的一部分,它提供了对结构化和半结构化数据进行SQL查询的能力,使得开发者可以使用SQL或者DataFrame API来处理数据。在Hadoop Distributed File System(HDFS)上运行SparkSQL,可以让用户...

    HDFS的JAVA接口API操作实例

    通过上述API,开发者可以实现对HDFS的全面控制,进行文件的读写、目录管理,以及利用HDFS的高级特性进行大数据处理。不过,需要注意的是,所有的操作都应该确保在finally块中关闭流和文件系统,以防止资源泄漏。 ...

    HDFS Java api 简单程序.zip

    HDFS Java API是开发人员与HDFS进行通信的主要接口,它提供了丰富的类和方法,使得在Java程序中读写HDFS文件变得简单易行。 首先,我们需要导入Hadoop的相关库。在Java项目中,确保你的`pom.xml`或`build.gradle`...

    Java-Operate-HDFS.zip_hdfs

    本项目“Java-Operate-HDFS.zip_hdfs”提供了使用Java API操作HDFS的示例,帮助开发者理解如何在Java应用程序中与HDFS进行交互。下面将详细介绍HDFS的基本概念以及如何通过Java进行操作。 1. HDFS简介: HDFS是...

    实验项目 实战 HDFS 实验报告

    HDFS Java API允许开发者通过编程方式对HDFS进行高级操作,如创建、读取、修改和删除文件等。 五、HDFS Java API编程 通过Java API,学生可以实现上传本地文件到HDFS的功能。例如,使用FSDataInputStream和...

    3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件

    【HDFS Java API 使用详解】 在大数据处理领域,Hadoop 分布式文件系统(HDFS)扮演着核心角色。为了高效地与HDFS交互,Java API 提供了一套丰富的工具和类库,使得开发者能够方便地进行文件的读写、上传、下载、...

    java操作hdfs依赖包

    Java操作HDFS(Hadoop Distributed File System)是大数据处理中常见的任务,这通常涉及到使用Hadoop的Java API。为了在Java环境中与HDFS进行交互,你需要包含一系列的依赖包,这些包提供了必要的功能来读取、写入和...

Global site tag (gtag.js) - Google Analytics