eclipse使用JavaAPL实现连接HDFS相关操作,代码详解。

以下操作需要配置好eclipse环境jdk环境和maven环境,具体环境配置网上有好多,最近也会出一份详细教程。

1.创建类MakeDir.class,在HDFS的根目录下,创建名为hdfstest的目录。

/*
 * 程序功能是在HDFS的根目录下,创建名为hdfstest的目录。
 *
 */

package com.itcast.demo;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

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

public class MakeDir {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();    //构造一个配置参数对象,设置一个参数,来访问我们的HDFS的URI
		
		String hdfsPath = "hdfs://hadoop01:9000";   //hdfs的地址
		System.setProperty("HADOOP_USER_NAME", "root"); //通过这种方式进行客户端身份的设置
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf);//通过FileSystem类的静态方法获取文件系统的客户端对象
		
		String newDir = "/hdfstest";  //创建一个新的目录
		
		boolean result = hdfs.mkdirs(new Path(newDir));  //判断结果,将文件创建到新的地址。
		if(result) {                                     //如果结果成功
			System.out.println("success");				//返回一个success
		}else {											//如果结果失败
			System.out.println("failed");				//返回一个failed
		}
	}
}

2.创建类TouchFile.class,在HDFS的目录/hdfstest下,创建名为touchfile的文件。

/*
 * 程序功能是在HDFS的目录/hdfstest下,
 * 创建名为touchfile的文件。
 */
package com.itcast.demo;

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

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

public class TouchFile {
	public static void main(String[] args) throws Exception, IOException {
		Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问呢我们的hdfs。
		
		String hdfsPath = "hdfs://hadoop01:9000"; //创建一个字符串用来存储我们hdfs的地址。
		System.setProperty("HADOOP_USER_NAME", "root");//用于设置客户端身份,注意命令执行顺序。
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf);//通过FileSystem类的静态方法获取文件系统的客户端对象
		
		String filePath = "/hdfstest/touchfile";//创建一个filePath存放创建文件字符串。
		hdfs.create(new Path(filePath));   		//函数hafs.create创建一个文件+文件地址。
		System.out.println("Finish!");			//完成打印finish。
		
	}
}

3.创建类CopyFromLocalFile.class,将本地C:/hadoop_text/sample_data.txt的文件,上传到HDFS文件系统的/hdfstest目录下。

/*
 * 
 * 程序功能是将本地操作系统上的文件C:/hadoop_text/sample_data.txt,
 * 上传到HDFS文件系统的/hdfstest目录下。
 * 
 */

package com.itcast.demo;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

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

public class CopyFromLocalFile {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
		String hdfsPath = "hdfs://hadoop01:9000";//创建一个字符串用来存储我们的hdfs的地址。
		System.setProperty("HADOOP_USER_NAME", "root");//用于设置客户端身份,注意命令执行顺序。
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf);//通过FS类的方法获取文件系统客户端对象。
		
		String from_windows = "C:/hadoop_text/sample_data.txt";//创建一个字符串写入本地文件地址。
		String to_HDFS = "/hdfstest/";							//创建一个字符串写入上传文件地址。
		hdfs.copyFromLocalFile(new Path(from_windows),new Path(to_HDFS));//调用函数上传。
		System.out.println("Finish!");									//完成输出Finish!
		
		
	}
}

4.创建类CopyToLocalFile.class,将HDFS文件系统上的文件/hdfstest/sample_data,下载到本地。

/*
 * 程序功能是将HDFS文件系统上的文件/hdfstest/sample_data,
 * 下载到本地C:/hadoop_text/copytolocal 。
 */


package com.itcast.demo;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

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

public class CopyToLocalFile {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();	//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
		String hdfsPath = "hdfs://hadoop01:9000";	//创建一个字符串用来存储我们的hdfs地址。
		System.setProperty("HADOOP_USER_NAME","root");	//用于设置客户端身份,注意命令顺序,函数调用set。
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf);	//通过FileSystem方法获取系统客户端对象。
		
		String from_HDFS = "/hdfstest/sample_data.txt";	//创建一个字符串写入下载地址,注意文件要加.txt后缀。
		String to_windows = "/C:/hadoop_text/copytolocal/";		//创建一个字符串写入下载到本地的地址。
		hdfs.copyToLocalFile(false, new Path(from_HDFS),new Path(to_windows));	//调用.copy函数进行下载。
		System.out.println("Finish!");								//完成输出finfish!。
	}
}

