올바르게 작동하는 Python으로 Spark 프로그램을 작성했습니다.값이 RDD에 있는지 확인하십시오.
그러나 메모리 소비면에서 비효율적입니다. & 그것을 최적화하려고합니다. AWS EMR에서 실행 중이며 EMR은 너무 많은 메모리를 사용하여 작업을 종료합니다.
Lost executor 11 on ip-*****: Container killed by YARN for exceeding memory limits. 11.4 GB of 10.4 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
나는이 메모리 문제는 나중 단계에서, 내가 어떤 값이 목록에 있는지 테스트 할 필요가 있기 때문에 (즉 .collect 사용하여()) 내 RDDs를 수집하고 여러 인스턴스에 있다는 사실 때문이라고 생각 그 RDD로 만들어 졌는지 아닌지.
그래서, 현재 내 코드는 다음과 같습니다 : 언젠가 나중에 코드
if word in myrdd:
mylist.append(word)
myrdd2 = data2.map(lambda word: (word,1)) \
.reduceByKey(lambda a,b: a+b) \
.filter(lambda (a, b): b >= 5) \
.map(lambda (a,b) : a) \
.collect()
if word in myrdd2:
mylist2.append(word)
후 나는이 패턴을 반복하고 여러 번에
myrdd = data.map(lambda word: (word,1)) \
.reduceByKey(lambda a,b: a+b) \
.filter(lambda (a, b): b >= 5) \
.map(lambda (a,b) : a) \
.collect()
하고 있습니다.
먼저 RDD를 수집하지 않고 작동
if word in myrdd:
do something
을 할 수있는 방법이 있나요?
rdd.contains()와 같은 기능이 있습니까?
추신 : 나는 메모리에 아무것도 캐싱하지 않을 것입니다. 내 스파크 상황은 다음과 같습니다 YARN에서
jobName = "wordcount"
sc = SparkContext(appName = jobName)
......
......
sc.stop()
이 .collect 사용하지 않는 : RDD 그냥이 값을 기준으로 필터링 예를 들어,
count
또는first
를 사용하여 확인 후 일부 값이 포함되어 있는지 확인하려면, http://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD.reduceByKey마지막 :
numPartitions
매개 변수를 봐() 그것은 더 큰 데이터 세트를 가지고 있다면 문제를 만들 모든 데이터를 드라이버로 가져올 것입니다. myrdd2.foreachRDD를 사용하여 현재 값이 – Backtrackword = sc.broadcast ([w1, w2, w3])인지 확인하십시오 valuepresent = myrdd.filter {lambda : x in word} 이것도 이와 비슷한 해결 방법입니다. – Backtrack