在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编程实践操作到此结束了,有什么问题随时指出来哦