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遇到了一些问题,特此记录下来分享给大家,有什么不足的地方还需大家提出来,共同进步!