如何通过http请求将S3中的多个压缩文件读取到单个RDD中?

时间:2018-11-08 10:36:05

标签: java apache-spark amazon-s3 common-crawl

我必须像这样下载许多存储在S3上的压缩文件:

crawl-data/CC-MAIN-2018-43/segments/1539583508988.18/robotstxt/CC-MAIN-20181015080248-20181015101748-00000.warc.gz
crawl-data/CC-MAIN-2018-43/segments/1539583508988.18/robotstxt/CC-MAIN-20181015080248-20181015101748-00001.warc.gz

要下载它们,您必须添加前缀https://commoncrawl.s3.amazonaws.com/

我必须下载并解压缩文件,然后将内容组装为单个RDD。

类似的东西:

JavaRDD<String> text = 
    sc.textFile("https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2018-43/segments/1539583508988.18/robotstxt/CC-MAIN-20181015080248-20181015101748-00000.warc.gz");

我想用spark编写此代码:

    for (String key : keys) {
        object = s3.getObject(new GetObjectRequest(bucketName, key));

        gzipStream = new GZIPInputStream(object.getObjectContent());
        decoder = new InputStreamReader(gzipStream);
        buffered = new BufferedReader(decoder);

        sitemaps = new ArrayList<>();

        String line = buffered.readLine();

        while (line != null) {
            if (line.matches("Sitemap:.*")) {
                sitemaps.add(line);
            }
            line = buffered.readLine();
        }

1 个答案:

答案 0 :(得分:0)

要从S3中读取内容,您可以执行以下操作:

sc.textFiles("s3n://path/to/dir")

如果dir包含您的gzip文件,它们将被压缩并合并为一个RDD。如果您的文件不是这样直接位于目录的根目录:

/root
  /a
    f1.gz
    f2.gz
  /b
    f3.gz

甚至是这个:

/root
  f3.gz
  /a
    f1.gz
    f2.gz

然后,您应该使用sc.textFiles("s3n://path/to/dir/*")这样的通配符,并且spark将在dir及其子目录中递归查找文件。

请注意this。通配符可以使用,但是您可能会在生产中的S3上遇到延迟问题,并且可能想使用AmazonS3Client检索路径。