python使用shell脚本创建kafka连接器


Posted in Python onApril 29, 2022

环境

cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
python -V
Python 2.7.5

安装连接oracle的python包

pip install cx_Oracle==7.3

获取oracle表信息

cat query_oracle.py 
#!/usr/bin/env python
import cx_Oracle
import sys
import os
import csv
import traceback
file = open("oracle.txt", 'w').close()
user = "test"
passwd = "test"
listener = '10.0.2.15:1521/orcl'
conn = cx_Oracle.connect(user, passwd, listener)
cursor = conn.cursor()
sql = "select table_name from user_tables"
 
cursor.execute(sql)
LIST1=[]
while True:
    row = cursor.fetchone()
    if row == None:
        break
    for table in row:
        #print table
        LIST1.append(table)
LIST2=[]
for i in LIST1:
    sql3 = "select COLUMN_NAME,DATA_TYPE,DATA_PRECISION,DATA_SCALE from cols WHERE TABLE_name=upper('%s')" %i
    cursor.execute(sql3)
    cursor.execute(sql3)
    row3 = cursor.fetchall()
    for data in row3:
        #LIST2.append(i)
        LIST2.extend(list(data))
    LIST2.append(i)
    f=open('oracle.txt','a+')
    print >> f,LIST2
    LIST2=[]
#f=open('test.txt','a+')
#select table_name,column_name,DATA_TYPE from cols WHERE TABLE_name=upper('student'); 
#select column_name,DATA_TYPE from cols WHERE TABLE_name=upper('student');

去掉多余部分

cat auto.sh 
#!/bin/bash
#python query_oracle.py |tr "," ' '|tr "'" ' '|tr "[" " "|tr "]" " "
#>oracle.txt
>oracle_tables.txt
cat oracle.txt |tr "[],'" " "|sed "s#[ ][ ]*# #g"|sed 's/^[ \t]*//g' >> oracle_tables.txt
cat oracle_tables.txt 
SNO NUMBER 19 0 SNAME VARCHAR2 None None SSEX VARCHAR2 None None SBIRTHDAY DATE None None SCLASS VARCHAR2 None None STUDENT DATE_DATE 
SNO2 NUMBER 19 0 SNAME VARCHAR2 None None SSEX VARCHAR2 None None SBIRTHDAY DATE None None SCLASS VARCHAR2 None None STUDENT2 INPUT_TIME
SNO3 NUMBER 19 2 SNAME VARCHAR2 None None SSEX VARCHAR2 None None SBIRTHDAY DATE None None SCLASS VARCHAR2 None None STUDENT3 DATA_DATE

shell 脚本处理表信息文件

cat connect.sh 
#!/bin/bash
#获取临时文件的行数
FILE_NUM=$(cat oracle_tables.txt |egrep -v '#|^$'|wc -l)
#清空自动创建连接器的脚本
>create-connect.sh
#循环临时文件每一行
for i in `seq $FILE_NUM`
do 
    FILE_LINE=$(sed -n ${i}p oracle_tables.txt)
    TABLE_NAME=$(echo ${FILE_LINE}|sed 's/[ \t]*$//g'|awk '{print $(NF-1)}')
    COL_NUM=$(echo ${FILE_LINE}|sed 's/[ \t]*$//g'|awk -F "[ ]" '{print NF}')
    REAL_COL_NUM=`expr $COL_NUM - 2`
    #清空临时文件
    >${TABLE_NAME}.txt
    >${TABLE_NAME}.sql
    #循环临时文件每行列名所在的列
    for j in `seq 1 4 $REAL_COL_NUM`
    do
        k=`expr $j + 1`
        m=`expr $j + 2`
        n=`expr $j + 3`
        COL_NAME=$(echo $FILE_LINE|cut -d " " -f${j})
        COL_DATA_TYPE=$(echo $FILE_LINE|cut -d " " -f${k})
        COL_DATA_PRECISION=$(echo $FILE_LINE|cut -d " " -f${m})
        COL_DATA_SCALE=$(echo $FILE_LINE|cut -d " " -f${n})
        #判断列的数据类型是否是NUMBER
        if [ "$COL_DATA_TYPE" = "NUMBER" ]
        then
        #循环拼接SQL查询中的CAST(* AS *) AS *部分,追加到临时文件中
            echo "CAST($COL_NAME AS $COL_DATA_TYPE($COL_DATA_PRECISION,$COL_DATA_SCALE)) AS $COL_NAME" >> ${TABLE_NAME}.txt
        else
        #循环拼接SQL查询中的列名部分,追加到临时文件中
            echo "$COL_NAME" >> ${TABLE_NAME}.txt
        fi
    done
    #拼接完整的SQL语句,追加到临时文件中
    echo "select $(cat ${TABLE_NAME}.txt |tr "\n" ","|sed -e 's/,$/\n/') from $TABLE_NAME where $(sed -n ${i}p oracle_tables.txt|cut -d ' ' -f$COL_NUM)>=trunc(sysdate-2) and $(sed -n ${i}p oracle_tables.txt|cut -d ' ' -f$COL_NUM)<trunc(sysdate-1)" >> ${TABLE_NAME}.sql
