我有一个包含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)。