如何使用Java API读写HDFS

news/2024/5/20 5:31:03 标签: java, hadoop, java读写hdfs, HDFS
[b][color=green][size=large]HDFS是Hadoop生态系统的根基,也是Hadoop生态系统中的重要一员,大部分时候,我们都会使用Linux shell命令来管理HDFS,包括一些文件的创建,删除,修改,上传等等,因为使用shell命令操作HDFS的方式,相对比较简单,方便,但是有时候,我们也需要通过编程的方式来实现对文件系统的管理。


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

[b][color=olive][size=x-large]下面,散仙给出代码,以供参考:[/size][/color][/b]

java">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();//释放资源


}

}



[b][color=olive][size=x-large]散仙用的是Hadoop1.2的版本,采用hadoop的eclipse插件在eclipse下编写调试的,下面给出截图:[/size][/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0091/6198/457c01e4-42f6-31b4-af59-c19d0997e667.jpg[/img]
[b][color=olive][size=large]下面给出一个读取某个文件夹下的所有的文件并打印内容的截图:[/size][/color][/b]

[img]http://dl2.iteye.com/upload/attachment/0091/6200/935024f1-ef4b-3701-82a3-db400d20da07.jpg[/img]


[b][color=green][size=x-large]其实,java操作HDFS还是比较简单的,只要熟悉java IO的一些操作就可以了。


如有不到位的地方,欢迎指正!
[/size][/color][/b]

http://www.niftyadmin.cn/n/790332.html

相关文章

swift searchBar

// // SearchViewController.swift // UIControlDemo // // Created by on 14/12/3. // Copyright (c) 2014年 马大哈. All rights reserved. // import UIKit class SearchViewController: BaseViewController , UITableViewDataSource, UITableViewDelegate ,UISearchBa…

spring+session+redis实现共享

这还用了SpringMVC 来实现session和redis的共享&#xff0c;这用到了Controller session实现共享的好几种实现方法&#xff0c;这只说一种&#xff0c;就是实现session和redis的共享数据 简单的目录结构 红叉不用管&#xff0c;出现Referenced file contains errors (http://…

正态分布

正态分布绿线代表标准正态分布概率密度函数颜色与概率密度函数同累积分布函数参数数学期望&#xff08;实数&#xff09;方差&#xff08;实数&#xff09;支撑集概率密度函數累积分布函数期望值中位数众数方差偏度0峰度0信息熵动差生成函数特性函数正态分布&#xff08;德语&a…

Nginx+Tomcat实现负载均衡

为了分担单个服务器的压力&#xff0c;也为了当服务器宕机时照样可以继续访问自己的网页&#xff0c;所以用Nginx和Tomcat来实现负载均衡&#xff0c;其实这样也做到了前后端分离&#xff0c;Nginx做反向代理 这个图显示大概&#xff0c;session和redis共享就包含在SSM里了 第…

如何使用Java API读写Hbase

[b][colorolive][sizelarge]Hbase是够建在HDFS之上的半结构化的分布式存储系统&#xff0c;具有HDFS的所有优点&#xff0c;同时也有自己的亮点&#xff0c;支持更快速的随机读写以及更灵活的Scan操作&#xff0c;而在HDFS上这一点我们是远远做不到的&#xff0c;因为HDFS仅支持…

openstack组件的数据库操作

一、基础 SQLAlchemy http://docs.sqlalchemy.org/en/rel_0_9/index.html 对数据库进行操作的工具&#xff1a;xxx-manage db ... 二、数据库表的创建和修改 使用SQLAlchemy-SQL Expression Language&#xff1a; http://sqlalchemy.readthedocs.org/en/rel_0_9/core/tutorial.…

九句良言胜敲十年代码

[b][colorgreen][sizelarge]此刻&#xff0c;夜深人静&#xff0c;时间已超过凌晨零点&#xff0c;散仙还在读[urlhttp://blog.csdn.net/ricohzhanglong/article/details/6475258]张龙[/url]老师的一篇博客&#xff0c;特别是读到如下的一段话&#xff0c;感触颇深&#xff0c;…

redis cluster集群进行和SSM整合

redis cluster集群和SSM整合&#xff0c;用两种方式来实现整合 手动方式(也是客户端(JedisCluster )的方式来实现) 关于手动方式请参考SpringMybatisredis整合(用依赖注入的方式手动修改缓存) redis.properties redis.pool.maxTotal30 redis.pool.maxIdle10 redis.pool.numTe…