MySQL의 데이터를 실시간으로 동기화 HBase를

I. 서론
데이터의 실시간 동기화, 우리는 먼저 운하, 맥스웰 및 기타 도구를 사용하여 데이터베이스에 실시간 데이터 변경 사항을 모니터링 할 수 있어야합니다. 나는 그것이 더 유연하기 때문에, 더 내 프로젝트의 요구 사항을 자격, 운하를 선택했다.

둘째, 데이터베이스의 데이터 변경 모니터링하는 운하를 통해
운하 설치 튜토리얼 : HTTPS : //www.aliyun.com/jiaocheng/1117575.html

셋째, 프로젝트 전체 아키텍처
프로젝트 전체 구조, 오프라인 동기화 : HTTPS : //blog.csdn.net/beyond_qjm/article/details/83623738

四,主要代码
수입 com.alibaba.otter.canal.client.CanalConnector;
수입 com.alibaba.otter.canal.client.CanalConnectors;
수입 com.alibaba.otter.canal.protocol.CanalEntry;
수입 com.alibaba.otter.canal.protocol.CanalEntry. *;
수입 com.alibaba.otter.canal.protocol.Message;
수입 org.apache.commons.logging.Log;
수입 org.apache.commons.logging.LogFactory;
수입 org.apache.hadoop.hbase.client.Delete;
수입 org.apache.hadoop.hbase.client.Get;
수입 org.apache.hadoop.hbase.util.Bytes;
수입 qjm.data.synch.hbase.HbaseSerialization;
수입 qjm.data.synch.hbase.HbaseUtils;
수입 qjm.data.synch.modle.Employee;
수입 qjm.data.synch.service.SqlDataService;

java.io.IOException 상위 오기;
오기 java.net.InetSocketAddress;
오기를 java.util.List;

