HDFS客户端操作

Shell 操作

官网命令参考 https://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html

hdfs 基本shell

1
hadoop fs

hadoop fs 等价于 hdfs dfs

可以看到目录主要分为

  • 对目录的操作

  • 对文件的操作

  • 权限的操作

目录的操作

  • 创建 mkdir

  • ls 查看目录下的文件

  • du 统计文件夹的大小

文件的操作

  • cat 查看文件
  • appendToFile 追加文件 hadoop fs -appendToFile test /folder1/test
  • put 上传 hadoop fs -put test /folder1
  • cp 拷贝

权限的操作

  • chmod 设置权限
  • chown 设置归属

其他操作

  • setrep 设置副本数量

客户端操作

配置hadoop环境变量

为什么要配置环境变量呢,是因为hadoop的Api中,是部分Api调用到了本地方法库。所以需要配置hadoop的环境变量信息。

wiki 链接 https://cwiki.apache.org/confluence/display/HADOOP2/WindowsProblems

  • 配置HADOOP_HOME
  • 配置Path环境变量,并且需要包含 WINUTILS.EXE

下载相关的本地执行文件
https://github.com/steveloughran/winutils

下载后有多个版本的,这里直接选用3.x版本的

配置环境变量

配置 HADOOP_HOME 和 PATH = %HADOOP_HOME%/bin

配置完毕后,重启电脑;

必须要重启,不然系统无法加载hadoop相关类库函数

引入相关依赖

引入核心包和日志实现

1
2
3
4
5
6
7
8
9
10
11
12
13

<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.0</version>
</dependency>

配置log4j.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error" strict="true" name="XMLConfig">
<Appenders>
<!-- 类型名为Console,名称为必须属性 -->
<Appender type="Console" name="STDOUT">
<Layout type="PatternLayout"
pattern="[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c{10}]%m%n"/>
</Appender>
</Appenders>
<Loggers>
<!-- 可加性为false -->
<Logger name="test" level="info" additivity="false">
<AppenderRef ref="STDOUT"/>
</Logger>
<!-- root loggerConfig设置 -->
<Root level="info">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>

配置运行的jvm参数。

1
-DHADOOP_USER_NAME=hadoop

这样请求的时候会默认使用此用户的信息;

核心API对象

Configuration

配置对象,可以设置相关的配置信息

1
2
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://hadoop1:9820");

FileSystem

几乎所有的操作就是由此对象操作

1
2
3
4
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://hadoop1:9820");
URI uri = new URI("hdfs://hadoop1:9820");
FileSystem fs fs = FileSystem.get(uri, configuration, "hadoop");

使用完毕后将此对象进行关闭

1
fs.close();

API 操作

创建目录

1
fs.create(new Path("/newFolder"));

删除目录

1
fs.delete(new Path("/newFolder"),true);

参数说明: 第二个参数是否能递归删除

上传文件

1
fs.copyFromLocalFile(false,true,new Path("E:\\note\\新建文本文档.txt"),new Path("/test33"));

参数说明:

  1. 是否删除本地文件

  2. 是否覆盖目录文件,如果为false,那么已存在就不能上传了

  3. 本地目录

  4. 远程目录

获取文件状态

FsStatus status = fs.getStatus(new Path("/test33/新建文本文档.txt"));
long capacity = status.getCapacity();
long remaining = status.getRemaining();
long used = status.getUsed();
System.out.println(capacity);
System.out.println(remaining);
System.out.println(used);

下载到本地

1
fs.copyToLocalFile(false,new Path("/test33/新建文本文档.txt"),new Path("E:\\note\\新建文本文档.txt"));

遍历文件

//最后一个参数表示是否递归遍历

1
2
3
4
5
6
RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fs.listFiles(new Path("/"), true);
while (locatedFileStatusRemoteIterator.hasNext()){
LocatedFileStatus locatedFileStatus = locatedFileStatusRemoteIterator.next();
Path path = locatedFileStatus.getPath();
System.out.println(path);
}