본문 바로가기
SQL/NoSQL

[데이터베이스 DB] NoSQL이란? (2-3) : HBase 사용법 (feat. Hive & Impala)

by newstellar 2021. 9. 3.
반응형

2021.09.02 - [SQL/NoSQL] - [데이터베이스 DB] NoSQL이란? (2-2) : HBase 사용법(Shell, command)

 

[데이터베이스 DB] NoSQL이란? (2-2) : HBase 사용법(Shell, command)

HBase의 데이터 접근 방식 1. HBase Shell 기초 HBase Shell은 HBase에서 HDFS를 사용하여 명령을 전달하기 위한 대화형 명령어 처리 인터페이스(CLI)로서, Hmaster, region server와 연동하여 API에서 사용할 수..

newstellar.tistory.com

 

학습목표
1. HBase를 Hive와 Impala에서 사용하는 방법을 익혀 실제로 데이터 저장/분석할 수 있다.
2. Exercise를 통해 데이터 CRUD 연산을 수행하고 타 언어를 사용한 접근 방법을 이해한다.

 

HBase 사용법 (feat. Hive & Impala)

 

 

1. Hive와 Impala 조합으로 HBase 사용하기

  • Hive
    • HBase 코드는 일반적으로 thrift를 사용하여 Java 등의 언어로 작성하기 때문에 HBase 작동 방식을 이해하고, 코드 작성 및 유지보수가 가능한 인력이 필요하다. 이때 Hive / Impala / presto를 통해 HBase API를 자세히 알지 않더라도 데이터 저장/검색이 가능하다.

    • Hive는 SQL-like 문법을 이용하여 HDFS data에 접근하기 위해 사용하는, Facebook에서 개발한 Data processing 및 analytics tool이다. (Hadoop job을 수행하는 Data Warehouse 프레임워크)

    • HBase는 HDFS 위에서 동작하는 반면, Hive는 MapReduce 위에서 동작한다.

    • Hadoop 처리 시에 실제 Map Reduce로 변경되어 수행된다. 자체 분석 엔진을 보유한 Impala와 달리, Hive나 pig는 MapReduceSpark 엔진을 사용한다.

 

  • Hive와 HBase 연동
    • Hive는 HBase의 테이블 위에 "layers"라는 테이블을 정의한다.

    • Hive의 column은 HBase에 있는 column 이름과 매핑되며, type으로 int, float, string, Boolean 등이 가능하다.

    • RDB처럼 Hive 테이블은 개별 value가 해당 column에 속하는 데이터 row로 구성된다. 이때 Hive는 MapReduce 작업을 생성하기 때문에 HBase에 접근하는 것은 일괄 처리 작업으로 수행된다.

$ beeline -u jdbc:hive2://localhost:10000
// HBase 테이블과 Hive Layer를 매핑시키자.
> CEATE EXTERNAL TABLE test 
    (rowkey string, name string, city string, title string) 
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES 
    ("hbase.columns.mapping"=":key, pinfo:name, pinfo:city, position:title") 
    TBLPROPERTIES ("hbase.table.name" = "test");

> DESCRIBE test;

> select * from test;

 

 

 

  • Impala
    • Impala는 Cloudera에서 오픈소스로 발표한 SQL 쿼리 엔진으로, Apache Hadoop을 실행하는 컴퓨터 클러스터에 저장된 데이터를 대규모 병렬 처리할 수 있다. In-memory 방식을 기반으로 하기 때문에 실시간 온라인 분석 및 빅데이터 분석이 가능하다. C++ 기반으로 제작되었으며 별도의 실행 엔진을 사용하므로 MapReduce 프로그래밍을 할 필요가 없다.

    • MapReduce 프레임워크를 사용하지 않기 때문에 응답 시간을 최소한으로 줄이고, query 엔진을 클러스터 내 모든 데이터 node에 설치했기 때문에 Hive에 비해 뛰어난 성능을 보인다. (CPU 부하를 줄인만큼 I/O 대역폭을 사용하며, 여러 단계의 Reduce-side JOIN 작업을 하지 않아도 된다.)
$ impala-shell

$ impala-shell -i myserver.example.com:21000
// 다른 서버로 연결함. (-i hostname:port)

$ impala-shell --help
// 도움말 부르기

$ SELECT lname, fname FROM customers WHERE state = “CA” limit 50;

$ shell date;
$ shell hdfs dfs /HDFS_PATH
// 날짜 보기, hdfs에 접근.

$ impala-shell -f myquery.sql
// sql 파일 내보내기.

