스파크의 최적화는 꽤 잘 되어 있는 것 같은데, 내가 예상한 바 대로 최적화를 이미 수행하고 있다.
흔하게 하는 작업인 map->filter->groupByKey를 수행한다고 가정하자. 사실 이것은 내 개인의 노력으로 mapPartitions로 합칠 수 있다. 3번 일할 것을 1번 일하면 되니까 이렇게 합치면 더 빠르지 않을까?
...하고 hue를 보니 이미 지가 다 합쳐서 일하고 있다.
상식적으로 이렇다.
partitionBy로 키를 지들끼리 뭉쳐서 클러스터로 할당해 놓는다. 그 다음에 mapPartitions에는 키가 같은 놈들끼리 통으로 들어오므로 해시맵 같은 걸로 기억하면서 맵하고 필터해서 모으면 된다. 문제는 이때 한 줄씩 빼고 넣으면서 파일 연산은 할 수 없고 메모리를 쓴다는 것인데, 사전에 파일 크기를 알려주면서 파티션의 갯수를 지정하고 자기가 감당할 메모리를 쓰면 된다. 스왑이나 물리 캐시로 넘어가면 그 때 부턴 느려지는 것이고. 상식적으로 생각 할 수 있는 선에서 이미 다 하고 있다.
즉, 내 편한 대로 짜면 스파크가 알아서 최적화 해준다.
2.2.0, pyspark 기준인데 스칼라라면 아마도 더 낫겠지.