/ **
* 데이터의 실시간 동기화
* /
공용 클래스 OnlineSynch {
정적 최종 로그 LogFactory.getLog 로그 = (OnlineSynch.class)

SqlDataService sqlDataService 새로운 새로운 SqlDataService = ( "SqlMapConfig.xml");
HbaseUtils hbaseUtils = 새로운 새로운 HbaseUtils를 ();

/ **
* HBase를에 관계형 데이터베이스에서 데이터를 동기화
* /
공공 무효 synchToHbase을 () {
// 링크 생성
(CanalConnector 커넥터 = CanalConnectors.newSingleConnector을
InetSocketAddress 새로운 새로운 ( "192.168.135.132"
11111),
"예",
"",
""
);
INT BATCHSIZE = 1000;
긴 일괄 ID = NULL;
{시도
) (connector.connect을;
//指定监听数据库
connector.subscribe ( "\\ grg_hr .. *");
connector.rollback ();
동안 (사실) {
//获取指定数量的数据
메시지 메시지 = connector.getWithoutAck (BATCHSIZE);
일괄 ID = message.getId ();
INT 크기 = message.getEntries ()의 크기 ().;
경우 (일괄 ID == -1 || 크기 == 0) {
LOG.info ( "기다리는 것 ...");
{시도
(1000)에 Thread.sleep;
} 캐치 (의 InterruptedException E) {
}
한다} else {
LOG.info (및 String.format ( "\의 nmessage [일괄 ID = %의 크기 = %의 S] ', 일괄 ID, 크기));
handleEntry (message.getEntries ());
}

connector.ack (일괄 ID); //提交确认
}
} 캐치 (예외 전자) {
//处理失败,回滚数据
경우 (! 일괄 ID = NULL) connector.rollback (일괄 ID);

LOG.error ( "오류 :"+ e.getMessage ());
새로운 RuntimeException을 (e)를 던져;
마지막} {
connector.disconnect ();
}
}

/ **
*处理
* @param 항목
* /
개인 무효의 handleEntry (목록 <항목> 항목) {
//循环事件
(입력 항목 : 항목)에 대한 {
경우 (entry.getEntryType () == EntryType.TRANSACTIONBEGIN || entry.getEntryType () == EntryType.TRANSACTIONEND는) {
계속;
}

RowChange rowChange = NULL;
시도 {
rowChange = RowChange.parseFrom (entry.getStoreValue ());
} 캐치 (예외 전자) {
; 새로운 RuntimeException을 던져 (+ entry.toString (), 전자 "eromanga 이벤트의 ERROR ## 파서 오류, 데이터가")
}

//输出事件信息
CanalEntry.EventType rowChange.getEventType 이벤트 유형 = ();
헤더 헤더 entry.getHeader = ();
LOG.info (및 String.format ( "\ n을 ================한다 바이너리 로그 [% S %의 S, 이름 [%의 S %의 S, 이벤트 유형 % S "
header.getLogfileName () header.getLogfileOffset ()
header.getSchemaName () header.getTableName ()
이벤트 유형));

//解析事件
위한 (즉 rowData CanalEntry.RowData : rowChange.getRowDatasList ()) {
(이벤트 유형 == EventType.DELETE) {경우
LOG.info ( "\ n을 ------- 하였다 삭제");
deleteData (header.getTableName () rowData.getBeforeColumnsList ());
} 다른 경우 (이벤트 유형 == EventType.INSERT) {
LOG.info ( "\ n을 -------된다 삽입");
때문에 updateData (header.getTableName () rowData.getAfterColumnsList ());
} 다른 경우 (이벤트 유형 == EventType.UPDATE) {
//LOG.info("\n-------> 전에 ");
// printColumn (rowData.getBeforeColumnsList ());
LOG.info ( "\ n을 -------한다 후");
때문에 updateData (header.getTableName () rowData.getAfterColumnsList ());
}
}
}
}

/ **
*更新数据
* /
개인 무효 때문에 updateData (문자열 TABLENAME, 목록 <칼럼> 열) {
/ **
* 1.获取主键
* 2根据主键查询
* 3更新HBase를到
* /
//获取主键
긴 키 =하는 getKey (열);

HbaseSerialization 직렬화 = NULL;
//根据不同表做处理
경우 (tableName.equals ( "hr_employee")) {
직렬화 = sqlDataService.getEmployeeById (키);
}

경우 (! 직렬화 = null가) {
시도 {
직원 직원 = hbaseUtils.getData (새 가져 오기 (Bytes.toBytes (키)), Employee.class);
LOG.info ( "이전 : \ n"+ 직원);

hbaseUtils.putData (직렬화);

직원 = hbaseUtils.getData (새 가져 오기 (Bytes.toBytes (키)), Employee.class);
LOG.info ( "이전 : \ n"+ 직원);
} 캐치 (예외 전자) {
LOG.error (e.getMessage ());
}
}
}

/ **
*删除数据
* /
개인 무효 deleteData (문자열 TABLENAME, 목록 <칼럼> 열) {
/ **
* 기본 키 1. 가져 오기
* 기본 데이터 HBase를 2. 삭제를 키
* /
// 기본 키 얻기
긴 키 =하는 getKey (열),

클래스 clazz에 = NULL을;
// 다른 항원 결정기에 따라 처리를 할
경우 (tableName.equals ( "hr_employee ")) {
clazz에 = Employee.class;
}

은 try {
직원 직원 = hbaseUtils.getData) ((키 가져 오기 새 새 (Bytes.toBytes), Employee.class)
log.info ("이전 : \ N- "직원 +);

; hbaseUtils.deleteData (clazz에는, 키)) (새 새 (Bytes.toBytes 삭제)

직원 = hbaseUtils.getData (가져 오기 새 새 (Bytes.toBytes (키)), Employee.class)
log.info ( "\ N- 후" 직원 +);
} 캐치 (예외 E) {
log.error (e.getMessage ());
}

}

/ **
* 기본 키를 가져 오기
* @return
* /
개인 긴하는 getKey (목록 <열> 열) {
은 try {
에 대한 (열 열 : 열) {
IF (. Column.getName () 등호 ( "ID를")) {
반환 Long.valueOf (column.getValue ()) ;
}
}
} 캐치 (예외 E) {
e.printStackTrace ();
하며이 RuntimeException의 새로운 새로운 ( "찾을 수 없음 기본 키!")을 던져
}
는 A RuntimeException의 새로운 새로운 ( "찾을 수 없음 기본 키!") 던져;
}

}
V. 코드
- --------------------
저자 : beyond_qjm의
소스 : CSDN의
원래 : HTTPS : //blog.csdn.net/beyond_qjm/article/details/83624896
저작권 :이 문서는 블로거 원래 문서, 복제, 보웬 링크를 첨부 해주세요!

추천

출처www.cnblogs.com/HKROnline-SyncNavigator/p/10973449.html