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

1
sudo mkdir /opt/jvm

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

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

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

1
2
cd /opt/jvm/eclipse
sudo mkdir jre

在jre中创建链接

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

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

桌面创建快捷方式

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

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

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

1
2
3
4
5
6
7
8
9
10
[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的图标的路径,同样检查看看路径是否一致,不一致的话记住更改

更改权限

切换文件夹目录

1
cd /usr/share/applications/

更改权限

1
sudo chmod u+x eclipse.desktop

复制到桌面

1
cp eclipse.desktop ~/Desktop

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

配置eclipse-hadoop环境

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

右击“项目”→选择Properties。

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

需要导入以下jar包。

1
2
3
4
(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,作为传输文件进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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文件目录是否存在:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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目录中相应文件信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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目录中相应文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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目录中相应文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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遇到了一些问题,特此记录下来分享给大家,有什么不足的地方还需大家提出来,共同进步!

本文标题:Hadoop学习笔记(3)-HDFS的Java编程方法

文章作者:北徯。

发布时间:2020年04月21日 - 00:00:00

最后更新:2020年10月19日 - 10:44:11

原始链接:https://www.xiangjunhong.com/posts/1dc7f47e.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------