5.创建类ListFiles.class,列出HDFS文件系统/hdfstest目录下,所有的文件,以及文件的权限、用户组、所属用户。

/*
 * 程序功能是列出HDFS文件系统/hdfstest目录下,
 * 所有的文件,以及文件的权限、用户组、所属用户
 * 块的大小:.getBlockSize()      文件长度:.getLen()     备份数:.getReplication()  
 * 修改时间:.getModificationTime()
 */
package com.itcast.demo;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

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

public class ListFiles {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();		//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
		String hdfsPath = "hdfs://hadoop01:9000";		//创建一个字符串用来存储我们的hdfs地址。
		System.setProperty("HADOOP_USER_NAME", "root");		//用于设置客户端身份,注意命令顺序,函数调用set。
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf);	//通过FileSystem方法获取系统客户端对象。
		
		String watchHDFS = "/hdfstest";			//创建一个字符串写入查询hdfs文件地址
		FileStatus[] files = hdfs.listStatus(new Path(watchHDFS));//FileStatus对象封装了文件和目录的元数据,包括文件长度、块大小、权限等信息。
		for (FileStatus file: files) {//做一个循环输出
			System.out.println("文件权限:"+file.getPermission() +"文件所有者:"+file.getOwner()+"用户组信息"+file.getGroup()+"文件路径:"+file.getPath());
		} //分别输出文件的权限、所有者、用户组信息、路径。循环到所有文件结束为止。
	}
}

6.创建类IteratorListFiles.class,列出HDFS文件系统/根目录下,以及各级子目录下,所有文件以及文件的权限、用户组,所属用户。

/*
 * 程序功能是列出HDFS文件系统/根目录下,以及各级子目录下,
 * 所有文件以及文件的权限、用户组,所属用户。
 */
package com.itcast.demo;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

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

public class IteratorListFiles {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();	//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
		String hdfspath = "hdfs://hadoop01:9000";	//创建一个字符串用来存储我们hdfs的地址。
		System.setProperty("HADOOP_USER_HOME", "root");	//用于设置客户端身份,注意命令顺序,函数调用set。
		FileSystem hdfs = FileSystem.get(new URI(hdfspath), conf);	//通过FS方法获取客户端对象。
		
		String watchHDFS = "/";					//创建一个字符串写入查询hdfs文件地址。
		iteratorListFile(hdfs,new Path(watchHDFS));	//创建一个方法分别放客户端对象,和查询hdfs地址。下面再构造一个方法的内容。
	}
	public static void iteratorListFile(FileSystem hdfs, Path path) throws IOException, IOException {
		FileStatus[] files = hdfs.listStatus(path); 		//FileStatus对象封装了文件和目录的元数据,调用此类。
		for(FileStatus file:files) {						//做一个for循环,用于持续输出。
			if(file.isDirectory()) {						//如果文件时目录的话。
				System.out.println("文件权限"+file.getPermission()+"文件所有者"+ file.getOwner()+"用户组信息"+file.getGroup()+"文件路径"+file.getPath());
				iteratorListFile(hdfs,file.getPath());
			}else if(file.isFile()) {						//如果是文件的话。
				System.out.println("文件权限"+file.getPermission()+"文件所有者"+file.getOwner()+"用户组信息"+file.getGroup()+"文件路径"+file.getPath());
			}
	}
	}
		
	}


7.创建类LocateFile.class,查看HDFS文件系统上,文件/hdfstest/sample_data的文件块信息。

/*
 * 程序功能是查看HDFS文件系统上,
 * 文件/hdfstest/sample_data的文件块信息。
 */
package com.itcast.demo;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

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

public class LocateFile {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
		String hdfspath = "hdfs://hadoop01:9000";	//创建一个字符串用来存储我们hdfs的地址。
		System.setProperty("HADOOP_USER_HOME", "root");	//用于设置客户端身份,注意命令顺序,函数调用set。
		FileSystem hdfs = FileSystem.get(new URI(hdfspath), conf);	//通过FS方法获取客户端对象。
		
		Path file = new Path("/hdfstest/sample_data.txt");//设置一个文件路径=hdfs路径。
		FileStatus fileStatus = hdfs.getFileStatus(file); //得到hdfs文件地址
		
