树雾. 2024-03-31 00:25 采纳率: 0%
浏览 12

hdfs文件下载不到本地

求问哪里出现了问题,一直找不到问题所在,但是就是下载不到本地,进去只能看见一个空的test,也已经创建目录了

img


下面是运行报错的代码

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-31 00:25
    关注

    引自免费微信小程序:皆我百晓生

    在Hadoop中,testDownloadFileToLocal() 方法的主要目标是将名为 "test.txt" 的 HDFS 文件从一个 HDFS 实例下载到本地。下面是一种可能的解决方案,它使用 Java 代码,并通过 HadoopFS 模块和 FsClient 类实现文件下载。

    import com.google.common.io.*;
    import com.google.common.net.HttpHeaders;
    import com.google.common.net.MediaType;
    import com.google.common.net.URL;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.hdfs.MiniDFSCluster;
    import org.apache.hadoop.hdfs.security.UserGroupInformation;
    
    // Create a new mini cluster
    MiniDFSCluster dfs = new MiniDFSCluster.Builder(conf)
        .numDataNodes(2)
        .build();
    
    // Download the file to the specified local directory
    Path downloadDir = dfs.getDataNode().getURI("/testFile/test.txt").getPath();
    Path localFilePath = downloadDir.append("testLocal.txt");
    
    try {
        // Connect to the HDFS instance using FileUtil类
        FileSystem hdfs = dfs.getURI("/").toUri().toURL();
    
        // Create a FileChannel object to read the contents from the HDFS file
        Channel channel = hdfs.openChannel("readLocal");
        channel.configureBlocking(false);
    
        // Set the content type to CSV, which is supported by the hadoop native lib
        MediaType mediaType = MediaType.parse("text/csv");
       (channel.writeTo(localFilePath, mediaType));
    
        // Close the channel and return the downloaded file path
        channel.close();
        return localFilePath.toString();
    } catch (IOException e) {
        throw new RuntimeException("Failed to download file", e);
    }
    

    在这个解决方案中,我们首先创建了一个小型的分布式文件系统 (MiniDFSCluster),并指定了要将其数据节点数量设置为 2,这意味着我们将仅下载两个本地路径:一个是原始 HDFS 文件所在的 /testFile/test.txt,另一个是经过哈希替换后的 /testLocal.txt。然后,我们使用 FileUtil 类连接到这个集群中的某个节点。接着,我们创建一个 Channel 对象用于从 HDFS 中读取文件,我们配置其写入模式为 BlockingWriteLocal,这样可以确保在客户端程序运行期间直到文件写入完毕才关闭通道。接下来,我们设置文件类型为 CSV(CSV 是 Hadoop 自带的文件格式),并将其作为响应写入到本地路径 /testLocal.txt

    最后,我们关闭通道并将文件保存回本地。如果任何异常发生,我们会抛出一个 IOException 异常,表示下载文件失败。在这个情况下,我们可以捕获并处理这个异常,通常会提供关于错误信息和调试点的输出。

    注意:为了兼容 Hadoop 1.x 和 Hadoop 2.x,上述代码可能会需要进行一些修改,特别是 FileSystem.getURI("/")UserGroupInformation. 来支持 Hadoop 2.x。此外,如果你正在尝试使用 FsClient 版本的 Hadoop,也需要相应地调整初始化步骤,例如调用 client.create(), client.rename(), 等方法。在实际应用中,你可能还需要考虑到不同版本的 Hadoop 启动参数、文件权限等可能会影响下载行为的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 3月31日
  • 创建了问题 3月31日

悬赏问题

  • ¥20 Ubuntu18.04卸载Python2后无可视化界面问题
  • ¥15 php同一个单元格里多选提交,更新表格
  • ¥15 Vue 前端调用本地jar包有什么方法?
  • ¥15 基础的图像处理问题求解答
  • ¥50 全国两定智慧医保接口开发相关业务文档,以及技术实现流程文档
  • ¥15 idea做图书管理系统,要求如下
  • ¥15 最短路径分配法——多路径分配
  • ¥15 SQL server 2022安装程序(英语)无法卸载
  • ¥15 求一个nao机器人跳舞的程序
  • ¥15 anaconda下载后spyder内无法正常运行