大数据(hadoop-HDFS的本地开发环境的配置与常见的HDFS的JAVA API)

HDFS的本地开发环境搭建

1:所需工具

1)hadoop2.7.3安装包
2)hadoop-eclipse-plugin插件
https://github.com/winghc/hadoop2x-eclipse-plugin

2:搭建过程

1:解压hadoop2.7.3文件
2:下载hadoop-eclipse-plugin插件
3:解压hadoop2.7.3
4:设置hadoop的环境变量
    添加系统变量HADOOP_HOME
    添加hadoop的bin目录到PATH中
5:添加hadoop.dll和winutils.exe 到hadoop的解压目录中的bin目录中
    (hadoop.dll和winutils.ext在hadoop-eclipse-plugin目录里面)

6:将hadoop-eclipse的插件放入eclipse的plugins目录中
7:在eclipse中配置hadoop的安装目录
8:配置eclipse的DFS location


HDFS Java API介绍

configuration类:
    该类的对象封装了配置信息,这些配置信息来自core-*.xml
FileSystem类:
    文件系统类,可使用该类的方法对文件/目录进行操作。一般通过FileSystem的静态方法get获得一个文件系统对象
FSDataInputStream和FSDataOutputStream类:
    HDFS中的输入输出流。分别通过FileSystem的Open方法和create方法获得

以上类均来自java包:org.apache.hadoop.fs

示例代码,看工程里的JAVA代码

Configution config=new Configution();
FileSystem hdfs = FileSystem.get(config);
Path srcPath = new Path(srcFile);
Path dstPath = new Path(dstFile);
hdfs.copyFromLocalFile(srcPath, dstPath);

package com.andy;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class HdfsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			System.setProperty("HADOOP_USER_NAME","hadoop") ;
//			downFromHdfs() ;
//			uploadFileToHdfs() ;
//			mkdirToHdfs() ;
//			createFile() ;
//			renameFileOrDir() ;
//			listDir() ;
			delFile() ;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//下载文件
	public static void downFromHdfs() throws Exception{
		String path = "hdfs://192.168.153.111:9000" ;
		URI uri = new URI(path) ;
		FileSystem fs = FileSystem.get(uri, new Configuration()) ;
		
		//Hadoop文件系统中通过Hadoop Path对象来代表一个文件
		Path src = new Path("/tfiles/a.txt") ;
		FSDataInputStream in = fs.open(src);
		
		File targetFile = new File("d://aa.txt") ;
		FileOutputStream out = new FileOutputStream(targetFile) ;
		//IOUtils是Hadoop自己提供的工具类,在编程的过程中用的非常方便
		//最后那个参数就是是否使用完关闭的意思
		IOUtils.copyBytes(in, out, 4096, true);
		System.out.println("=========文件下载成功=========");
	}
	
	//2:上传文件
	public static void uploadFileToHdfs() throws Exception{
		//针对这种权限问题,有集中解决方案,这是一种,还可以配置hdfs的xml文件来解决
		//System.setProperty("HADOOP_USER_NAME","hadoop") ;
		
		//FileSystem是一个抽象类,我们可以通过查看源码来了解
		String path = "hdfs://192.168.153.111:9000" ;
		URI uri = new URI(path) ;//创建URI对象  
		FileSystem fs = FileSystem.get(uri, new Configuration()) ;//获取文件系统
		//创建源地址
		Path src = new Path("d://aa.txt") ;
		//创建目标地址
		Path dst = new Path("/") ;
		//调用文件系统的复制函数,前面的参数是指是否删除源文件,true为删除,否则不删除 
		fs.copyFromLocalFile(false, src, dst);
		//最后关闭文件系统
		System.out.println("=========文件上传成功==========");
		fs.close();//当然这里我们在正式书写代码的时候需要进行修改,在finally块中关闭
	}
	
	//3:创建文件夹
	public static void mkdirToHdfs(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		URI uri = null ;
		FileSystem fs = null ;
		try {
			//创建URI对象  
			uri = new URI(path);
			fs = FileSystem.get(uri, new Configuration()) ;//获取文件系统
			Path dirPath = new Path("/mktest") ;
			fs.mkdirs(dirPath) ;
		} catch (Exception e) {			
			e.printStackTrace();
		}finally{
		  try {
				fs.close();
		  } catch (IOException e) {
				e.printStackTrace();
		  }
		}
		System.out.println("==========创建目录成功=========");
	}
	
	//4:创建文件
	public static void createFile(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		//创建URI对象  
		URI uri = null ;
		FileSystem fs = null ;
		FSDataOutputStream out = null ;
		try {
			uri = new URI(path);
			fs = FileSystem.get(uri, new Configuration()) ;//获取文件系统
			Path dst = new Path("/mktest/aa.txt") ;//要创建的文件的路径
			byte[] content = "我爱你们".getBytes() ;
			//创建文件
			out = fs.create(dst) ;
			//写数据
			out.write(content);
			System.out.println("=======文件创建成功========");
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				//关闭流
				out.close();
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	//5:文件重命名
	public static void renameFileOrDir(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		//创建URI对象  
		URI uri = null ;
		FileSystem fs = null ;
		
		//旧文件名称的path
//			Path oldName = new Path("/mktest/aa.txt") ;
//			Path newName = new Path("/mktest/bb") ;		
		Path oldName = new Path("/mktest") ;
		Path newName = new Path("/mktest2") ;	
		try {
			uri = new URI(path);
			fs = FileSystem.get(uri, new Configuration()) ;//获取文件系统
			fs.rename(oldName, newName) ;
			System.out.println("=========重命名成功========");
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	//遍历文件系统的某个目录
	public static void listDir(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		//创建URI对象  
		URI uri = null ;
		FileSystem fs = null ;
		try {
			uri = new URI(path) ;
			fs = FileSystem.get(uri, new Configuration()) ;
			//输入要遍历的目录路径
			Path dst = new Path("/tfiles") ;
			//调用listStatus()方法获取一个文件数组  
			//FileStatus对象封装了文件的和目录的元数据,包括文件长度、块大小、权限等信息
			FileStatus[] liststatus = fs.listStatus(dst) ;
			for (FileStatus ft : liststatus) {
				//判断是否是目录
				String isDir = ft.isDirectory()?"文件夹":"文件" ;
				//获取文件的权限
				String permission = ft.getPermission().toString() ;
				//获取备份块
				short replication = ft.getReplication() ;
				//获取数组的长度
				long len = ft.getLen() ;
				//获取文件的路径
				String filePath = ft.getPath().toString() ;
				System.out.println("文件信息:");
				System.out.println("是否是目录? "+isDir);
				System.out.println("文件权限 "+permission);
				System.out.println("备份块 "+replication);
				System.out.println("文件长度  "+len);
				System.out.println("文件路劲  "+filePath);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	//删除文件
	public static void delFile(){
		
		String path = "hdfs://192.168.153.111:9000" ;
		//创建URI对象  
		URI uri = null ;
		FileSystem fs = null ;
		try {
			uri = new URI(path) ;
			fs = FileSystem.get(uri, new Configuration()) ;
//				Path dst = new Path("/job.txt") ;
			Path dst = new Path("/mktest2") ;
			
			//永久性删除指定的文件或目录,如果目标是一个空目录或者文件,那么recursive的值就会被忽略。
			//只有recursive=true时,一个非空目录及其内容才会被删除
			boolean flag = fs.delete(dst, true) ;
			if(flag){
				System.out.println("==========删除成功=========");
			}else{
				System.out.println("==========删除失败=========");
			}			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
}

 

 

转载于:https://my.oschina.net/u/3728166/blog/3040555

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值