		BlockLocation[] location = hdfs.getFileBlockLocations(fileStatus,0,fileStatus.getLen());//调用查看文件快的包,写入位置到location。
		for(BlockLocation block:location){						//在location循环找文件块
			String[] hosts = block.getHosts();					//定义一个字符串,放入获得的文件块
			for(String host:hosts) {							//文件块循环
				System.out.println("block:"+block + "host:" + host);;	//输出信息
			}
		}
	}
}

8.创建类WriteFile.class,在HDFS上,创建/hdfstest/writefile文件,并在文件中写入内容“hello world hello data!”。

/*
 * 程序功能是在HDFS上,创建/hdfstest/writefile文件
 * 并在文件中写入内容“hello world hello data!”。
 */
package com.itcast.demo;

import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class WriteFile {
	public static void main(String[] args) throws IOException, Exception{
		Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
		String hdfspath = "hdfs://hadoop01:9000";	//创建一个字符串用来存储我们hdfs的地址。
		System.setProperty("HADOOP_USER_HOME", "root");	//用于设置客户端身份,注意命令顺序,函数调用set。
		FileSystem hdfs = FileSystem.get(new URI(hdfspath), conf);	//通过FS方法获取客户端对象。
		
		String filePath = "/hdfstest/writefile";		//定义字符串写入文件创建地址和创建文件的名字。
		FSDataOutputStream create = hdfs.create(new Path(filePath));	//将创建的文件传到hdfs上。
		System.out.println("第一步完成!");						//完成输出。
		
		String sayHi = "hello world hello data!";				//定义字符串,写入将要写进文件的内容。
		byte[] buff =sayHi.getBytes();							//先建立个空字节,返回一个字符sayHi内容的编码字节,放入buff中。
		create.write(buff,0,buff.length);						//写入到文件中,包括文件内容和长度。
		create.close();											//关闭资源文件。
		System.out.println("第二步完成");						//完成输出。
	}
}


9.创建类PutMerge.class,将本地文件夹/data/mydata/下的所有文件,上传到HDFS上并合并成一个文件/hdfstest/mergefile。

/*
 * 程序功能是将本地文件夹C:\hadoop_text\hadoop04下的所有文件,
 * 上传到HDFS上并合并成一个文件/hdfstest/mergefile。
 * 
 */

package com.itcast.demo;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

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;

public class PutMerge {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
		String hdfspath = "hdfs://hadoop01:9000";	//创建一个字符串用来存储我们hdfs的地址。
		System.setProperty("HADOOP_USER_HOME", "root");	//用于设置客户端身份,注意命令顺序,函数调用set。
		FileSystem hdfs = FileSystem.get(new URI(hdfspath), conf);	//通过FS方法获取客户端对象。
		
		FileSystem local = FileSystem.getLocal(conf); 	//通过FS方法获取本地参数。
		
		String from_windowsDir = "C:\\hadoop_text\\hadoop04";	//定义一个字符串写入本地文件地址。
		String to_HDFS = "/hdfstest/mergefile";					//定义一个字符串写入上传文件地址。
		
		FileStatus[] inputFiles = local.listStatus(new Path(from_windowsDir));	//返回本地地址到inputfiles中,连接本地。
		FSDataOutputStream out = hdfs.create(new Path(to_HDFS));				//返回一个上传地址,连接hdfs,产生新的HDFS文件或写内容。
		
		for(FileStatus file:inputFiles) {								//循环读取本地文件
			FSDataInputStream in = local.open(file.getPath());			// 提供对本地文件的随机访问方法
			byte[] buffer = new byte[256];							//申请一个buffer,大小是256字节。
			int bytesRead = 0;										//定义一个读取字节等于0。
			while((bytesRead = in.read(buffer))>0) {				//循环,赋值给读取字节后大于0时,
				out.write(buffer,0,bytesRead);						//写入字节和读取的字节。
			}
			in.close(); 											//结束循环  
		}
		System.out.println("Finish!");					//成功输出Finish!
	}
}

注意:

最后两步是创建的文本文件,可能你配置集群的时候没有给予权限,会导致报错。

报错如下:

org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=DrWho, access=WRITE, inode=“root”:root:supergroup:rwxr-xr-x

解决办法:

在hdfs-site.xml文件中加入下面的代码授予权限,修改之后,重启hadoop进程,即可生效


<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

还有就是把你windows的用户名改成hadoop给与相同名字,重启电脑。

同是同行者,加油!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小先生

知识是无价的,白嫖也可以的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值