#循环追加每个表对应的连接器到自动创建连接器的脚本中
cat >> create-connect.sh << EOF
curl -X POST http://localhost:8083/connectors -H "Content-Type: application/json" -d '{
"name": "jdbc_source_$TABLE_NAME",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
"connection.url": "jdbc:oracle:thin:@{{ ORACLE_IP }}:{{ ORACLE_PORT }}:orcl",
"connection.user": "{{ ORACLE_USER }}",
"connection.password": "{{ ORACLE_PASSWD }}",
"topic.prefix": "YC_$TABLE_NAME",
"mode": "{{ CONNECT_MODE }}",
"query": "$(cat ${TABLE_NAME}.sql)"
}
}' >/dev/null 2>&1
EOF
done

说明:脚本中{{ 变量名 }}部分的内容是获取ansible中的变量,这个脚本是和ansible结合使用的。

增强版处理表信息脚本

#!/bin/bash
#获取临时文件的行数
FILE_NUM=$(cat oracle_time_tables.txt |egrep -v '#|^$'|wc -l)
#清空创建连接器的脚本并追加echos函数
> create-jdbc-connect.sh
cat >> create-jdbc-connect.sh << EOF
#!/bin/bash
echos(){
case \$1 in
red)    echo -e "\033[31m \$2 \033[0m";;
green)  echo -e "\033[32m \$2 \033[0m";;
yellow) echo -e "\033[33m \$2 \033[0m";;
blue)   echo -e "\033[34m \$2 \033[0m";;
purple) echo -e "\033[35m \$2 \033[0m";;
*)      echo "\$2";;
esac
}
EOF
> create-jdbc-connect-time.sh
cat >> create-jdbc-connect-time.sh << EOF
#!/bin/bash
echos(){
case \$1 in
red)    echo -e "\033[31m \$2 \033[0m";;
green)  echo -e "\033[32m \$2 \033[0m";;
yellow) echo -e "\033[33m \$2 \033[0m";;
blue)   echo -e "\033[34m \$2 \033[0m";;
purple) echo -e "\033[35m \$2 \033[0m";;
*)      echo "\$2";;
esac
}
EOF
#创建表相关文件目录
mkdir -p ./TABLE_TIME
#循环临时文件每一行
for i in `seq $FILE_NUM`
do 
    FILE_LINE=$(sed -n ${i}p oracle_time_tables.txt)
    TABLE_NAME=$(echo ${FILE_LINE}|sed 's/[ \t]*$//g'|awk '{print $(NF)}')
    COL_NUM=$(echo ${FILE_LINE}|sed 's/[ \t]*$//g'|awk -F "[ ]" '{print NF}')
    REAL_COL_NUM=`expr $COL_NUM - 2`
    #清空临时文件
    >./TABLE_TIME/${TABLE_NAME}_time.txt
    >./TABLE_TIME/${TABLE_NAME}_time.sql
    >./TABLE_TIME/${TABLE_NAME}.sql
    #循环临时文件每行列名所在的列
    for j in `seq 1 4 $REAL_COL_NUM`
    do
        k=`expr $j + 1`
        m=`expr $j + 2`
        n=`expr $j + 3`
        COL_NAME=$(echo $FILE_LINE|cut -d " " -f${j})
        COL_DATA_TYPE=$(echo $FILE_LINE|cut -d " " -f${k})
        COL_DATA_PRECISION=$(echo $FILE_LINE|cut -d " " -f${m})
        COL_DATA_SCALE=$(echo $FILE_LINE|cut -d " " -f${n})
        #判断列的数据类型是否是NUMBER
        if [ "$COL_DATA_TYPE" = "NUMBER" ]
        then
        #循环拼接SQL查询中的CAST(* AS *) AS *部分,追加到临时文件中
            echo "CAST($COL_NAME AS $COL_DATA_TYPE($COL_DATA_PRECISION,$COL_DATA_SCALE)) AS $COL_NAME" >> ./TABLE_TIME/${TABLE_NAME}_time.txt
        else
        #循环拼接SQL查询中的列名部分,追加到临时文件中
            echo "$COL_NAME" >> ./TABLE_TIME/${TABLE_NAME}_time.txt
        fi
        #判断是否存在hosts中定义的时间列,如果有就追加该列名进一个临时文件中
        TIME_COL=({{ TABLE_TIME_COL }})
        for TIME in ${TIME_COL[@]}
        do
            if [ "$COL_NAME" = "$TIME" ]
            then
                echo "$COL_NAME" > ./TABLE_TIME/${TABLE_NAME}_TIME_COL.txt
            fi
        done
    done
    #拼接完整的SQL语句,追加到临时文件中
    if [ -f "./TABLE_TIME/${TABLE_NAME}_TIME_COL.txt" ]
    then
    #echo "select $(cat ./TABLE_TIME/${TABLE_NAME}.txt |tr "\n" ","|sed -e 's/,$/\n/') from {{ ORACLE_TABLES_USER }}.$TABLE_NAME where $(sed -n ${i}p oracle_tables.txt|cut -d ' ' -f$COL_NUM)>=trunc(sysdate-2) and $(sed -n ${i}p oracle_tables.txt|cut -d ' ' -f$COL_NUM)<trunc(sysdate-1)" >> ./TABLE_TIME/${TABLE_NAME}_time.sql
        echo "select $(cat ./TABLE_TIME/${TABLE_NAME}_time.txt |tr "\n" ","|sed -e 's/,$/\n/') from {{ ORACLE_TABLES_USER }}.$TABLE_NAME where $(cat ./TABLE_TIME/${TABLE_NAME}_TIME_COL.txt)>=trunc(sysdate-2) and $(cat ./TABLE_TIME/${TABLE_NAME}_TIME_COL.txt)<trunc(sysdate-1)" >> ./TABLE_TIME/${TABLE_NAME}_time.sql
    else
        echo "select $(cat ./TABLE_TIME/${TABLE_NAME}_time.txt |tr "\n" ","|sed -e 's/,$/\n/') from {{ ORACLE_TABLES_USER }}.$TABLE_NAME" >> ./TABLE_TIME/${TABLE_NAME}.sql
    fi
