HDFS的编程实践:Java应用程序

在Linux中下载安装Eclipse
Eclipse是常用的程序开发工具,可以利用Ubuntu自带的“软件中心”安装Eclipse,在桌面左侧快捷启动栏找到“Ubuntu软件”
在这里插入图片描述
进入“Ubuntu软件”以后,在界面右上角的搜索框中输入Eclipse,会出现Eclipse软件
在这里插入图片描述
点击Eclipse图标进入,单击安装按钮就可以顺利完成Eclipse的安装(我是已经安装完成了,显示的不是安装按钮)
在这里插入图片描述
安装时需要管理员权限,Ubuntu系统会弹出“认证”窗口进行用户认证,请输入当前用户的登录密码。同时需要注意的是,安装过程中需要从网络下载相关文件,所以,要保持计算机一直处于联网状态。
在这里插入图片描述
Eclipse安装完成以后,可以单击桌面左侧快捷启动栏找到“显示应用程序”,在弹出的界面中,在搜索输入框中输入Eclipse,就可以找到刚才安装好的Eclipse软件,单击Eclipse图标,就可启动运行Eclipse软件。
在这里插入图片描述
在Eclipse中创建项目
当Eclipse启动后,会弹出以下界面,提示设置工作空间(workspace)
可以直接采用默认的设置/home/hadoop/eclipse-workspace,单击launch按钮
在这里插入图片描述
启动成功出现以下界面
在这里插入图片描述
选择File->New->Jaca Project命令,开始创建一个java工程,会弹出以下界面
在这里插入图片描述
在Project name后面输入工程名称HDFSExample1,选中Use default location复选框,将Java工程的所有文件都保存到/home/hadoop/eclipse-workspace/HDFSExample1目录下。在JRE选项卡中,可以选择当前的LInux系统中已经安装好的JDK,例如,jdk1.8.0_221,然后单击界面底部的Next按钮,进行下一步设置。
在这里插入图片描述
为项目添加需要用到的JAR包
进入下一步设置后,会弹出以下界面,单击界面中的Libraies选项卡,然后单击右侧的Add External JARs按钮,就可以添加所需的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包。

导入完成后,点击Finish按钮就完成工程的创建了
编写Java程序
右击刚刚建立好的工程名称HDFSExample1,在弹出的菜单中选择New->Class命令
在这里插入图片描述
在弹出的界面中,只需要在Name后面输入新建的Java类文件的名称,其他保持默认设置,然后点击Finish按钮,Eclipse会自动创建一个源代码文件,然后在该文件中进行代码编写。
在这里插入图片描述
判断HDFS目录中相应文件是否存在

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

public class HDFSFileExist{
	public static void main(String[] args) {
		try{
			String fileName = "hdfs://localhost:9000/user/hadoop/input/123.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();
		}
	}
}

运行程序,检测到存在相应文件输出exists,不存在则输出not exists
在这里插入图片描述
读取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 ReadHDFSFile{
	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/123.txt").openStream();
			IOUtils.copyBytes(in,System.out,4096,true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

运行程序,输出相应文件的内容
在这里插入图片描述
读取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/123.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();
		}
	}
}

运行程序,输出相应文件的BLOCK信息
在这里插入图片描述
删除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/123.txt"));
			System.out.println(deleteOnExit);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

运行程序,成功删除相应文件输出true,删除失败则输出false
在这里插入图片描述
!!!
以上皆是调试好的情况下的操作步骤哦,其实本人在运行程序时出现了以下的报错问题
在这里插入图片描述
我发现报错的问题就是org.apache.hadoop.dfs.DistributedFileSystem没有找到,那会不会是之前所导入的包不全,因为只加了hadoop/hdfs目录下的hadoop-hdfs-3.2.1.jar和hadoop-hdfs-nfs-3.2.1.jar。所以,我就把hadoop/hdfs目录下的所有jar包都添加进去,这样一试,真的没有报错了耶,成功运行。
不知道会不会有人和我出现一样的问题,如果有,这个方法就可以尝试一下,看能不能解决你的问题。
注意
在开始编译运行程序之前,一定要确保Hadoop已经启动运行,如果还没有启动,需要打开终端,输入以下命令启动Hadoop

cd /usr/local/hadoop
./sbin/start-dfs.sh

成功启动Hadoop,如下图所示
在这里插入图片描述
运行结束后,不要忘记关闭Hadoop哦

./sbin/stop-dfs.sh

在这里插入图片描述
好了,本次HDFS编程实践操作到此结束了,有什么问题随时指出来哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值