반응형
2021.09.02 - [SQL/NoSQL] - [데이터베이스 DB] NoSQL이란? (2-2) : HBase 사용법(Shell, command)
학습목표
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는 MapReduce와 Spark 엔진을 사용한다.
- HBase 코드는 일반적으로 thrift를 사용하여 Java 등의 언어로 작성하기 때문에 HBase 작동 방식을 이해하고, 코드 작성 및 유지보수가 가능한 인력이 필요하다. 이때 Hive / Impala / presto를 통해 HBase API를 자세히 알지 않더라도 데이터 저장/검색이 가능하다.
- Hive와 HBase 연동
- Hive는 HBase의 테이블 위에 "layers"라는 테이블을 정의한다.
- Hive의 column은 HBase에 있는 column 이름과 매핑되며, type으로 int, float, string, Boolean 등이 가능하다.
- RDB처럼 Hive 테이블은 개별 value가 해당 column에 속하는 데이터 row로 구성된다. 이때 Hive는 MapReduce 작업을 생성하기 때문에 HBase에 접근하는 것은 일괄 처리 작업으로 수행된다.
- Hive는 HBase의 테이블 위에 "layers"라는 테이블을 정의한다.
$ 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는 Cloudera에서 오픈소스로 발표한 SQL 쿼리 엔진으로, Apache Hadoop을 실행하는 컴퓨터 클러스터에 저장된 데이터를 대규모 병렬 처리할 수 있다. In-memory 방식을 기반으로 하기 때문에 실시간 온라인 분석 및 빅데이터 분석이 가능하다. C++ 기반으로 제작되었으며 별도의 실행 엔진을 사용하므로 MapReduce 프로그래밍을 할 필요가 없다.
$ 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
반응형
'SQL > NoSQL' 카테고리의 다른 글
[데이터베이스/DB] NoSQL이란? (3-2) : 카산드라(Cassandra) DB의 구조 및 CQL 사용법 (1) | 2021.09.25 |
---|---|
[데이터베이스/DB] NoSQL이란? (3-1) : 카산드라(Cassandra) 개념 및 장단점 (0) | 2021.09.15 |
[데이터베이스 DB] NoSQL이란? (2-2) : HBase 사용법(Shell, command) (0) | 2021.09.02 |
[데이터베이스 DB] NoSQL이란? (2-1) : HBase의 개념/특징/아키텍처 (0) | 2021.09.01 |
[데이터베이스/DB] NoSQL이란? (1) : 개념 및 사용 목적, RDBMS와의 차이점 (0) | 2021.09.01 |
댓글