Spark SQL 작은 파일 문제 OPPO 솔 루 션
Spark SQL 작은 파일 은 hdfs block 블록 크기 보다 파일 크기 가 현저히 작은 파일 을 말 합 니 다.너무 많은 작은 파일 은 HDFS 에 심각 한 성능 병목 을 가 져 오고 작업 의 안정 과 클 러 스 터 유지 에 큰 도전 을 가 져 올 수 있 습 니 다.
일반적으로 Hive 를 통 해 배 치 된 MR 작업 은 다음 과 같은 작은 파일 을 합 친 매개 변 수 를 간단하게 설정 하여 작업 에 발생 하 는 작은 파일 문 제 를 해결 할 수 있 습 니 다.
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=xxxx;
set hive.merge.smallfiles.avgsize=xxx;
그러나 우리 가 오프라인 스케줄 링 임 무 를 Hive 에서 Spark 로 점차적으로 옮 기 는 과정 에서 Spark 자체 가 작은 파일 합병 기능 을 지원 하지 않 기 때문에 작은 파일 문제 가 날로 심각 해 지고 클 러 스 터 안정성 에 큰 영향 을 주 며 우리 의 이전 작업 을 방해 했다.
작은 파일 문 제 를 해결 하기 위해 저 희 는 처음에 파 라 메 터 를 계속 조정 하고 후기 코드 개발 등 다양한 단 계 를 거 쳐 간단 한 공 유 를 해 드 렸 습 니 다.
1. 스파크 가 왜 작은 파일 을 만 들 었 는 지
Spark 에서 생 성 된 파일 의 수량 은 RDD 에서 partition 의 수량 과 표 파 티 션 의 수량 에 달 려 있 습 니 다.여기 서 두 개의 파 티 션 개념 이 다 릅 니 다. RDD 의 파 티 션 은 작업 병행 도와 관련 되 고 표 파 티 션 은 Hive 의 파 티 션 수 입 니 다.생 성 된 파일 수 는 일반적으로 RDD 파 티 션 수 와 표 파 티 션 의 곱 입 니 다.따라서 작업 병행 도가 높 거나 파 티 션 수가 많 을 때 작은 파일 이 많이 생 성 된다.
따라서 생 성 된 파일 수 를 매개 변수 조정 으로 줄 여야 한다 면 마지막 단계 RDD 의 파 티 션 수 를 줄 여 도달 할 수 밖 에 없다 (파 티 션 수 를 줄 여 역사 데이터 와 상하 관계 로 제한 하고 수정 하기 어렵다).
2. 지역 사회 버 전의 매개 변 수 를 바탕 으로 조정 하 는 방안
2.1 Shuffle 연산 자가 없 는 간단 한 정적 파 티 션 SQL
이러한 SQL 은 비교적 간단 합 니 다. 주로 filter 상류 표 의 일부 데 이 터 를 하류 표 에 기록 하거나 두 장의 표 가 간단 한 UNION 에서 시작 하 는 작업 입 니 다. 이러한 작업 의 파 티 션 수 는 주로 파일 을 읽 을 때 Partition 수 에 의 해 결 정 됩 니 다.
spark.sql.files.maxPartitionBytes;
spark.sql.files.opencostinbytes;
spark.default.parallelism;
그 관 계 는 다음 그림 과 같 기 때문에 이 세 개의 매개 변 수 를 조정 하여 데이터 의 블록 을 입력 하여 조정 할 수 있다.
이 문 제 를 간단하게 거 칠 게 해결 하기 위해 우 리 는 이러한 SQL 에 repartition 의 hint 를 추가 하여 새로운 shuffle 을 도입 하여 파일 의 수량 이 고정 값 임 을 보증 합 니 다.
2.2 Shuffle 연산 자가 있 는 정적 파 티 션 작업
ISSUE SPARK - 9858 에 새로운 인자 가 도입 되 었 습 니 다: spark. sql. adaptive. shuffle. targetPost Shuffle InputSize,
후기 에 spark adaptive 를 바탕 으로 이 매개 변 수 를 한층 더 강화 하여 파 티 션 의 수량 을 동적 으로 조정 할 수 있 습 니 다. 가능 한 한 모든 task 처리 targetPostShuffle Input Size 의 데 이 터 를 확보 할 수 있 기 때문에 이 매개 변 수 는 생 성 된 파일 의 수량 을 어느 정도 제어 할 수 있 습 니 다.
2.3 동적 분할 작업
동적 파 티 션 작업 은 파 티 션 이라는 변수 가 존재 하기 때문에 rdd 쪽 의 파 티 션 수 를 단순 하 게 조정 하면 전체 파일 수 를 제어 하기 어렵 습 니 다.
hive 에서 저 희 는 hive. optimize. sort. dynamic. partition 을 설정 하여 동적 파 티 션 에 파일 이 너무 많아 서 작업 을 수행 할 때 task 노드 가 자주 oom 하 는 상황 을 완화 할 수 있 습 니 다.이러한 매개 변 수 는 새로운 shuffle 을 도입 하여 데 이 터 를 재 정렬 하고 같은 partition 을 같은 task 에 나 누 어 처리 하여 하나의 task 가 여러 개의 파일 핸들 을 동시에 가지 고 있 는 것 을 피 할 수 있 습 니 다.
따라서 우 리 는 이러한 사상 을 빌려 distribute by 문 구 를 사용 하여 sql 을 수정 하여 파일 의 수량 을 제어 할 수 있다.일반적으로 각 파 티 션 에 N 개 이상 의 파일 을 만 들 지 않 으 려 면 SQL 말미 에 DISTRIBUTE BY [동적 파 티 션 열], ceil (rand () * N) 을 추가 할 수 있 습 니 다.
3. 파일 을 통합 할 수 있 는 commitProtocol 방안 을 자체 연구 합 니 다.
여러 가 지 를 종합해 보면 모든 방법 에 어느 정도 폐단 이 존재 하고 많은 규칙 도 실제 사용 과정 에서 업무 측 에 큰 어려움 을 준다.
그래서 우 리 는 spark 쪽 에서 hive 와 유사 한 작은 파일 통합 체 제 를 실현 하고 싶 습 니 다.몇 가지 가능 한 방안 선택 에서 우 리 는 최종 적 으로 spark. sql. sources. comitProtocolclass 를 다시 쓰 는 방법 을 선택 했다.
한편, 이 방안 은 Spark 코드 에 침입 하지 않 아 Spark 소스 코드 의 유지 에 편리 하 다. 다른 한편, 이 방안 은 업무 자 에 게 우호 적 이 고 set 명령 을 통 해 동적 으로 설정 할 수 있 으 며 문제 가 발생 하면 스크롤 백 하 는 것 도 매우 편리 하 다.업무 측 이 사용 하 는 과정 에서 spark. sql. sources. comitProtocolclass 를 간단하게 설정 하면 작은 파일 합병 여 부 를 제어 할 수 있 습 니 다.
작은 파일 통합 파 라 메 터 를 열 면 commt 단계 에서 생 성 된 모든 파일 을 가 져 와 새로운 job 를 도입 하여 이 파일 들 을 처리 합 니 다.우선 첫 번 째 job 에서 spark. copact. smallfile. size 보다 작은 모든 크기 의 파일 을 가 져 왔 습 니 다. 검색 이 끝 난 후에 spark. copact. size 매개 변수 값 에 따라 조합 파일 을 가 져 오고 두 번 째 job 에서 이 파일 들 을 합 쳤 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spark 프로그래밍 기본 사항(Python 버전)참조 웹사이트: Hadoop 환경이 있어야 합니다. 내 다른 블로그를 읽을 수 있습니다. 2.Spark 환경 변수 파일 수정 spark env SH 파일(vi ./conf/spark-env.sh)을 편집하고 첫 번째...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.