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 LOG =(OnlineSynch.class);

SqlDataService sqlDataService新しい新しいSqlDataService =( "SqlMapConfig.xml");
hbaseUtils hbaseUtils =新新hbaseUtils();

/ **
* HBaseのにリレーショナルデータベースからデータを同期させる
* /
(公共ボイドsynchToHbase){
//リンクの作成
CanalConnectorコネクタ= CanalConnectors.newSingleConnectorを(
たInetSocketAddress新新( "192.168.135.132"、
11111)、
"例"、
""、
""
);
int型BATCHSIZE = 1000;
ロングbatchId = NULL;
{試みる
connector.connectを();
//指定监听数据库
connector.subscribe( "grg_hr \\ .. *");
connector.rollback();
一方、(TRUE){
//获取指定数量的数据
メッセージメッセージ= connector.getWithoutAck(バッチサイズ)。
batchId = message.getId()。
。INTサイズ= message.getEntries()サイズ()。
IF(batchId == -1 ||サイズ== 0){
LOG.info( "waitting ...")。
{試す
のThread.sleep(1000);
}キャッチ(InterruptedExceptionある電子){
}
}他{
LOG.info(String.Formatの( "\ nmessage [batchId =%S、サイズ=%のS]"、batchId、サイズ))。
handleEntry(message.getEntries())。
}

connector.ack(batchId)。//提交确认
}
}キャッチ(例外e){
//处理失败、回滚数据
場合(!batchId = null)のconnector.rollback(batchId)。

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())。
}キャッチ(例外e){
新しいのRuntimeException( "eromangaイベントのERROR ##パーサがエラー、データがあります:" + entry.toString()、e)を投げます。
}

//输出事件信息
CanalEntry.EventType EventTypeがrowChange.getEventType()。
ヘッダヘッダ= entry.getHeader()。
LOG.info(String.Formatの( "\ nの================&GT;バイナリログ[%S:%のS]、名前[%sには、%S]、のeventType:% S」、
header.getLogfileName()、header.getLogfileOffset()、
header.getSchemaName()、header.getTableName()、
のeventType))。

//解析事件
のために(CanalEntry.RowData rowData:rowChange.getRowDatasList()){
IF(eventTypeを== EventType.DELETE){
LOG.info( "\ nは-------&GT;削除")。
deleteData(header.getTableName()、rowData.getBeforeColumnsList())。
}そうであれば(eventTypeを== EventType.INSERT){
LOG.info( "\ nの-------&GT;挿入")。
updateData(header.getTableName()、rowData.getAfterColumnsList())。
}そうであれば(eventTypeを== EventType.UPDATE){
//LOG.info("\n------->前」)。
// printColumn(rowData.getBeforeColumnsList());
LOG.info( "\ nは-------&GT;後")。
updateData(header.getTableName()、rowData.getAfterColumnsList())。
}
}
}
}

/ **
*更新数据
* /
プライベート無効にupdateData(文字列tableNameの、リスト<コラム>コラム){
/ **
* 1获取主键
* 2根据主键查询
* 3.更新HBaseの到
* /
//获取主键
ロングキー=のgetKey(列)。

HbaseSerializationのシリアライズ= NULL;
//根据不同表做处理
IF(tableName.equals( "hr_employee")){
シリアライゼーション= sqlDataService.getEmployeeById(キー)。
}

場合(!シリアライズ= nullは){
しようと{
従業員の従業員= hbaseUtils.getData(新規のGet(Bytes.toBytes(キー))、Employee.class)。
LOG.info( "の前に:\ n"は+従業員)。

hbaseUtils.putData(直列化);

従業員= hbaseUtils.getData(新規のGet(Bytes.toBytes(キー))、Employee.class)。
LOG.info( "の前に:\ n"は+従業員)。
}キャッチ(例外e){
LOG.error(e.getMessage())。
}
}
}

/ **
*删除数据
* /
プライベート無効deleteData(文字列tableNameの、リスト<コラム>コラム){
/ **
* 1.主キーを取得する
プライマリデータのHBase * 2. Deleteキー
* /
//プライマリキーゲット
ロングキー=のgetKey(列);

クラスclazzが= NULL;
//は異なるエピトープに応じた処理を行う
(tableName.equals(「hr_employee場合")){
clazz = Employee.class;
}

試し{
従業員= hbaseUtils.getData(新新(Bytes.toBytes(キーを取得))、Employee.class);
log.info("前:\ N-「従業員+);

hbaseUtils.deleteData(clazz、削除新新(Bytes.toBytes(キー)));

従業員= hbaseUtils.getData(新新(Bytes.toBytes(キー)を取得します)、Employee.class);
( "後:\ N-" log.info従業員+);
}キャッチ(例外E){
log.error(e.getMessage());
}

}

/ **
*主キーを取得します
* @return
* /
プライベート・ロングのgetKey(一覧<コラム>コラム){
試み{
のための(列column:列){
IF(。Column.getName()等号( "ID")を){
返すLong.valueOf(column.getValue()) ;
}
}
}キャッチ(例外E){
e.printStackTrace();
のRuntimeExceptionをスロー新新( "プライマリキーが見つかりません!");
}
新しい新しいのRuntimeExceptionを( "主キー見つかりません!")投げる;
}

}
V.コード
- --------------------
著者:beyond_qjm
ソース:CSDNの
元ます。https://blog.csdn.net/beyond_qjm/article/details/83624896
著作権:この記事はブロガーのオリジナルの記事は、再現し、ボーエンのリンクを添付してください!

おすすめ

転載: www.cnblogs.com/HKROnline-SyncNavigator/p/10973449.html