Spark SQL 의 전체적인 논리 적 해석 실현

7054 단어 SparkSQL논리학
1.sql 문장의 모듈 분석
   우리 가 검색 어 를 쓸 때 보통 세 부분,select 부분,from 데이터 소스 부분,where 제한 조건 부분 을 포함 합 니 다.이 세 부분의 내용 은 sql 에 전문 적 인 이름 이 있 습 니 다.

우리 가 sql 을 쓸 때 위의 그림 에서 보 듯 이 논리 적 해석 을 할 때 sql 을 세 부분 으로 나 눕 니 다.procject,DataSource,Filter 모듈 은 실행 부분 을 생 성 할 때 그들 을 Result 모듈 이 라 고 부 릅 니 다.
DataSource 모듈 과 Operation 모듈.
그러면 관계 데이터베이스 에서 우리 가 검색 어 를 작성 하여 실행 할 때 발생 하 는 과정 은 다음 과 같다.
wKiom1fJKQCTVTrjAAD82tMpcQg075.png-wh_50
전체 실행 프로 세 스 는 query->Parse->Bind->Optimize->Execute 입 니 다.
1.sql 검색 어 를 작성 하고 sql 검색 엔진 은 먼저 우리 의 검색 어 를 분석 합 니 다.즉,Parse 과정 입 니 다.분석 하 는 과정 은 우리 가 쓴 검색 어 를 분할 하고 procject,DataSource 와 Filter 세 부분 을 분석 하여 논리 적 해석 tree 를 형성 합 니 다.분석 하 는 과정 에서 우리 의 sql 문법 에 오류 가 있 는 지 확인 합 니 다.예 를 들 어 지표 필드 가 부족 하고 데이터베이스 에 이 데이터 시트 가 포함 되 어 있 지 않다 는 등 이다.오류 가 발견 되면 즉시 해석 을 멈 추고 오 류 를 보고 합 니 다.분석 이 순조롭게 완료 되면 Bind 프로 세 스 로 들 어 갑 니 다.
2.Bind 과정 은 단 어 를 통 해 알 수 있 듯 이 이 과정 은 연결 되 는 과정 이다.왜 귀속 과정 이 필요 합 니까?이 문 제 는 우리 가 소프트웨어 실현 의 측면 에서 생각해 야 한다.만약 우리 가 이 sql 조회 엔진 을 실현 한다 면 우 리 는 어떻게 해 야 합 니까?그들 이 사용 하 는 전략 은 먼저 sql 조회 문 구 를 분할 하고 서로 다른 부분 을 분할 한 다음 에 분석 하여 논리 적 해석 tree 를 형성 한 다음 에 우리 가 데 이 터 를 찾 아야 하 는 데이터 시트 가 어디 에 있 는 지,어떤 필드 가 필요 한 지,어떤 논 리 를 실행 해 야 하 는 지 알 아야 한다.이런 것들 은 모두 디지털 라 이브 러 리 의 데이터 사전 에 저장 되 기 때문에 bid 과정 은사실은 Parse 과정 후 형 성 된 논리 적 해석 tree 를 데이터베이스 데이터 사전 과 연결 하 는 과정 입 니 다.바 인 딩 후 트 리 를 실행 하여 표 가 어디 에 있 는 지,어떤 필드 가 필요 한 지 알 게 합 니 다.
3.Bind 과정 을 마 친 후에 데이터베이스 조회 엔진 은 몇 가지 조회 실행 계획 을 제공 하고 실행 계획 을 조회 하 는 통계 정 보 를 제공 합 니 다.몇 가지 실행 계획 을 제공 한 이상 비교 가 있 으 면 우열 이 있 습 니 다.데이터 베 이 스 는 이러한 실행 계획 의 통계 정보 에 따라 가장 좋 은 실행 계획 을 선택 하기 때문에 이 과정 은 Optimize(최적화)과정 입 니 다.
4.가장 좋 은 실행 계획 을 선택 하면 마지막 으로 Execute 를 실행 합 니 다.마지막 으로 실행 하 는 과정 은 우리 가 분석 하 는 과정 과 다 릅 니 다.우리 가 실행 하 는 순 서 를 알 면 우리 가 나중에 sql 을 쓰 고 최적화 하 는 데 큰 도움 이 됩 니 다.조 회 를 실시 한 후에 그 는 where 부분 을 먼저 실행 한 다음 에 데이터 소스 의 데이터 표를 찾 습 니 다.마지막 으로 select 를 생 성 하 는 부분,우리 의 최종 결과.실행 순서:operation->DataSource->Result
위의 부분 은 SparkSQL 에 아무런 연관 이 없 지만 이 를 알 면 SparkSQL 을 이해 하 는 데 도움 이 됩 니 다.
2.SparkSQL 프레임 워 크 의 구조
이 프레임 워 크 에 대해 명확 한 인식 을 가지 기 위해 서 는 먼저 우리 가 왜 sparkSQL 이 필요 한 지 알 아야 합 니 다.개인 적 으로 sql 이 직접 해결 할 수 있 는 문 제 를 쓰 려 면 sparkSQL 을 사용 하지 말 것 을 권장 합 니 다.sparkSQL 을 사용 하려 면 개발 과정 을 가속 화 할 수 있 는 것 도 아 닙 니 다.sparkSQL 을 사용 하 는 것 은 일반적으로 sql 로 해결 할 수 없 는 복잡 한 논 리 를 해결 하기 위해 프로 그래 밍 언어의 장점 을 사용 하여 문 제 를 해결 하 는 것 입 니 다.다음 그림 과 같은 sparkSQL 일반적인 프로 세 스 를 사용 합 니 다.

