我需要将一个文件夹从本地文件系统复制到HDFS。我找不到任何将文件夹(包括其所有子文件夹)移动到 HDFS 的示例
$ hadoop fs -copyFromLocal /home/ubuntu/Source-Folder-To-Copy HDFS-URI
你可以尝试:
hadoop fs -put /path/in/linux /hdfs/path
甚至
hadoop fs -copyFromLocal /path/in/linux /hdfs/path
默认情况下,
put
和copyFromLocal
都会递归地将目录上传到HDFS。
hdfs dfs -put <localsrc> <dest>
在将文件放入 HDFS 之前检查源和目标
[cloudera@quickstart ~]$ ll files/
total 132
-rwxrwxr-x 1 cloudera cloudera 5387 Nov 14 06:33 cloudera-manager
-rwxrwxr-x 1 cloudera cloudera 9964 Nov 14 06:33 cm_api.py
-rw-rw-r-- 1 cloudera cloudera 664 Nov 14 06:33 derby.log
-rw-rw-r-- 1 cloudera cloudera 53655 Nov 14 06:33 enterprise-deployment.json
-rw-rw-r-- 1 cloudera cloudera 50515 Nov 14 06:33 express-deployment.json
[cloudera@quickstart ~]$ hdfs dfs -ls
Found 1 items
drwxr-xr-x - cloudera cloudera 0 2017-11-14 00:45 .sparkStaging
使用
-put
或 -copyFromLocal
命令复制文件 HDFS
[cloudera@quickstart ~]$ hdfs dfs -put files/ files
在HDFS中验证结果
[cloudera@quickstart ~]$ hdfs dfs -ls
Found 2 items
drwxr-xr-x - cloudera cloudera 0 2017-11-14 00:45 .sparkStaging
drwxr-xr-x - cloudera cloudera 0 2017-11-14 06:34 files
[cloudera@quickstart ~]$ hdfs dfs -ls files
Found 5 items
-rw-r--r-- 1 cloudera cloudera 5387 2017-11-14 06:34 files/cloudera-manager
-rw-r--r-- 1 cloudera cloudera 9964 2017-11-14 06:34 files/cm_api.py
-rw-r--r-- 1 cloudera cloudera 664 2017-11-14 06:34 files/derby.log
-rw-r--r-- 1 cloudera cloudera 53655 2017-11-14 06:34 files/enterprise-deployment.json
-rw-r--r-- 1 cloudera cloudera 50515 2017-11-14 06:34 files/express-deployment.json
如果您从本地复制文件夹,那么它会将文件夹及其所有子文件夹复制到 HDFS。
要将文件夹从本地复制到 hdfs,您可以使用
hadoop fs -put localpath
或
hadoop fs -copyFromLocal localpath
或
hadoop fs -put localpath hdfspath
或
hadoop fs -copyFromLocal localpath hdfspath
注:
如果未指定 hdfs 路径,则文件夹副本将复制到与该文件夹同名的 hdfs。
从 hdfs 复制到本地
hadoop fs -get hdfspath localpath
您可以使用:
1.从本地文件加载数据到HDFS
语法:$hadoop fs –copyFromLocal
EX: $hadoop fs –copyFromLocal localfile1 HDIR
2。将数据从 HDFS 复制到本地
系统:$hadoop fs –copyToLocal < new file name>
EX: $hadoop fs –copyToLocal hdfs/文件名 myunx;
要将文件夹文件从本地复制到hdfs,可以使用以下命令
hadoop fs -put /path/localpath /path/hdfspath
或
hadoop fs -copyFromLocal /path/localpath /path/hdfspath
导航到您可以执行 hadoop 命令的“/install/hadoop/datanode/bin”文件夹或路径:
将文件放入 HDFS: 格式:hadoop fs -put "本地系统路径"/filename.csv "HDFS目标路径"
例如)./hadoop fs -put /opt/csv/load.csv /user/load
这里 /opt/csv/load.csv 是我本地 Linux 系统的源文件路径。
/user/load 表示“hdfs://hacluster/user/load”中的 HDFS 集群目标路径
将文件从 HDFS 获取到本地系统: 格式:hadoop fs -get "/HDFSsourcefilepath" "/localpath"
例如)hadoop fs -get /user/load/a.csv /opt/csv/
执行上述命令后,HDFS中的a.csv将被下载到本地linux系统的/opt/csv文件夹中。
上传的文件也可以通过 HDFS NameNode Web UI 看到。
使用以下命令 -
hadoop fs -copyFromLocal <local-nonhdfs-path> <hdfs-target-path>
hadoop fs -copyToLocal <hdfs-input-path> <local-nonhdfs-path>
或者您还可以使用spark FileSystem库来获取或放置hdfs文件。
希望这对您有帮助。
你也可以使用java多线程来复制它,
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MultiThreadFileCopy {
private static final int THREAD_COUNT = 10;
public static void main(String[] args) throws InterruptedException {
String sourceDir = "/path/to/source/directory";
String targetDir = "/path/to/target/directory";
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);
try {
Files.walk(Paths.get(sourceDir))
.filter(Files::isRegularFile)
.forEach(sourcePath -> executorService.submit(() -> {
try {
copyFile(sourcePath.toFile(), new File(targetDir, sourcePath.toString().substring(sourceDir.length())));
} catch (IOException e) {
System.err.println("Failed to copy file: " + sourcePath + " due to " + e.getMessage());
}
}));
} catch (IOException e) {
System.err.println("Failed to traverse directory: " + sourceDir + " due to " + e.getMessage());
}
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.DAYS);
}
private static void copyFile(File source, File target) throws IOException {
target.getParentFile().mkdirs(); // Ensure the parent directories exist
try (FileChannel sourceChannel = new FileInputStream(source).getChannel();
FileChannel targetChannel = new FileOutputStream(target).getChannel()) {
targetChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
}
}
}