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

+ Recent posts