위의 그림 에서 보 듯 이 일반적인 상황 에서 두 부분 으로 나 뉜 다.a.데 이 터 를 sparkSQL 에 읽 고 sparkSQL 은 데이터 처리 나 알고리즘 을 실현 한 다음 에 처 리 된 데 이 터 를 해당 하 는 출력 원 에 출력 한다.
1.우리 도 개발 하 라 고 하면 어떻게 해 야 하 는 지,어떤 문 제 를 고려 해 야 하 는 지 에 대해 생각 합 니 다.
     a.첫 번 째 문 제 는 데이터 소스 가 몇 개 있 습 니까?우 리 는 어떤 데이터 소스 에서 데 이 터 를 읽 을 수 있 습 니까?현재 sparkSQL 은 많은 데이터 원본 을 지원 합 니 다.예 를 들 어 hive 데이터 창고,json 파일,txt,그리고 orc 파일 을 지원 하 는 동시에 jdbc 가 관계 데이터 베이스 에서 데 이 터 를 추출 하 는 것 도 지원 합 니 다.기능 이 매우 강하 다.
     b.또 생각해 야 할 문 제 는 데이터 형식 이 어떻게 비 치 느 냐 하 는 것 입 니 다.우 리 는 우리 가 데이터베이스 시트 에서 데 이 터 를 읽 을 때 우리 가 정의 하 는 표 구조의 필드 유형 과 프로 그래 밍 언어,예 를 들 어 scala 의 데이터 형식 맵 관 계 는 어떤 맵 관계 인지 알 고 있 습 니 다.sparkSQL 에 서 는 이 문 제 를 해결 하 는 방법 이 있 습 니 다.데이터 시트 의 필드 유형 에서 프로 그래 밍 언어 데이터 형식의 맵 관 계 를 실현 합 니 다.이것 은 나중에 상세 하 게 소개 하고,먼저 이 문제 가 있 는 지 알 면 된다.
     c.데이터 가 있 으 면 sparkSQL 에서 우 리 는 이 데 이 터 를 어떻게 구성 해 야 합 니까?어떤 데이터 구조 가 필요 합 니까?그리고 우 리 는 이 데이터 에 대해 어떤 조작 을 할 수 있 습 니까?sparkSQL 은 DataFrame 데이터 구 조 를 사용 하여 sparkSQL 에 읽 힌 데 이 터 를 조직 합 니 다.DataFrame 데이터 구 조 는 데이터 베이스 의 표 구조 와 차이 가 많 지 않 고 데 이 터 는 줄 에 따라 저장 되 며 같은 schema 가 있 으 면 데이터 베이스 의 표 구조 에 해당 하 며 각 줄 의 데이터 가 어느 필드 에 속 하 는 지 기록 하고 있 습 니 다.
     d.데이터 처리 가 끝 난 후에 우 리 는 데 이 터 를 어디 에 넣 고 어떤 형식 으로 대응 해 야 합 니까?이 a 와 b 가 해결 해 야 할 문 제 는 똑 같 습 니 다.
