Hadoop学习笔记(3)-HDFS的Java编程方法

HDFS的Shell命令仅能实现本地的简单文件操作任务,如果小伙伴还没有了解基本的HDFS的Shell命令操作,可以参考小编写的这篇文章Hadoop学习笔记(2)-HDFS的基本操作(Shell命令),然而更高效的方法 是使用Java程序进行HDFS文件的访问,这篇文章就给大家介绍一下HDFS的Java编程方法。

Ubuntu中下载安装Eclipse IDE的Java编程环境

关于配置Java jdk环境的问题,可以参考我的Hadoop学习笔记(1)-Hadoop在Ubuntu的安装这篇文章,里面有提到关于jdk的配置。

安装 eclipse

因为我是有这个安装包,所以就直接传输到了ubuntu,少了下载这个流程。如果你需要安装包,欢迎关注微信公众号: 北徯回复关键词: eclipse即可领取。

你也可以去官网下载自己需要的版本。

在/opt/文件夹下创建文件夹jvm

sudo mkdir /opt/jvm

下载之后将压缩包移动到/opt/jvm目录下,并解压。

sudo tar zxvf eclipse-java-2020-03-R-linux-gtk-x86_64.tar.gz
建立jre软连接

进入你的/opt/jvm/eclipse文件夹,创建一个叫做jre的文件夹。

cd /opt/jvm/eclipse
sudo mkdir jre

在jre中创建链接

ln -s /usr/java/jdk1.8.0_221/bin /opt/jvm/eclipse/jre/

其中jdk是你自己的jdk安装位置和版本,自行更改。

桌面创建快捷方式

为了便于之后打开eclipse,还需要在桌面上创建一个快捷方式。

sudo vim /usr/share/applications/eclipse.desktop

在eclipse.desktop中加入下面这几句话

[Desktop Entry]
Encoding=UTF-8
Name=Eclipse
Comment=Eclipse
Exec=/opt/jvm/eclipse/eclipse
Icon=/opt/jvm/eclipse/icon.xpm
Terminal=false
StartupNotify=true
Type=Application
Categories=Application;Development;

Exec是你的eclipse安装目录,你看看你有没有这个目录,如果没有就找找看你的eclipse安装路径,然后将其改为你的路径。
Icon是eclipse的图标的路径,同样检查看看路径是否一致,不一致的话记住更改

更改权限

切换文件夹目录

cd /usr/share/applications/

更改权限

sudo chmod u+x eclipse.desktop

复制到桌面

cp eclipse.desktop ~/Desktop

回到桌面点击eclipse.desktop,就大功告成啦。

配置eclipse-hadoop环境

新建一个Java Project, Import需要的Hadoop JAR包。

右击“项目”→选择Properties。

在弹出的对话框左侧列表中选择Java Build Path,:选择Add External JARs,就可以逐个添加第三方引用jar包。

需要导入以下jar包。

(1) /usr/local/hadoop/share/hadoop/common目录下的hadoop-common-3.2.1.jar和hadoop-nfs-3.2.1.jar。
(2) /usr/local/hadoop/share/hadoop/common/lib目录下的所有jar包。
(3) /usr/local/hadoop/share/hadoop/hdfs目录下的hadoop-hdfs-3.2.1.jar和hadoop-hdfs-nfs-3.2.1.jar。
(4) /usr/local/hadoop/share/hadoop/hdfs/lib目录下的所有jar包。

从本地拷贝文件到HDFS

在用户的Desktop创建一个testInputFile.txt,作为传输文件进行测试。

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.fs.Path;

public class FileCopyFromLocal{
	public static void main(String[] args) {
		String source = "/home/hadoop/Desktop/testInputFile.txt";
		String dest = "hdfs://localhost:9000/user/hadoop/input/testInputFile2.txt";
		try {
			InputStream in = new BufferedInputStream(new FileInputStream(source));
			Configuration conf = new Configuration();
			FileSystem fs = FileSystem.get(URI.create(dest),conf);
			OutputStream out = fs.create(new Path(dest));
			IOUtils.copyBytes(in,out,4096,true);
			System.out.println("success");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

在eclipse中运行后查看hdfs文件目录是否存在:

./bin/hdfs dfs -ls /user/hadoop/input

判断HDFS目录中对应文件是否存在

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

public class HDFSFileIfExist{
	public static void main(String[] args) {
		try{
			String fileName = "hdfs://localhost:9000/user/hadoop/input/testInputFile2.txt";
			Configuration conf = new  Configuration();
			conf.set("fs.defaultFS","hdfs://localhost:9000");
			conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
			FileSystem fs = FileSystem.get(conf);
			if(fs.exists(new Path(fileName))){
				System.out.println("exists");
			}
			else {
				System.out.println("not exists");
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}

eclipse输出结果:

列出HDFS目录中相应文件信息

import java.net.URI;
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 ListHDFSFiles {
	public static void main(String[] args) {
		String uri = "hdfs://localhost:9000/user/hadoop/input";
		Configuration conf = new Configuration();
		try {
			FileSystem fs = FileSystem.get(new URI(uri), conf);
			Path path = new Path(uri);
			FileStatus[] status = fs.listStatus(path);
			for (FileStatus s : status) {
				System.out.println(s.getPath().getName());
			}
		} 
		catch (Exception e) {
			e.printStackTrace();
		} 	
		}
}

eclipse的Java运行输出:

shell命令查看:

读取HDFS目录中相应文件内容

import java.io.*;
import java.net.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;

public class ReadHDFSFileContents{
	public static void main(String[] args) {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFs","hdfs://localhost:9000");
		conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
		try {
			URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
			InputStream in = new URL("hdfs://localhost:9000/user/hadoop/input/testInputFile2.txt").openStream();
			IOUtils.copyBytes(in,System.out,4096,true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

eclipse输出结果如下:

删除HDFS目录中相应文件

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

public class DeleteHDFSFile{
	public static void main(String[] args) {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS","hdfs://localhost:9000");
		try {
			FileSystem fs = FileSystem.get(conf);
			boolean deleteOnExit = fs.deleteOnExit(new Path("/user/hadoop/input/testInputFile.txt"));
			System.out.println(deleteOnExit);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

因为在hadoop的input目录下没有testInputFile.txt的这个文件,所以输出如下:

读取HDFS相应文件的BLOCK信息

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

public class LocationFile{
	public static void main(String[] args) {
		String uri = "hdfs://localhost:9000/user/hadoop/input/testInputFile2.txt";
		Configuration conf = new  Configuration();
		try{
			FileSystem fs = FileSystem.get(new URI(uri),conf);
			Path path = new Path(uri);
			FileStatus fileStatus = fs.getFileStatus(path);
			BlockLocation blockLocation[] = fs.getFileBlockLocations(fileStatus,0,fileStatus.getLen());
			for(int i=0;i<blockLocation.length;i++)
			{
				String[] hosts = blockLocation[i].getHosts();
				System.out.println("block_"+i+"_location:"+hosts[0]);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}

eclipse输出结果:

以上就是本次我给大家分享的Hadoop学习笔记-HDFS的Java编程方法,在配置和安装eclipse遇到了一些问题,特此记录下来分享给大家,有什么不足的地方还需大家提出来,共同进步!

原创文章 42 获赞 11 访问量 3340

猜你喜欢

转载自blog.csdn.net/qq_43336390/article/details/105635837