首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 程式上傳本地檔案至 HDFS 並顯示進度條實作

     編輯:Java 相關知識

核心代碼

package com.clq.hdfs;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class FileCopyWithProgress {
    public static void main(String[] args) throws IOException {
        String localSrc = args[0];
        String dst = args[1];

        InputStream in = new BufferedInputStream(new FileInputStream(localSrc));
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(dst), conf);

        FSDataOutputStream out = fs.create(new Path(dst), new Progressable() {
            @Override
            public void progress() {
                System.out.print("."); // 每傳輸一塊打印一個點
            }
        });

        IOUtils.copyBytes(in, out, conf, true); // 最後參數 true 表示關閉流
    }
}

打包執行

# 打成 jar:mapreducer.jar
hadoop jar mapreducer.jar /local/path/file.jar hdfs://ubuntu:9000/target/path/

常見異常處理

Exception: Cannot create /out06; already exists as a directory

目標路徑在 HDFS 已存在且為目錄,換一個不存在的檔案路徑即可。

關鍵點解析

  • `Progressable` 介面回調 `progress()` 實現進度顯示
  • `IOUtils.copyBytes` 封裝緩衝複製與資源關閉邏輯
  • 需將 Hadoop 相關 jar 包含在 classpath 或打入 fat-jar

結語

幾十行代碼即可實現帶進度的 HDFS 上傳,適合遷移大檔案或離線導數據場景。

出處:bianceng.cn

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved