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使用py2exe打包程序介绍
Nov 20 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 Python
使用Python控制摄像头拍照并发邮件
Apr 23 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
pytorch实现onehot编码转为普通label标签
Jan 02 Python
树莓派升级python的具体步骤
Jul 05 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 Python
python playwrigh框架入门安装使用
Jul 23 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
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
php将12小时制转换成24小时制的方法
2015/03/31 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
Python实现从url中提取域名的几种方法
2014/09/26 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
python中return的返回和执行实例
2019/12/24 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
python中os.remove()用法及注意事项
2021/01/31 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
银行财务部实习生的自我鉴定
2013/11/27 职场文书
简历自我评价怎么写呢?
2014/01/06 职场文书
五年级数学教学反思
2014/02/11 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
英文商务邀请函范文
2015/01/31 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
python编写五子棋游戏
2021/05/25 Python
Python实现生活常识解答机器人
2021/06/28 Python
Python合并pdf文件的工具
2021/07/01 Python