#循环追加每个表对应的连接器到自动创建连接器的脚本中
if [ -f "./TABLE_TIME/${TABLE_NAME}_TIME_COL.txt" ]
then
cat >> create-jdbc-connect-time.sh << EOF
#创建表 $TABLE_NAME 连接器的命令如下
curl -X POST http://localhost:8083/connectors -H "Content-Type: application/json" -d '{
"name": "jdbc_time_$TABLE_NAME",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
"connection.url": "jdbc:oracle:thin:@{{ ORACLE_IP }}:{{ ORACLE_PORT }}:{{ ORACLE_SERVER_NAME }}",
"connection.user": "{{ ORACLE_USER }}",
"connection.password": "{{ ORACLE_PASSWD }}",
"topic.prefix": "YC_${TABLE_NAME}_INSERT",
"poll.interval.ms": "86400000",
"mode": "{{ CONNECT_MODE }}",
"numeric.mapping": "best_fit",
"query": "$(cat ./TABLE_TIME/${TABLE_NAME}_time.sql)"
}
}' >/dev/null 2>&1
#判断连接器是否创建成功
if [ \$? -eq 0 ]
then
    echos green "\$(date +"%F %H:%M:%S") 创建jdbc_time_${TABLE_NAME} 连接器成功"
else
    echos red "\$(date +"%F %H:%M:%S") 创建jdbc_time_${TABLE_NAME} 连接器失败"
fi
EOF
else
cat >> create-jdbc-connect.sh << EOF
#创建表 $TABLE_NAME 连接器的命令如下
curl -X POST http://localhost:8083/connectors -H "Content-Type: application/json" -d '{
"name": "jdbc_$TABLE_NAME",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
"connection.url": "jdbc:oracle:thin:@{{ ORACLE_IP }}:{{ ORACLE_PORT }}:{{ ORACLE_SERVER_NAME }}",
"connection.user": "{{ ORACLE_USER }}",
"connection.password": "{{ ORACLE_PASSWD }}",
"topic.prefix": "YC_${TABLE_NAME}_INSERT",
"poll.interval.ms": "86400000",
"mode": "{{ CONNECT_MODE }}",
"numeric.mapping": "best_fit",
"query": "$(cat ./TABLE_TIME/${TABLE_NAME}.sql)"
}
}' >/dev/null 2>&1
#判断连接器是否创建成功
if [ \$? -eq 0 ]
then
    echos green "\$(date +"%F %H:%M:%S") 创建jdbc_${TABLE_NAME} 连接器成功"
else
    echos red "\$(date +"%F %H:%M:%S") 创建jdbc_${TABLE_NAME} 连接器失败"
fi
EOF
fi
done

到此这篇关于python结合shell自动创建kafka的连接器的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
《Python之禅》中对于Python编程过程中的一些建议
Apr 03 Python
用Python将IP地址在整型和字符串之间轻松转换
Mar 22 Python
Python 用Redis简单实现分布式爬虫的方法
Nov 23 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
pandas数据集的端到端处理
Feb 18 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
Python日志syslog使用原理详解
Feb 18 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
Oct 21 Python
Pytorch distributed 多卡并行载入模型操作
Jun 05 Python
python中pycryto实现数据加密
Apr 29 #Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 #Python
Python如何让字典保持有序排列
Apr 29 #Python
Python按顺序遍历并读取文件夹中文件
Apr 29 #Python
Python保存并浏览用户的历史记录
Apr 29 #Python
python解析json数据
Apr 29 #Python
python的html标准库
Apr 29 #Python
You might like
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
php下批量挂马和批量清马代码
2011/02/27 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
两种php实现图片上传的方法
2016/01/22 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
用js遍历 table的脚本
2008/07/23 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
自我评价怎么写正确呢?
2013/12/02 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
食品药品安全责任书
2015/05/11 职场文书
新闻稿件写作范文
2015/07/18 职场文书
团队拓展训练感想
2015/08/07 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers