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

如何使用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的日志接入方式也是这样吗?

应该不是吧?

相关推荐

    实验项目 实战 HDFS 实验报告

    一、实验目的 1. 理解 HDFS 体系架构。 2. 理解 HDFS 文件存储原理和数据读写过程。 3. 熟练掌握 HDFS Web UI 界面的使用...5. 使用 HDFS Java API 编写 HDFS 文件操作程序,实现上传本地文件到 HDFS 的功能。。。。。

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

    3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java 网址:...

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

    A.2实验二:熟悉常用的HDFS操作 ...(3)熟悉HDFS操作常用的Java API。 A.2.2 实验平台 (1)操作系统:Linux(建议Ubuntu 16.04)。(2) Hadoop版本:2.7.1。 (3)JDK版本:1.7或以上版本。(4) Java IDE:Eclipse。

    gda300jar.zip

    编译gdal3.0.0源码使支持gdal javaapi读写hdfs

    Hadoop学习笔记(一):HDFS分布式文件系统(从环境搭建到Java API)-附件资源

    Hadoop学习笔记(一):HDFS分布式文件系统(从环境搭建到Java API)-附件资源

    实验2 熟悉常用的HDFS操作

    3. 熟悉HDFS操作常用的Java API。 二、实验平台 1. 操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04); 2. Hadoop版本:3.1.3; 3. JDK版本:1.8; 4. Java IDE:Eclipse。 三、实验步骤(每个步骤下均需有运行截图...

    Hadoop从入门到上手企业开发

    036 HDFS Java API 两种方式介绍及使用URL API详解一 037 使用URL API详解二 038 使用HDFS FileSystem API 详解 039 HDFS文件系统读写流程及HDFS API两种方式读取文件 040 详解HDFS API之FileSystem方式基本操作二 ...

    分布式存储系统-HDFS.docx

    内容概要:  分布式文件系统与 HDFS  HDFS 体系结构与基本概念★★★  HDFS 的 shell 操作★★★ ... java 接口及常用 api★★★  hadoop 的 RPC 机制★  hadoop 读写数据的过程分析★★

    hadoofus:用于 C 的 HDFS 客户端库

    它提供了一个 C API 用于直接调用 Namenode RPC 和执行 Datanode 块读写操作。 与 libhdfs 不同,Hadoofus 使用多个版本的 HDFS 协议。 您的选择,您可以用Hadoop 0.20.203通过1.xy(说话HDFS_NN_v1 / HDFS_...

    Hadoop权威指南(第2版).

    HDFS通信部分使用org.apache.hadoop.ipc,可以很快使用RPC.Server.start()构造一个节点,具体业务功能还需自己实现。针对HDFS的业务则为数据流的读写,NameNode/DataNode的通信等。 MapReduce主要在org.apache....

    Apress - Pro Hadoop

    针对HDFS的业务则为数据流的读写,NameNode/DataNode的通信等。  MapReduce主要在org.apache.hadoop.mapred,实现提供的接口类,并完成节点通信(可以不是hadoop通信接口),就能进行MapReduce运算。  目前这个...

    细细品味架构·Hadoop 2015技术发展与2016发展趋势(第10期)

    1.2.1 HDFS 1.2.2 YARN 1.2.3 2016 年发展趋势 1.2.4 现场答疑(Q&A) 1.3 内容之二 1.3.1 新API 接口 1.3.2 多个 Region 副本 1.3.3 Family 粒度的 Flush 1.3.4 RPC 读写队列分离 1.3.5 在线调整配置 1.3.6 ...

    Hbase+Spring boot实战分布式文件存储

    3-1 HBase写流程 3-2 HBase读流程 3-3 HBase模块协作 3-4 HBase实战:Shell命令实战 3-5 HBase实 战:Java Api实现HBase连接类 3-6 HBase实战:Java Api实现HBase操作类 3-7 HBase实战:用过滤器筛选数据 3-8 HBase...

    Hadoop实战中文版

    3.1 HDFS 文件操作 3.1.1 基本文件命令 3.1.2 编程读写HDFS 3.2 剖析MapReduce 程序 3.2.1 Hadoop数据类型 3.2.2 Mapper 3.2.3 Reducer 3.2.4 Partitioner:重定向Mapper输出 3.2.5 Combiner:本地reduce ...

    python大数据-为什么Python编程非常适合大数据?.pdf

    HDFS API使您可以轻松地在⽂件,⽬录和全局⽂件系统属性上读写信息,⽽不会遇到任何障碍。 2.提供MapReduce API Pydoop提供了MapReduce API,以最少的编程⼯作即可解决复杂的问题。 该API可⽤于实现"计数器"和"记录...

    HBaseBulkImportXML:如何将 XML 文件中的数据批量导入 HBase 表的示例

    使用 API 将数据放入工作中,但因为它必须遍历 HBase 的写入路径(即在将其刷新到 HFile 之前通过 WAL 和 memstore),它比您简单地绕过该批次并自己创建 HFiles 和将它们直接复制到 HDFS 中。 幸运的是 HBase 带有...

    大数据的存储管理技术.doc

    HBase可以支持N ative Java API、HBase Shell等多种访问接口,可以根据具体应用场合选择相应的访问方式,而且相对于传统的 关系数据库来说,HBase采用了更加简单的数据模型,把数据存储为未经解释的字符串, 用户...

    HBase_XML_bulkimport

    使用 API 将数据放入工作中,但因为它必须遍历 HBase 的写入路径(即在将其刷新到 HFile 之前通过 WAL 和 memstore),它比您简单地绕过该批次并自己创建 HFiles 和将它们直接复制到 HDFS 中。 幸运的是 HBase 带有...

    各大数据组件介绍.pdf

    但不同于MapReduce的是—— Job中间输出结果可以保存在内存中,从⽽不再需要读写HDFS,因此Spark能更好地适⽤于数据挖掘与机器学习等需要迭代 的MapReduce的算法。 Spark 是⼀种与 相似的开源集群计算环境,但是两者...

    Hadoop实战中文版.PDF

    30第3章 Hadoop组件 313.1 HDFS文件操作 313.1.1 基本文件命令 323.1.2 编程读写HDFS 353.2 剖析MapReduce程序 373.2.1 Hadoop数据类型 393.2.2 Mapper 403.2.3 Reducer 413.2.4 Partitioner:...

Global site tag (gtag.js) - Google Analytics