hadoop 将本地文件系统文件夹复制到 HDFS

问题描述 投票:0回答:8

我需要将一个文件夹从本地文件系统复制到HDFS。我找不到任何将文件夹(包括其所有子文件夹)移动到 HDFS 的示例

$ hadoop fs -copyFromLocal /home/ubuntu/Source-Folder-To-Copy HDFS-URI

hadoop hdfs
8个回答
116
投票

你可以尝试:

hadoop fs -put /path/in/linux /hdfs/path

甚至

hadoop fs -copyFromLocal /path/in/linux /hdfs/path

默认情况下,

put
copyFromLocal
都会递归地将目录上传到HDFS。


47
投票

简而言之

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

32
投票

如果您从本地复制文件夹,那么它会将文件夹及其所有子文件夹复制到 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

3
投票

您可以使用:

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;


2
投票

要将文件夹文件从本地复制到hdfs,可以使用以下命令

hadoop fs -put /path/localpath  /path/hdfspath

hadoop fs -copyFromLocal /path/localpath  /path/hdfspath

1
投票

导航到您可以执行 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 看到。


1
投票

使用以下命令 -

hadoop fs -copyFromLocal <local-nonhdfs-path> <hdfs-target-path>

hadoop fs -copyToLocal   <hdfs-input-path> <local-nonhdfs-path>

或者您还可以使用spark FileSystem库来获取或放置hdfs文件。

希望这对您有帮助。


0
投票

你也可以使用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());
        }
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.