읽기 전에

* Hadoop HDFS Cluster 와 Spark Cluster 가 이미 설치되어있다는 전제 하에 아래 내용을 설명한다.

* HBase 와 Zookeeper 가 이미 실행중이라는 전제 하에 아래 내용을 설명한다.

* HBase 설치 방법

* Zookeeper 설치 방법

 

 

내가 실행한 환경

- Ubuntu 16.04

- Spark 2.4.0 

- Hadoop 3.1.1 Cluster Node 2개 (master 1개, slave 1개)
- Scala 2.11.12

- HBase 1.4.10

- Zookeeper 3.5.6

 

아래 절차를 따르기 전에 이미 HDFS, HBase, Zookeeper 가 실행중이어야 한다.

Master 와 Slave 서버에서 jps 로 현제 실행 중인지 데몬 목록으로 확인해본다.

Master 에서는 HMaster, Slave 서버에서는 HRegionServer 가 실행중이어야 한다.

< Master 서버에서 jps > < Slave 서버에서 jps >

 

 

 

 

Spark 와 연동하는 방법은 총 세 가지가 있다.

1. Hortenworks Spark HBase Connector(SHC) 를 사용하는 방법 (git)

2. nerdammer Spark Hbase Connector 를 사용하는 방법 (git)

3. Apache HBase Spark Connector 를 사용하는 방법 (git)

 

여기 포스트에서는 apache 에서 직접 제공하는 세번째 방법을 사용한다.

각자 어떤 connecotr 를 사용할 것인지는 아래 링크들을 참고한다.

링크1

링크2

링크3

 

 

 

 

1.

먼저 HBase 에 데이터를 넣는다.

HBase/bin 으로 가서 ./hbase shell 로 hbase shell 에 접속한 후에 아래 put 명령어를 넣는다.

create 'Contacts', 'Personal', 'Office'


put 'Contacts', '1000', 'Personal:Name', 'John Dole'
put 'Contacts', '1000', 'Personal:Phone', '1-425-000-0001'
put 'Contacts', '1000', 'Office:Phone', '1-425-000-0002'
put 'Contacts', '1000', 'Office:Address', '1111 San Gabriel Dr.'
put 'Contacts', '8396', 'Personal:Name', 'Calvin Raji'
put 'Contacts', '8396', 'Personal:Phone', '230-555-0191'
put 'Contacts', '8396', 'Office:Phone', '230-555-0191'
put 'Contacts', '8396', 'Office:Address', '5415 San Gabriel Dr.'

scan "Contacts" 로 잘 들어갔는지 확인

 

 

 

 

 

2.

아래 명령으로 Spark shell 에 접속한다.

spark-shell --master yarn --jars "/root/hbase-1.4.10/lib/*.jar"

위에 /root/hbase-1.4.10/lib 는 내가 hbase 를 설치한 경로이기 때문에 바로 복붙하면 에러가 날 것이다.

각자 hbase 를 설치한 경로를 찾아서 lib 내의 모든 jar (*.jar) 를 옵션에 넣자.

 

 

 

 

 

 

3.

아래 코드를 넣어본다.

 

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.TableName;

import org.apache.hadoop.hbase.client.ConnectionFactory;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.util.Bytes;

import org.apache.hadoop.hbase.client.Scan;

 

val conf = HBaseConfiguration.create()

val conn = ConnectionFactory.createConnection(conf)

val admin = conn.getAdmin() //여기 예제에서는 admin 은 사용하지 않지만, "이렇게 admin 을 얻는다" 고 참고 삼아 넣어둠.

val table = conn.getTable(TableName.valueOf("Contacts"))

 

//Get example. row key 가 8396 인 것만 가져온다.

val get = new Get(Bytes.toBytes("8396"))

val result = table.get(get)

println(result)

 

//Scan example. Contacts 테이블의 모든 row 를 Scan 하여 iterator 로 뽑아온다.

val scan = table.getScanner(new Scan())

val itr = scan.iterator

println(itr.next)

 

lib import
읽기 준비
get example
scan example

 

 

 

< 범위 scan >

val scan = new Scan()
scan.setStartRow(Bytes.toBytes("1000")) //이상
scan.setStopRow(Bytes.toBytes("1000")) //미만
scan.setCaching(1)
val scanner = table.getScanner(scan)

 

 

 

 

 

 

여기 포스트에서는 read 하는 것만 소개한다.

write 외에 creat table, delete 등의 쿼리를 보내는 명령어들은 차후에 업데이트 하기로 한다.

 

공식 github 내의 코드에 좋은 예제들이 많으니 응용해서 사용할 수 있겠다.

 

이 youtube 비디오 에서 insert, read, update, delete 명령어를 어떻게 사용하는지 실제 예제로 볼 수 있다.

 

 

 

 

 

Spark 의 RDD 를 사용하려면 HBaseContext 를 사용해야 한다.

 

여기에서 jar 를 받아 --jars 옵션에 넣어 사용하면 HBaseContext 를 사용할 수 있다.

HBaseContext 를 import 할 때

"Symbol term org.apache.yetus is missing from the classpath."

에러가 난다면, 

HBase 가 설치된 곳 $HBASE_HOME/lib/client-facing-thirdparty 에 있는 audience-annotations-*.jar 를

spark 가 설치된 곳 $SPARK_HOME/jars/ 로 옮긴다.

 

여기 HBase book 참고.

API 사용 방법은 여기 참고

 

 

 

 

 

 

 

 

 

잡담

 

git을 보면 shc 가 가장 많은 star 를 갖고 있는 걸 볼 수 있다.

shc 은 hbase 의 데이터를 dataframes 나 datasets 로 바로 갖고 올 수 있고 또

2,3번 connector 보다 훨씬 많은 인기를 누리고 있기 때문에

나는 처음에 shc 를 이용하여 hbase 와 spark 를 연동시키려고 하였다....

....... 그렇게 삽질을 했더랬다.

shc 는 dependencies 와 version 맞추는 문제가 너무 크기 때문에 손보기가 정말 까다롭다.

왜 이렇게 만들어두었는지 모르겠다.

 

참고로 Hortenworks Connector 를 구글링 하다보면 Cloudera 가 많이 등장하는데, 왜냐하면 두 회사가 합병했기 때문이다. 따라서 Hortenworks 시절에 만든 blog 나 article 에 나온 code 들은 오래되었고 업데이트가 되지 않았기 때문에, 동작하지 않을 수 있다.

 

 

 

 

참고한 곳들

https://hbase.apache.org/book.html#spark

https://sparkbyexamples.com/hbase/spark-hbase-connectors-which-one-to-use

https://stackoverflow.com/a/38220562/5868252

https://www.programcreek.com/scala/org.apache.hadoop.hbase.TableName

https://gist.github.com/ishassan/c4d5770f4163e13a3e5a9b072e18ce7d#file-scalahbaseexample-scala

http://khodeprasad.ml/blog/read-records-from-hbase-table-using-java/

https://stackoverflow.com/questions/33331936/the-type-htableconfig-tablename-is-deprecated-what-use-instead

https://www.quora.com/How-do-I-integrate-HBase-on-Spark

https://acadgild.com/blog/apache-spark-hbase

https://dzone.com/articles/spark-streaming-1

 

 

 

 

+ Recent posts