3

有沒有什麼方法可以將我的Java jar文件寫入到我的reduce文件將被寫入的S3文件夾中?我試過類似的東西:從AWS上的EMR上的jar中寫入S3中的文件

FileSystem fs = FileSystem.get(conf); 
    FSDataOutputStream FS = fs.create(new Path("S3 folder output path"+"//Result.txt"));   

    PrintWriter writer = new PrintWriter(FS); 
    writer.write(averageDelay.toString()); 
    writer.close(); 
    FS.close(); 

這裏Result.txt是我想寫的新文件。

+0

順便說一句,爲什麼不能用[DistributedCache(http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html)? 它與您正在做的方法一樣便攜,但對於長時間運行的作業可能更有用 – aldrinleal

回答

0

回答我的問題: -

我發現我犯錯誤應通過S3的URI的文件夾路徑文件系統對象如下圖所示: -

FileSystem fileSystem = FileSystem.get(URI.create(otherArgs[1]),conf); 
FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path(otherArgs[1]+"//Result.txt"));  
PrintWriter writer = new PrintWriter(fsDataOutputStream); 
writer.write("\n Average Delay:"+averageDelay); 
writer.close(); 
fsDataOutputStream.close(); 
+4

代碼中的conf是什麼?什麼是'otherArgs [1]'?這段代碼對於稍後發現問題的人沒有幫助 – BlackSheep

0
FileSystem fileSystem = FileSystem.get(URI.create(otherArgs[1]),new JobConf(<Your_Class_Name_here>.class)); 
FSDataOutputStream fsDataOutputStream = fileSystem.create(new  
Path(otherArgs[1]+"//Result.txt"));  
PrintWriter writer = new PrintWriter(fsDataOutputStream); 
writer.write("\n Average Delay:"+averageDelay); 
writer.close(); 
fsDataOutputStream.close(); 

這是怎麼了我在上面的代碼塊中處理了conf變量,它像魅力一樣工作。

0

下面是使用AWS S3 putObject直接與字符串緩衝區一起使用Java的另一種方法。

... AmazonS3 s3Client; 

public void reduce(Text key, java.lang.Iterable<Text> values, Reducer<Text, Text, Text, Text>.Context context) throws Exception { 

    UUID fileUUID = UUID.randomUUID(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd"); 
    sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 

    String fileName = String.format("nightly-dump/%s/%s-%s",sdf.format(new Date()), key, fileUUID); 
    log.info("Filename = [{}]", fileName); 

    String content = ""; 
    int count = 0; 
    for (Text value : values) { 
     count++; 
     String s3Line = value.toString(); 
     content += s3Line + "\n"; 
    } 
    log.info("Count = {}, S3Lines = \n{}", count, content); 


    PutObjectResult putObjectResult = s3Client.putObject(S3_BUCKETNAME, fileName, content); 
    log.info("Put versionId = {}", putObjectResult.getVersionId()); 

    reduceWriteContext("1", "1"); 

    context.setStatus("COMPLETED"); 
}