728x90
58강. Drill 개요
Drill의 장점
- 하둡 뿐 아니라 분산 클러스터에 저장된 데이터들에 대해 SQL쿼리를 실행할 수 있게 하는 쿼리엔진
- 몽고DB나 HDFS, S3, hive, Hbase 등과 소통하며 단일 SQL쿼리로 통합할 수 있음
- 카산드라와 소통 불가(presto는 가능)
- 관계형 데이터베이스가 아닌 것에 SQL쿼리를 하기 위해 존재한다.
- 스키마 자체가 없는 데이터에서도 가능
- 다양한 비관계형 데이터베이스와 데이터파일에 SQL쿼리가 가능.
- flat JSON 형식이나 parquet 파일과 aws S3, azure, GCP 혹은 로컬 파일 시스템까지 지원
- google dremel 이라는 논문 기반
- 실제 SQL
- SQL 2003 표준 버전을 기반으로 개발
- 일반 텍스트 파일에도 SQL 쿼리 실행 가능
- 물론 JSON같은 어떤 구조가 필요
- HIVE를 대체할 수 있다는 여론 존재
- 실제로 HIVE는 HDFS에 위치한 데이터에 HQL(즉 하이브 쿼리언어)를 실행하는 것. 그러나 드릴은 진짜 SQL을 사용하는 것이므로
- 인터페이스를 다른 도구들에게 노출해서 관계형 데이터베이스처럼 사용 가능
- ODBC, JDBC라는 드라이버를 사용해서 타블루와 같이 관계형 데이터 베이스와 연결할 수 있는 모든 도구에 연결해 그 데이터를 사용
- 이질적인 데이터 소스를 변형하거나 불러오지 않고 SQL 분석이 가능
- 스키마 없는 SQL
- 내부적으로 느슨하게 구성된 JSON 양식 사용
- json blob에 거의 모든 종류의 데이터를 사용할 수 있다.
- 기본적으로 drill은 단순하고 이해하기 쉽다.
- 러닝커브가 낮다
- 다양한 소스에 있는 다양한 데이터를 단일 쿼리를 사용해 효율적으로 묶을 수 있다.
- 몽고DB 인스턴스와 하이브 인스턴스 결합 가능
Drill의 한계
- 내부적으로 비관계형 데이터 베이스
- 여러 시스템에 있는 대용량 데이터 세트를 합칠 때 굉장이 비효율적
- 내부적으로 수많은 데이터를 재배치해야함
- 빠르지만, 시스템의 설계된 용도에서 벗어나선 안된다.
- drill 사용하기 이전에 시스템 요구사항과 해당 시스템에서 진짜 관계형 데이터가 필요한 지등을 미리 고민할 필요가 있다.
59~60강. 실습
[59강] Drill설정하기
- ambari 활용
[60강] Drill로 여러 데이터베이스에 쿼리하기
61강. Phoenix 개요
Drill과 비슷하나 HBase와만 호환된다는 차이점이 존재한다.
즉 HBase의 SQL 드라이버이다.
Phoenix 의 특징
- 트랜잭션 지원 - Fast, low latency, OLTP
- 높은 처리율과 신속한 응답이 필요한 대규모의 웹 애플리케이션을 갖고 있다면 적합
- 단 쿼리가 간단할 경우
- 거대한 JOIN을 해야한다면 적절하지 않다.
- 여러 SQL 쿼리를 한데 묶어서 한 번에 실행 가능
- 복잡한 트랜잭션을 원자적(atomically)으로 실행 가능
- 사용자가 변경하려는 응답을 다른 클라이언트가 가져오려 한다면 중간결과를 반환하지 않는 다는 뜻
- salesforce에서 오픈소스로 개발
- HBase에 JDBC 커넥터를 노출하는 방식으로 작동
- JDBC는 표준 SQL 인터페이스에 사용.
- JDBC를 지원하는 외부툴이라면 피닉스를 사용해서 HBase와 직접 연결할 수 있다.
- secondary indices 지원
- UDF지원
- 더 복잡한 작업 가능
- MR, spark, hive, pig, flume 등과 연결 가능
- flume은 스트리밍 데이터 기술 중 하나이다
Phoenix를 사용하는 이유
- 고도로 최적화, 매우 빠르다
- HBase위에 복잡한 쿼리를 효율적으로 실행할 수 있다.
- Hbase위에 추가적인 레이어를 더했음에도 피닉스를 사용하는 것이 더 성능적으로 향상됨.
- Drill도 Hbase를 지원하는데, phoenix를 사용하는 이유는?
- Hbase 를 메인으로 사용하면서 최적화에 좀 더 집중한다면 이에 특화된 phoenix 사용을 고려할 수 있다.
- 그렇다면 Hbase 를 단독으로 사용하지 않는 이유는?
- 일반적으로 사용자들이 SQL쿼리에 더 익숙하기 때문이다.
- 질의에 대한 최적화를 피닉스가 알아서 제공해주는 부분이 있다.
- 기존 어플리케이션이 JDBC를 통해 SQL 인터페이스에 코딩한다면 피닉스를 사용해서 더 나은 호환성을 제공할 수 있음
Phoenix 아키텍쳐
- 클라이언트는 HBase 지역서버와 소통한다.
- 지역서버는 HDFS 클러스터 위에서 돌아가며 데이터를 저장하거나 불러온다
- HBase 지역서버와 HDFS 서버는 나란히 정렬되어 네트워크 트래픽을 최소화한다.
- 클라이언트 측에서 Phoenix는 HBase API나 데이터베이스 드라이버 안에서 돌아가고 서버 측에서는 HBase 내에 설치한 피닉스 코프로세서에서 지원한다.
- 둘다 주키퍼와 소통하며 어느 지역서버가 작업 가능한지 알아낸다
Phoenix 사용하는 방법
- 명령줄 인터페이스(CLI)
- Phoenix API 사용
- JDBC 드라이버
- Phoenix 쿼리서버
- 클라이언트의 업무를 부담하는 별도의 쿼리서버 집단을 가질수도 있음
- jar - MR, hive, pig 등
62~63강. 실습
[62강] phoenix 설치 및 hbase 쿼리
- upsert(create, update 동시 취급)라는 명령어 존재
[63강] phoenix와 pig 통합하기
- phoenix 레이어를 통해 pig와 hbase 인터페이스 최적화
- 위의 실습을 통해 터미널 프롬프트에서 hbase에 접속하여 phoenix를 실행해서 가상의 테이블을 생성
REGISTER /usr/hdp/current/phoenix-client/phoenix-client.jar
# 피닉스 클라이언트의 위치를 지정
# 피닉스에 피그를 연결할 java 클래스의 위치를 지정하고 피닉스를 hbase에 연결
users = LOAD '/user/maria_dev/ml-100k/u.user'
USING PigStorage('|')
AS (USERID:int, AGE:int, GENDER:chararray, OCCUPATION:chararray, ZIP:chararray);
STORE users into 'hbase://users' using
org.apache.phoenix.pig.PhoenixHBaseStorage('localhost','-batchSize 5000');
# pig로 부른 데이터를 storage에 저장. localhost 서버를 활용해서 5000개 단위로 배치(서버의 메모리 기준)
occupations = load 'hbase://table/users/USERID,OCCUPATION' using org.apache.phoenix.pig.PhoenixHBaseLoader('localhost');
# 저장한 데이터에서 userid, occupation 열만 불러옴
grpd = GROUP occupations BY OCCUPATION;
cnt = FOREACH grpd GENERATE group AS OCCUPATION,COUNT(occupations);
DUMP cnt;
728x90
'DE > Study' 카테고리의 다른 글
[Hadoop_기초] Udemy course - 섹션 8-1. Yarn & Tez & Mesos & Zookeeper (0) | 2022.08.08 |
---|---|
[Hadoop_기초] Udemy course - 섹션 7-2. Presto (0) | 2022.07.26 |
[Hadoop_기초] Udemy course - 섹션 6-2.MongoDB & 데이터베이스 선택하기 (0) | 2022.07.12 |
[Hadoop_기초] Udemy course - 섹션 6-1.Hbase & Cassandra (0) | 2022.07.06 |
[Hadoop_기초] Udemy course - 섹션 5.Hive (0) | 2022.06.26 |