Перемещение файлов в Hadoop с использованием Java API? - PullRequest
15 голосов
/ 01 апреля 2011

Я хочу перемещать файлы в HDFS с помощью API Java.Я не могу найти способ сделать это.Класс FileSystem, по-видимому, только хочет разрешить перемещение в и из локальной файловой системы ... но я хочу сохранить их в HDFS и переместить их туда.

Я что-то упустил?Единственный способ понять, как это сделать - это прочитать его из входного потока и выписать обратно ... и затем удалить старую копию.

Ответы [ 4 ]

18 голосов
/ 01 апреля 2011

Использовать FileSystem.rename () :

public abstract boolean rename(Path src, Path dst) throws IOException

Переименовывает путь src в путь dst. Может иметь место на локальном фс или на удалённой DFS.

Параметры:
src - путь для переименования
dst - новый путь после переименования
Возвращает:
true если переименование прошло успешно
Выдает:
IOException - при ошибке

4 голосов
/ 21 сентября 2017

Подход java.nio. * Может работать не всегда на HDFS. Поэтому нашел следующее решение, которое работает.

Перемещение файлов из одного каталога в другой с помощью org.apache.hadoop.fs.FileUtil.copy API

val fs = FileSystem.get(new Configuration())
        val conf = new org.apache.hadoop.conf.Configuration()
        val srcFs = FileSystem.get(new org.apache.hadoop.conf.Configuration())
        val dstFs = FileSystem.get(new org.apache.hadoop.conf.Configuration())
        val dstPath = new org.apache.hadoop.fs.Path(DEST_FILE_DIR)

        for (file <- fileList) {
          // The 5th parameter indicates whether source should be deleted or not
          FileUtil.copy(srcFs, file, dstFs, dstPath, true, conf)
1 голос
/ 29 июня 2011

Я думаю, FileUtilts replaceFile также решит эту задачу. http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/fs/FileUtil.html#replaceFile(java.io.File, java.io.File)

0 голосов
/ 10 января 2017
hdfsDirectory="hdfs://srcPath"   
 val conf = new org.apache.hadoop.conf.Configuration()
        val src:Path = new org.apache.hadoop.fs.Path(hdfsDirectory)
        val fs = FileSystem.get(src.toUri,conf)
        val srcPath: Path = new Path("hdfs://srcPath")
        val srcFs =FileSystem.get(srcPath.toUri,conf)
        val dstPath:Path =new Path("hdfs://targetPath/")
        val dstFs =FileSystem.get(dstPath.toUri,conf)
        val exists = fs.exists(new org.apache.hadoop.fs.Path(hdfsDirectory))
        val status:Array[FileStatus] = fs.listStatus(new Path(hdfsDirectory))
        if (status.length>0) {
          status.foreach(x => {
            println("My files: " + x.getPath)
            FileUtil.copy(srcFs, x.getPath, dstFs, dstPath, true, conf)
            println("Files moved !!" +x.getPath)
          }
          )}
        else{
          println("No Files Found !!")
        }
...