由於業務需求,需要從Oracle數據庫中獲取某表的修改日誌信息。這裏講解一下在GitHub中kafka-connect-oracle 連接器的部署。
1、GitHub中下載項目
2、添加配置
a.數據庫必須處於archivelog模式:
sqlplus / as sysdba //sqlplus sys/sys as sysdba;
SQL>shutdown immediate
SQL>startup mount
SQL>alter database archivelog;
SQL>alter database open;
b.啓用補充日誌記錄:
sqlplus / as sysdba
SQL>alter database add supplemental log data (all) columns;
c.爲了成功執行連接器,必須使用特權Oracle用戶啓動連接器。如果給定的用戶具有DBA角色,則可以跳過此步驟。否則,需要執行以下腳本來創建特權用戶:
create role logmnr_role;
grant create session to logmnr_role;
grant execute_catalog_role,select any transaction ,select any dictionary to logmnr_role;
create user kafka identified by kafkapass;
grant logmnr_role to kafka;
alter user kafka quota unlimited on users;
3、修改配置文件
配置文件在此路徑下:kafka-connect-oracle-master.config.OracleSourceConnector.properties
可以看到其中的默認配置信息:
其中參數介紹:
名稱 |
類型 |
描述 |
name |
String |
連接器名稱 |
connector.class |
String |
此連接器的Java類的名稱。 |
db.name.alias |
String |
數據庫的標識符名稱(例如Test,Dev,Prod)或用於標識數據庫的特定名稱。此名稱將用作主題和架構名稱的標頭。 |
task.max |
Integer |
創建的最大任務數。此連接器使用單個任務。 |
topic |
String |
消息將被寫入的主題的名稱。如果設置了一個值,則所有消息都將被寫入此聲明的主題(如果未設置),則將爲每個數據庫表動態創建一個主題。 |
db.name |
String |
要連接的數據庫的服務名稱或sid。通常使用數據庫服務名稱。 |
db.hostname |
String |
Oracle數據庫服務器的IP地址或主機名。 |
db.port |
Integer |
Oracle數據庫服務器的端口號。 |
db.user |
String |
用於連接到數據庫以啓動和執行logminer的數據庫用戶的名稱。該用戶必須提供上述必要的特權。 |
db.user.password |
String |
數據庫用戶密碼。 |
db.fetch.size |
Integer |
此配置屬性設置Oracle行提取大小值。 |
table.whitelist |
String |
用逗號分隔的將要捕獲的數據庫模式或表名稱的列表。 |
parse.dml.data |
Boolean |
如果爲true,則捕獲的sql DML語句將解析爲字段和值;如果爲false,則僅發佈sql DML語句。 |
reset.offset |
Boolean |
如果爲true,則在連接器啓動時將偏移值設置爲數據庫的當前SCN。如果爲false,則連接器將從上一個偏移值開始。 |
start.scn |
Long |
如果設置爲,則將偏移值設置爲該指定值,並且logminer將從此SCN啓動。如果連接器希望從所需的SCN啓動,則可以使用此屬性。 |
multitenant |
Boolean |
如果爲true,則啓用多租戶支持。如果爲false,將使用單實例配置。 |
table.blacklist |
String |
用逗號分隔的數據庫模式或表名列表,將不會捕獲。 |
修改前(默認):
name=oracle-logminer-connector
connector.class=com.ecer.kafka.connect.oracle.OracleSourceConnector
db.name.alias=test
tasks.max=1
topic=cdctest
db.name=testdb
db.hostname=10.1.X.X
db.port=1521
db.user=kminer
db.user.password=kminerpass
db.fetch.size=1
table.whitelist=TEST.*,TEST2.TABLE2
parse.dml.data=true
reset.offset=true
start.scn=
multitenant=false
修改後:
name=oracle-logminer-connector
connector.class=com.ecer.kafka.connect.oracle.OracleSourceConnector
db.name.alias=sc
tasks.max=1
topic=student
db.name=scott
db.hostname=192.168.129.156
db.port=1521
db.user=kafka
db.user.password=kafkapass
db.fetch.size=1
table.whitelist=SC.student
parse.dml.data=true
reset.offset=false
multitenant=false
4、保存後建立與運行
A.右鍵項目名後 Run as->Maven clean,然後再Run as->Maven install。
B.產生jar包:kafka-connect-oracle-1.0.jar 和lib中的ojdbc7.jar 複製到KAFKA_HOME / lib文件夾中。
a.先拷貝到一個指定的路徑下:/root/kafka---oracle
b.在kafka的conf.dist路徑下找到connect-distributed.properties文件並修改其中的plugin.path:
plugin.path=/root/kafka---oracle
也建議一些連接器,轉換器的所需的jar包可以放在這裏指定路徑
eg:如果CONFLUENT平臺用於kafka集羣,請將ojdbc7.jar和kafka-connect-oracle-1.0.jar複製到$ CONFLUENT_HOME / share / java / kafka-connect-jdbc文件夾。
C.將config / OracleSourceConnector.properties文件複製到$ KAFKA_HOME / config中。我這裏的kafka是CDH中安裝的,所以路徑是:/opt/cloudera/parcels/KAFKA-4.1.0-1.4.1.0.p0.4/etc/kafka/conf.dist
D.儘量不改動其中的文件,複製connect-distributed.properties爲connect-distributed-Oracle.properties 並對其修改
其中配置信息:
bootstrap.servers=localhost:9092
group.id=connect-cluster
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=true
value.converter.schemas.enable=true
offset.storage.topic=connect-offsets
offset.storage.replication.factor=1
config.storage.topic=connect-configs
config.storage.replication.factor=1
status.storage.topic=connect-status
status.storage.replication.factor=1
offset.flush.interval.ms=10000
plugin.path=/root/kafka---oracle
E.啓動連接器
CDH中kafka的connect-distributed.sh存在目錄:/opt/cloudera/parcels/KAFKA-4.1.0-1.4.1.0.p0.4/lib/kafka/bin
CDH中kafka的connect-distributed.properties存在目錄:/opt/cloudera/parcels/KAFKA-4.1.0-1.4.1.0.p0.4/etc/kafka/conf.dist
> cd /opt/cloudera/parcels/KAFKA-4.1.0-1.4.1.0.p0.4
> ./lib/kafka/bin/connect-distributed.sh ./etc/kafka/conf.dist/connect-distributed-Oracle.properties ./etc/kafka/conf.dist/OracleSourceConnector.properties
可能會報錯:
…………
log4j:ERROR Could not read configuration file from URL [file:./lib/kafka/bin/../config/connect-log4j.properties].
java.io.FileNotFoundException: ./lib/kafka/bin/../config/connect-log4j.properties (No such file or directory)
…………
解決辦法在此博客:使用kafka報錯log4j:ERROR Could not read configuration file from URL
注意:這裏的kafka是CDH創建的,所以後面設計到的sh或者properties不選擇connect-standalone,而是connect-distributed!!!主要的區別就是 connect-standalone 是對單節點的kafka進行操作,而connect-distributed是對集羣中的kafka進行操作。
F.執行成功