Shell命令
hadoop fs xxx 和 hadoop dfs xxx是完全一样的命令,这里用hadoop fs 举例
查看帮助
# 查看某个命令的帮助
hadoop fs -help rm
上传
# 在HDFS根目录下创建文件夹myDir
hadoop fs -mkdir /myDir
# -moveFromLocal:从本地剪切粘贴到HDFS
hadoop fs -moveFromLocal word.txt /myDir
# -copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
hadoop fs -copyFromLocal word.txt /myDir
# -put:等同于copyFromLocal,生产环境更习惯用put
hadoop fs -put word.txt /myDir
# -appendToFile:追加一个文件到已经存在的文件末尾
# HDFS是不允许对已上传的文件进行修改,只能追加
hadoop fs -appendToFile newWord.txt /myDir/word.txt
下载
# -copyToLocal:从HDFS拷贝到本地
hadoop fs -copyToLocal /myDir/word.txt ./
# -get:等同于copyToLocal,生产环境更习惯用get
hadoop fs -get /myDir/word.txt ./word.txt
HDFS直接操作
# -ls: 显示目录信息
hadoop fs -ls /myDir
# -cat:显示文件内容
hadoop fs -cat /myDir/word.txt
# -chgrp、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
hadoop fs -chmod 666 /myDir/word.txt
hadoop fs -chown cm:cm /myDir/word.txt
# -mkdir:创建路径
hadoop fs -mkdir /myDirNew
# -cp:从HDFS的一个路径拷贝到HDFS的另一个路径
hadoop fs -cp /myDir/word.txt /myDirNew
# -mv:在HDFS目录中移动文件
hadoop fs -mv /myDir/word.txt /myDirNew
# -tail:显示一个文件的末尾1kb的数据
hadoop fs -tail /myDir/word.txt
# -rm:删除文件或文件夹
hadoop fs -rm /myDir/word.txt
# -rm -r:递归删除目录及目录里面内容
hadoop fs -rm -r /myDir
# -du统计文件夹的大小信息
# -s:仅显示当前文件夹信息,不包括内部文件
hadoop fs -du -s -h /myDir
hadoop fs -du -h /myDir
# -setrep:设置HDFS中文件的副本数量
hadoop fs -setrep 10 /myDir/word.txt
API操作
这里使用Java直接操作HDFS
环境准备
本地安装Hadoop
因为Java操作HDFS使用本地的Hadoop客户端去连接的,所以在Win11上装一个Hadoop依赖,让win环境模拟出一个Hadoop去连接虚机的HDFS
依赖下载,当然也可以去Gitee下载winutils,github上的版本可能不高。下载下来是个bin目录,主要使用的是bin目录下的winutils.exe,所以为其要添加上环境变量。
添加系统变量,bin目录我放在了D:\Develop\Hadoop_Dependency下
添加Path,即D:\Develop\Hadoop_Dependency\bin
重启电脑,使之生效
Java程序准备
Maven依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.4</version>
</dependency>
</dependencies>
源码展示
NodeInfo
NodeInfo展示了集群各个节点的URI连接信息,因为我的win环境配置了hadoop100 - hadoop102的host映射,所以uri直接用了主机名
package ltd.cmjava.data;
/**
* @ClassName UserInfo
* @Description TODO
* @Author 懂坚持的男人
* @Date 0:21 2023/1/17
* @Version 1.0
**/
public class NodeInfo {
public static final String PROTOCOL="hdfs://";
public static final String NAME_NODE="hadoop100";
public static final String NAME_NODE_PORT="8020";
public static final String NAME_NODE_URI=PROTOCOL+NAME_NODE+":"+NAME_NODE_PORT;
public static final String RESOURCE_MANAGER="hadoop101";
public static final String SECONDE_NAME_NODE="hadoop102";
}
UserInfo
主要指定了HDFS的用户,即cm,HDFS需要有个明确的用户才能访问
package ltd.cmjava.data;
/**
* @ClassName UserInfo
* @Description TODO
* @Author 懂坚持的男人
* @Date 0:21 2023/1/17
* @Version 1.0
**/
public class UserInfo {
public static final String USER="cm";
}
HdfsUtil
这个工具类展示了主要的文件操作:上传、下载、重命名和移动、删除文件和文件夹、查看文件详情、判断文件和文件夹
package ltd.cmjava.utils;
import ltd.cmjava.data.NodeInfo;
import ltd.cmjava.data.UserInfo;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.checkerframework.checker.units.qual.C;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* @ClassName HdfsUtil
* @Description TODO
* @Author 懂坚持的男人
* @Date 0:30 2023/1/17
* @Version 1.0
**/
@SuppressWarnings("all")
public class HdfsUtil {
// 配置HDFS
public static Configuration getConfiguration(Map<String, String> paras) {
Configuration configuration = new Configuration();
if (paras == null)
return configuration;
for (String key : paras.keySet()) {
configuration.set(key, paras.get(key));
}
return configuration;
}
// 获取文件系统
public static FileSystem getFileSystem(Map<String, String> paras) {
try {
Configuration configuration = getConfiguration(paras);
FileSystem fs = FileSystem.get(new URI(NodeInfo.NAME_NODE_URI), configuration, UserInfo.USER);
return fs;
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
return null;
}
// 创建文件夹
public static void mkdirs(String dir) {
// 配置文件系统
FileSystem fileSystem = HdfsUtil.getFileSystem(null);
// 创建目录
try {
fileSystem.mkdirs(new Path(dir));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (Objects.nonNull(fileSystem)) {
try {
fileSystem.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 上传文件
public static void upload(String from, String to, int replicationNum) {
HashMap<String, String> paras = new HashMap<>();
paras.put("dfs.replication", replicationNum + "");
FileSystem fs = getFileSystem(paras);
try {
// 上传文件
// 参数一:删除本地文件
// 参数二:覆盖HDFS文件
fs.copyFromLocalFile(false, true,new Path(from), new Path(to));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 下载文件
public static void download(String from, String to) {
FileSystem fs = getFileSystem(null);
// 执行下载操作
// boolean delSrc 指是否将原文件删除
// Path src 指要下载的文件路径
// Path dst 指将文件下载到的路径
// boolean useRawLocalFileSystem 是否开启文件校验
try {
fs.copyToLocalFile(false, new Path(from), new Path(to), true);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 移动文件
public static void move(String from, String to) {
FileSystem fs = getFileSystem(null);
try {
fs.rename(new Path(from), new Path(to));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 删除文件
public static void delete(String file) {
FileSystem fs = getFileSystem(null);
try {
// 参数二:是否递归
fs.delete(new Path(file), true);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 查看文件详情
public static void showFileDetail(String path) {
FileSystem fs = getFileSystem(null);
// 获取文件详情
RemoteIterator<LocatedFileStatus> listFiles = null;
try {
listFiles = fs.listFiles(new Path(path), true);
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("========" + fileStatus.getPath() + "=========");
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getOwner());
System.out.println(fileStatus.getGroup());
System.out.println(fileStatus.getLen());
System.out.println(fileStatus.getModificationTime());
System.out.println(fileStatus.getReplication());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getPath().getName());
// 获取块信息
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 判断文件或者文件夹
public static void showFileOrDir(String path) {
FileSystem fs = getFileSystem(null);
try {
FileStatus[] listStatus = fs.listStatus(new Path(path));
for (FileStatus fileStatus : listStatus) {
// 如果是文件
if (fileStatus.isFile()) {
System.out.println("file:" + fileStatus.getPath().getName());
} else {
System.out.println("directory:" + fileStatus.getPath().getName());
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
HdfsClient
HdfsClient就是测试类,调用HdfsUtil测试各类API操作
package ltd.cmjava;
import java.io.IOException;
import java.net.URISyntaxException;
import static ltd.cmjava.utils.HdfsUtil.*;
/**
* @ClassName HdfsClient
* @Description HDFS客户端
* @Author 懂坚持的男人
* @Date 0:08 2023/1/17
* @Version 1.0
**/
@SuppressWarnings("all")
public class HdfsClient {
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
String uploadDir="/test111";
String localDir="D:/Develop/workspace/Hadoop/src/main/resources";
String downDir=localDir+"/down";
String fileName="log4j.properties";
String fileName0="log4j0.properties";
String uploadFile=uploadDir+"/"+fileName;
String uploadFile0=uploadDir+"/"+fileName0;
String localFile=localDir+"/"+fileName;
String downFile=downDir+"/"+fileName;
mkdirs(uploadDir);
upload(localFile,uploadDir,2);
download(uploadFile,downFile);
move(uploadFile,uploadFile0);
delete(uploadFile0);
showFileDetail("/");
showFileOrDir("/");
}
}
评论区