2.sparkSQL 은 상기 문제 에 대한 실현 논리 도 명확 하 다.위의 그림 에서 잘 알 고 있 으 며 주로 두 단계 로 나 뉘 는데 모든 단 계 는 하나의 구체 적 인 유형 에 대응 하여 이 루어 진다.
   a.첫 번 째 단계 에 sparkSQL 에 두 가지 유형 이 존재 하여 이런 문 제 를 해결 합 니 다.HiveContext,SQLContext,동시에 hiveContext 는 SQLContext 의 모든 방법 을 계승 하 는 동시에 이 를 확장 합 니 다.hiv 와 my sql 의 조 회 는 어느 정도 차이 가 있다 는 것 을 알 고 있 기 때문이다.HiveContext 는 hive 데이터 창고 에서 데 이 터 를 읽 는 작업 을 처리 하 는 데 만 사 용 됩 니 다.SQLContext 는 sparkSQL 이 지원 할 수 있 는 나머지 모든 데이터 원본 을 처리 할 수 있 습 니 다.이 두 가지 처리 의 입 도 는 데이터 에 대한 읽 기와 쓰기 에 제한 되 고 표 등급 에 대한 작업 이다.예 를 들 어 데이터 읽 기,캐 시 표 읽 기,캐 시 표 방출,레 지 스 트 표 삭제,등 록 된 표 삭제,반환 표 의 구조 등 이다.
  b.sparkSQL 은 읽 은 데 이 터 를 처리 하고 DataFrame 에서 제공 하 는 방법 을 사용 합 니 다.sparkSQL 에 데 이 터 를 읽 으 면 이 데 이 터 는 DataFrame 형식 이기 때 문 입 니 다.동시에 데 이 터 는 Row 에 따라 저장 된다.그 중에서 도 DataFrame 에 서 는 유용 한 방법 을 많이 제공 했다.나중에 자세히 말씀 드 리 겠 습 니 다.
 c.spark 1.6 버 전 이후 DataFrame 과 유사 한 데이터 구조 Dataset 를 추 가 했 습 니 다.이 데이터 구 조 를 추가 하 는 목적 은 DataFrame 에 취약 점 이 있 습 니 다.그 는 Row 에 따라 저 장 된 데 이 터 를 처리 할 수 있 고 DataFrame 에서 제공 하 는 방법 만 사용 할 수 있 습 니 다.우 리 는 일부 RDD 가 제공 하 는 조작 만 사용 할 수 있 습 니 다.Dataset 의 목적 은 RDD 를 조작 하 는 것 처럼 sparkSQL 의 데 이 터 를 조작 할 수 있 도록 하 는 것 입 니 다.
d.그 중에서 다른 유형 도 있 지만 지금 은 sparkSQL 에서 가장 중요 한 것 은 위의 세 가지 유형 입 니 다.다른 유형 은 나중에 만나면 천천히 생각 합 니 다.
3.sparkSQL 의 hiveContext 와 SQLContext 의 운영 원리
  hiveContext 와 SQLContext 는 제 가 첫 번 째 부분 에서 말 한 sql 문장의 모듈 해석 실현 원 리 는 똑 같 습 니 다.똑 같은 논리 과정 을 사 용 했 고 인터넷 에서 이 부분 을 많이 말 하면 바로 붙 여 복사 합 니 다!
  sqlContext 의 전체 과정 은 다음 그림 과 같다.
1.SQL 문 구 는 SqlParse 를 통 해 UnresolvedLogicalPlan 으로 해석 합 니 다.
2.analyzer 를 사용 하여 데이터 사전(catalog)과 결합 하여 바 인 딩 하여 resolvedLogicalPlan 을 생 성 합 니 다.
3.optimizer 를 사용 하여 resolvedLogicalPlan 을 최적화 하고 optimizedLogicalPlan 을 생 성 합 니 다.
4.SparkPlan 을 사용 하여 LogicalPlan 을 PhysicalPlan 으로 변환 하기;
5.prepareForExecution()을 사용 하여 물리 계획 을 실행 가능 한 물리 계획 으로 변환 하기;
6.실행 가능 한 물리 계획 을 execute()로 실행 하기;
7.SchemaRDD 생 성.
전체 운영 과정 에서 SqlParse,analyzer,optimizer,SparkPlan 등 여러 개의 SparkSQL 구성 요소 와 관련 되 었 습 니 다.

hiveContext 의 전체적인 과정 은 다음 그림 과 같다.
1.SQL 문 구 는 HiveQL.parseSql 을 통 해 Unresolved LogicalPlan 으로 해석 되 었 습 니 다.이 분석 과정 에서 hiveql 문 구 를 getAst()로 AST 트 리 를 가 져 온 다음 에 분석 합 니 다.
2.analyzer 를 사용 하여 데이터 hive,소스 데이터 Metastore(새로운 catalog)와 결합 하여 바 인 딩 하여 resolved LogicalPlan 을 생 성 합 니 다.
3.optimizer 를 사용 하여 resolved LogicalPlan 을 최적화 시 키 고 optimized LogicalPlan 을 생 성 합 니 다.최적화 전에 ExtractPython Udfs(catalog.PreInsertionCasts(catalog.CreateTables(analyzed)를 사용 하여 예비 처 리 를 했 습 니 다.
4.hivePlanner 를 사용 하여 LogicalPlan 을 PhysicalPlan 으로 변환 하기;
5.prepareForExecution()을 사용 하여 물리 계획 을 실행 가능 한 물리 계획 으로 변환 하기;
6.실행 가능 한 물리 계획 을 execute()로 실행 하기;
7.실행 후 맵(.copy)결 과 를 SchemaRDD 로 가 져 옵 니 다.

Spark SQL 의 전체적인 실현 논리 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.Spark SQL 의 실현 논리 에 관 한 더 많은 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기