2011-01-31 12 views
2

EMRローカルファイルシステムからzipファイルとしてs3にディレクトリをアップロードしたいと思います。Elastic MapReduceからS3へのZIPファイルとしてのディレクトリのアップロード

私が現在使っている方法よりも、これにアプローチする方がいいですか?

Reducerの出力として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); 
     } 
    } 
} 

答えて

4

あなたが取っているアプローチが正常に見えます。シングルスレッドなので速度が遅すぎると判明した場合は、Zipファイルに書き込む独自のHadoop OutputFormat実装を作成することができます。

Java SEのZipOutputFormatの実装ではZip64がサポートされていないため、サイズが4GBを超えるZIPファイルはサポートされません。 TrueZIPのようなZIPのJava実装もあります。

+0

すごい、ヒントのおかげで。 – patrickandroid

関連する問題