Загрузка каталога в виде архивного файла из Elastic MapReduce на S3 - PullRequest
2 голосов
/ 31 января 2011

Я хотел бы загрузить каталог из локальной файловой системы EMR в s3 в виде архивного файла.

Есть ли лучший способ приблизиться к этому, чем метод, который я сейчас использую?

Можно ли вернуть ZipOutputStream в качестве выхода редуктора?

Спасибо

zipFolderAndUpload("target", "target.zip", "s3n://bucketpath/");


static public void zipFolderAndUpload(String srcFolder, String zipFile, String dst) throws Exception {

    //Zips a directory
    FileOutputStream fileWriter = new FileOutputStream(zipFile);
    ZipOutputStream zip = new ZipOutputStream(fileWriter);
    addFolderToZip("", srcFolder, zip);
    zip.flush();
    zip.close();

    // Copies the zipped file to the s3 filesystem,
    InputStream in = new BufferedInputStream(new FileInputStream(zipFile));
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(URI.create(dst+zip), conf);
    OutputStream out = fs.create(new Path(dst+zip));
    IOUtils.copyBytes(in, out, 4096, true);

}

static private void addFileToZip(String path, String srcFile, ZipOutputStream zip) throws Exception {

    File folder = new File(srcFile);
    if (folder.isDirectory()) {
        addFolderToZip(path, srcFile, zip);
    } else {
        byte[] buf = new byte[1024];
        int len;
        FileInputStream in = new FileInputStream(srcFile);
        zip.putNextEntry(new ZipEntry(path + "/" + folder.getName()));
        while ((len = in.read(buf)) > 0) {
            zip.write(buf, 0, len);
        }
    }
}

static private void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws Exception {
    File folder = new File(srcFolder);

    for (String fileName : folder.list()) {
        if (path.equals("")) {
            addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip);
        } else {
            addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip);
        }
    }
}

1 Ответ

4 голосов
/ 31 января 2011

Подход, который вы используете, выглядит хорошо.Если вы обнаружите, что он слишком медленный, потому что он однопоточный, то вы можете создать свою собственную реализацию Hadoop OutputFormat, которая записывает в zip-файлы.

Одна вещь, о которой вы должны быть осторожны, это то, что JavaРеализация ZipOutputFormat в SE не поддерживает Zip64, что означает, что он не поддерживает ZIP-файлы размером более 4 ГБ.Существуют и другие реализации Java для ZIP, такие как TrueZIP.

...