【问题标题】:How to upload a multiple files from hdfs to single s3 file?如何将多个文件从 hdfs 上传到单个 s3 文件?
【发布时间】:2014-11-07 17:41:12
【问题描述】:

我有一个 hadoop 作业,可以将许多部分输出到 hdfs,例如某个文件夹。

例如:

/output/s3/2014-09-10/part...

最好的方法是什么,使用s3 java api将这些部分上传到s3中的signle文件

例如

s3:/jobBucket/output-file-2014-09-10.csv

作为一种可能的解决方案,可以选择合并部分并将结果写入 hdfs 单个文件,但这会创建双 I/O。 使用单个减速器也不是选项

谢谢,

【问题讨论】:

    标签: java hadoop amazon-s3


    【解决方案1】:

    Spark 进程的代码段

    void sparkProcess(){
        SparkConf sparkConf = new SparkConf().setAppName("name");
        JavaSparkContext sc = new JavaSparkContext(sparkConf)
        Configuration hadoopConf = sc.hadoopConfiguration();
        hadoopConf.set("fs.s3.awsAccessKeyId", awsAccessKey);
        hadoopConf.set("fs.s3.awsSecretAccessKey", awsSecretKey);
        String folderPath = "s3://bucket/output/folder";
        String mergedFilePath = "s3://bucket/output/result.txt";
        BatchFileUtil.copyMerge(hadoopConf, folderPath, mergedFilePath);
    }    
    
    public static boolean copyMerge(Configuration hadoopConfig, String srcPath, String dstPath) throws IOException, URISyntaxException {
        FileSystem hdfs = FileSystem.get(new URI(srcPath), hadoopConfig);
        return FileUtil.copyMerge(hdfs, new Path(srcPath), hdfs, new Path(dstPath), false, hadoopConfig, null);
    }
    

    【讨论】:

      【解决方案2】:

      尝试使用FileUtil#copyMerge 方法,它允许您在两个文件系统之间复制数据。我还发现 S3DistCp tool 可以将数据从 HDFS 复制到 Amazon S3。您可以指定--groupBy,(.*) 选项来合并文件。

      【讨论】:

        【解决方案3】:

        使用 java hdfs api 读取文件,然后使用标准 Java 流类型的东西转换为 InputStream,然后使用

        http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/PutObjectRequest.html

        另见

        https://stackoverflow.com/a/11116119/1586965

        【讨论】:

          猜你喜欢
          • 2016-04-12
          • 2023-03-05
          • 1970-01-01
          • 2018-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-03
          • 1970-01-01
          相关资源
          最近更新 更多