Server | Language |
---|---|
Centos7 | Python3.7 |
pip install happybase
⚡ happybase?
- HappyBase는 Apache HBase의 사용자 친화적인 파이썬 클라이언트 라이브러리
⚡ happyBase의 주요 특징
- 사용자 친화적인 API : HappyBase는 직관적이고 사용하기 쉬운 API를 제공하여, 개발자가 HBase의 핵심 기능에 쉽게 접근할 수 있다.
- 커넥션 풀링 : HappyBase는 커넥션 풀링을 지원하므로, 여러 개의 HBase 클라이언트를 사용하여 동시에 연결하고 작업을 수행할 수 있다.
- 자동 시리얼라이제이션 및 역시리얼라이제이션 : HappyBase는 데이터를 저장하거나 조회할 때 자동으로 시리얼라이제이션 및 역시리얼라이제이션을 처리하여, 개발자가 각 데이터 유형에 대해 별도의 변환 작업을 수행할 필요가 없다.
- 배치 작업 지원 : HappyBase는 HBase의 배치 작업을 지원하여, 여러 개의 데이터를 한 번에 읽거나 쓸 수 있어 효율성과 성능을 높일수 있다.
- 데이터 모델 추상화 : HappyBase는 HBase의 로우 키, 컬럼 패밀리, 컬럼, 타임스탬프 등의 데이터 모델 개념을 추상화하여, 간단한 코드로 데이터를 저장하고 관리할 수 있다.
- 파이썬 2와 3 모두 지원 : HappyBase는 파이썬 2와 3 모두를 지원하여, 여러 버전의 파이썬 프로젝트에 적용할 수 있다.
cd path to/hbase/bin
./hbase-daemon.sh start thrift
HBase Thrift Server는 Apache HBase의 Thrift 기반 서버로, Thrift 프로토콜을 사용해 HBase를 사용할 수 있는 다양한 프로그래밍 언어로 작성된 클라이언트와 통신할 수 있게 해준다.
Thrift는 Facebook에서 개발한 고성능, 확장 가능한 소프트웨어 프레임워크로서, 서로 다른 프로그래밍 언어로 작성된 서비스 간의 통신을 가능하게 해주는 인터페이스 정의 언어(IDL)와 바이너리 통신 프로토콜을 제공
이를 통해 HBase를 사용하는 클라이언트 애플리케이션은 자바 뿐만 아니라 파이썬, Ruby, PHP, C++ 등 여러 프로그래밍 언어로 개발할 수 있다.
import time
import happybase
from datetime import datetime
import random
import socket
socket.setdefaulttimeout(10)
HOST = ["host1", "host2"]
def getHConnection(num=None):
while 1:
try:
if num == None:
num = random.randint(0, len(HOST) - 1)
server = HOST[num]
connection = happybase.Connection(server, port=9090, timeout=30000)
connection.open()
return connection
except Exception as msg:
print("error:", msg)
time.sleep(1)
num = None
dt = datetime(2022, 1, 1) # 예) 2022년 1월 1일 이전의 데이터를 삭제
target_timestamp = int(dt.timestamp() * 1000)
scan_batch_size = 1000 # 한 번에 스캔할 데이터 수를 설정
start_row = None # 초기 시작 행을 None으로 설정
row_list = []
while True:
connection = getHConnection()
table = connection.table("테이블 이름")
row_count = 0
last_row_key = None
for row_key, data in table.scan(row_start=start_row, include_timestamp=True):
for column, (value, timestamp) in data.items():
if timestamp < target_timestamp:
row_list.append(row_key)
break
else:
break
row_count += 1
last_row_key = row_key
if row_count >= scan_batch_size:
break
for row_key in row_list:
table.delete(row_key)
print(f"Deleted row_key: {row_key}")
if last_row_key:
start_row = last_row_key # 체크포인트를 마지막 row_key로 설정
else:
break # 스캔이 완료되면 루프를 종료
row_list = []
connection.close()
time.sleep(1) # 연결이 끊어진 후 다음 스캔을 시작하기 전에 일시 중지
getHConnection
: 주어진 호스트 중 하나에 연결을 시도하고, 성공한 경우 HappyBase Connection 객체를 반환, 연결에 실패하면 다른 호스트로 시도한다.dt = datetime(2022, 1, 1)
: 삭제할 날짜를 지정한다. 이 예에서는 2022년 1월 1일 이전의 데이터를 삭제한다.scan_batch_size, start_row
: 한 번에 스캔할 데이터 수를 지정하고, 초기 시작 행을 None으로 설정for row_key, data in table.scan(row_start=start_row, include_timestamp=True)
table.delete(row_key)
: row_list에 저장된 행 키에 대해 삭제 작업을 수행하고, 삭제된 행 키를 출력한다.$ nohup python 스크립트.py &