$ impala-shell -q ‘SELECT * FROM users’
// ‘-q’ 로 커맨드에서 impala shell로 쿼리를 쓸 수 있음.

 

 

  • RDB  vs  Hive  vs  Impala
  RDB Hive Impala
Query Language SQL (full) SQL (subset) SQL (subset)
개별 인스턴스 update O X X
개별 인스턴스 삭제 O X X
Transaction O X X
Index 지원 Extensive Limited X
Latency Very Low High Low
Data Size TB PB PB

 


2. Exercise

  • HBase Shell 실행 및 테이블 생성/제거
$ hbase shell

> create 'htable', 'colfamily'  // 테이블 및 column family 생성

> describe 'htable'  // 테이블에 대한 정보 확인

> disable 'htable'  // 삭제 이전에 비활성화시켜야함. (list 명령어에는 등장함)
> drop 'htable'

 

 

  • 'movie'와 'user' 테이블 생성 및 데이터 입력
> create 'movie', 
  {NAME => 'info', VERSIONS => 3},
  {NAME => 'media', VERSIONS => 3}
  
> create 'user',
  {NAME => 'info', VERSIONS => 3},
  {NAME => 'check', VERSIONS => 3}
  
  
// 테이블이 잘 만들어졌는지 확인
> describe 'movie'
> describe 'user'
> put 'movie', '1', 'info:year', "Toy Story"
> put 'movie', '2', 'info:year', "Toy Story2"
> put 'movie', '3', 'info:year', "Toy Story3"
> put 'movie', '1', 'info:year', "2005"
> put 'movie', '7', 'info:year', "Star Wars 7"
> put 'movie', '7', 'info:year', "2003"
> put 'movie', '8', 'info:year', "2020"

> put 'user', '1', 'info:age', "21"
> put 'user', '1', 'info:gender', "M"
> put 'user', '2', 'info:zip', "18070"
> put 'user', '3', 'info:age', "31"
> put 'user', '3', 'info:gender', "F"

> count 'movie'  // 5
> count 'user'  // 3

 

  • 'movie' 테이블에 'stitle' column family 추가/삭제
> alter 'movie', {NAME => 'stitle'}  // 추가

> alter 'movie', {NAME => 'stitle', METHOD => 'delete'}  // 제거

> describe 'movie'  // 확인 가능

 

  • 'movie' 테이블에에서 'media' column family 수정하여 4가지 version 유지하도록 수정
> alter 'movie', {NAME => 'media', VERSIONS => 4}

 

 

  • 'info' column family에 age = 20, gender = F, zip = 18730인 row key 100을 입력 후 출력
> get 'user', '1'  // 2 rows 검색됨
> get 'user', '2'  // 1 rows 검색됨
> get 'user', '100'  // 0 rows 검색됨


> put 'user', '100', 'info:age', '20'
> put 'user', '100', 'info:gender', 'F'
> put 'user', '100', 'info:zip', '18730'
> put 'user', '100', 'info:age', '40'  // age가 40으로 변경됨

> get 'user', '100'  // 3 rows 검색됨

 

 

  • 'user' 테이블에서 row key = 100인 행에 'age' column version의 이전 column을 모두 출력
> get 'user', '100', {COLUMNS => 'info:age', VERSIONS => 3}

 

 

  • 'user' 테이블을 검색하지만 'age' column만 출력
> scan 'user', {COLUMNS => 'info:age'}

 

 

  • 'user' 테이블에서 row key = 100인 row의 'info:age' column 삭제
> delete 'user', '100', 'info:age'

> get 'user', '100' // 실제로 row key = 100인 user에 age column이 사라졌는지 확인


> deleteall 'user', '100'

> scan 'user' // row key = 100인 user 정보가 다 사라졌는지 확인

 


3. Hive / Impala로 HBase 사용하기

  •  Ruby Script 실행하기

// insert.rb
put 'movie', '7', 'info:count', '777'
put 'movie', '7', 'info:genres', 'TBD'
put 'movie', '8', 'info:count', '888'
put 'movie', '8', 'info:genres', 'Adventure'

get 'movie', '7'
get 'movie', '8'
$ hbase shell

> require 'insert.rb'

 

 


 

참고문헌
- mySUNI : NoSQL 이해와 활용 (정진석 강사님)
- https://surgach.tistory.com/68
- https://118k.tistory.com/575
- https://docs.aws.amazon.com/ko_kr/emr/latest/ReleaseGuide/emr-hbase-access-hive.html
- https://docs.cloudera.com/runtime/7.2.10/impala-reference/topics/impala-hbase.html
- https://kerpect.tistory.com/77
- https://data-science-hi.tistory.com/22

 

반응형

댓글