如何使用Spark从S3中提取数据

时间:2017-07-14 13:01:49

标签: scala amazon-web-services apache-spark amazon-s3

我在AWS S3存储桶中有一堆包含时间和空间相关的dats的csv文件。这些文件以5分钟的粒度为时间戳前缀。 当尝试使用Apache Spark从AWS EMR访问它们并尝试过滤时间和空间时,即使是强大的集群(5 x r3.8xlarge)也会崩溃。 I的数据试图用广播连接进行过滤。 位置是具有用户ID,时间戳和移动单元信息的类,我尝试与单元位置信息(segmentDF)连接以仅过滤所需的那些记录。

我需要进一步处理这些记录,这里只是尝试将它们保存为镶木地板。我认为必须有一种更有效的方法,从将数据存储在S3存储桶中开始。任何想法都表示赞赏。

http://tech.kinja.com/how-not-to-pull-from-s3-using-apache-spark-1704509219提出了一种替代且更快的方式从spark访问S3存储桶,我无法实现(参见下面的代码和错误代表)。

"com.google.android.gms.ads.AdActivity"

后者以错误 \\ Scala code for the filtering val locationDF = sc.textFile(s"bucket/location_files/201703*") .map(line => { val l = new Location(line) (l.id, l.time, l.cell) }) .toDF("id", "time", "cell") val df = locationDF.join(broadcast(segmentDF), Seq("cell"), "inner").select($"id", $"time", $"lat", $"lng", $"cellName").repartition(32) df.write.save("somewhere/201703.parquet") \\ Alternative way of accessing S3 keys import com.amazonaws.services.s3._, model._ import com.amazonaws.auth.BasicAWSCredentials import com.amazonaws.auth.DefaultAWSCredentialsProviderChain val credentials = new DefaultAWSCredentialsProviderChain().getCredentials val request = new ListObjectsRequest() request.setBucketName("s3-eu-west-1.amazonaws.com/bucket") request.setPrefix("location_files") request.setMaxKeys(32000) def s3 = new AmazonS3Client(new BasicAWSCredentials(credentials.getAWSAccessKeyId, credentials.getAWSSecretKey)) val objs = s3.listObjects(request) sc.parallelize(objs.getObjectSummaries.map(_.getKey).toList) .flatMap { key => Source.fromInputStream(s3.getObject(bucket, key).getObjectContent: InputStream).getLines }

结束

0 个答案:

没有答案