Spark OutOfMemoryError:简单S3列表代码上的Java堆空间

时间:2016-08-05 18:00:02

标签: apache-spark amazon-s3 pyspark

我有一个包含1500万个小文件的S3存储桶。这些文件具有相同的前缀和UUID后缀。为了将读取文件所需的列表并行化为RDD,我创建了一组~1260可能的前两个字母,并为每个字母发送单独的列表请求。但是,在尝试生成键列表的RDD时,我遇到了经典的OutofMemory错误。这里的代码看似相对简单 - 为什么我遇到这些错误?

#Create prefixes:
import string, itertools
prefix_chars=range(0,10)+list(string.ascii_lowercase)
prefixes=[]
for i in itertools.permutations(prefix_chars, 2): 
    prefix=''
    for x in i: prefix=prefix+str(x)
    prefixes.append(prefix)

def listBucket(bucket_name, file_prefix):
    import boto
    s3 = boto.connect_s3()
    bucket = s3.get_bucket(bucket_name)
    keylist=[]
    for i in bucket.list(file_prefix): keylist.append(i)
    return keylist

getKeys=sc.parallelize(prefixes).repartition(len(prefixes)).flatMap(lambda x: listBucket(bucket,file_prefix)).collect()

我用下面的conf开始火花:

conf = (SparkConf()
         .set("spark.executor.instances",50)
         .set("spark.executor.cores",10)
         .set("spark.executor.memory", "22g")
         .set("spark.akka.frameSize","100")
         .set("spark.driver.maxResultSize","24g")
         .set("spark.driver.memory","40g"))

sc = SparkContext(conf = conf)

我正在运行EMR,Spark版本1.3(对于引导程序依赖项,我不得不使用旧版本的EMR和Spark)。

0 个答案:

没有答案