由python2.7语言实现的,包也比较旧了。

# -*- coding: utf-8 -*-
# Version: 1.0.0
# Description: py_Hive2Kafka2kafka
# Author: wqbin
# Create_date:20191026 import re
import sys
import os
import logging
import string
import datetime
import time
import random
import subprocess as sp from logging import handlers
from time import strftime, localtime
from pyhs2.haconnection import HAConnection
from kafka import KafkaProducer ################################环境变量的设置############################################
#1.指定编码格式
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' #2.加载fi的环境变量
ENV_FILE='/home/root/ficlient/bigdata_env' #加载ENV_FILE 相当于source /home/root/ficlient/bigdata_env
proc = sp.Popen(['bash','-c','source {0} && env'.format(ENV_FILE)],stdout = sp.PIPE)
for tup in map(lambda s: s.strip().split('=',1),proc.stdout):
k=tup[0].strip()
v=tup[1].strip()
os.environ[k]=v #3.KERBEROS 认证
KERBEROS_USER = "rootuser"
KERBEROS_KEYTAB = "/home/root/rootuser.keytab"
TGT_PATH="/home/root/tagidentity.tgt"
os.environ['KRB5CCNAME'] = TGT_PATH
os.system("kinit -kt %s %s" % (KERBEROS_KEYTAB,KERBEROS_USER)) #4.脚本路径 日志路径 配置路径
#MAIN_PATH = os.path.abspath(os.path.join(os.path.dirname("__file__"),os.path.pardir))
MAIN_PATH = "/ETL/pybin/py_Hive2Kafka" LOG_PATH = MAIN_PATH + "/log"
CONF_PATH = MAIN_PATH + "/conf"
#5.参数1:批次时间 20180721
batch_date = sys.argv[1] ################################日志######################################################
#日志中的时间格式
ISOTIMEFORMAT = '%Y-%m-%d %H:%M:%S' #日志路径
logfile = "%s/%s.log" % (LOG_PATH,batch_date) #整合层日志
LOGGER = logging.getLogger("data_life_manager") LOGGER_HANDLER = logging.handlers.RotatingFileHandler(logfile, maxBytes=20*1024*1024, backupCount=10)
FORMATTER = logging.Formatter("\r%(asctime)s [%(levelname)s] %(message)s", ISOTIMEFORMAT)
LOGGER_HANDLER.setFormatter(FORMATTER) LOGGER.setLevel(logging.INFO)
LOGGER.addHandler(LOGGER_HANDLER) console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(FORMATTER)
LOGGER.addHandler(console)
logger = LOGGER
logger.info(MAIN_PATH) ###################################从配置文件中获取配置################################### def get_conf(conf_file):
"""
Get conf from a file having attribute which relatives by equal sign.
Then, it will create and return a dic with conf.
"""
conf = {} def add_conf(key, value):
conf[key] = value map(lambda _: add_conf(_[0:_.index('=')], _[_.index('=') + 1:]),
map(lambda _: _.replace('"', '').replace('\n', ''),
#获取有效的配置行
filter(lambda _: "=" in _ and not _.startswith('#'),
open(conf_file).readlines()
)
)
)
return conf db_config = get_conf(MAIN_PATH + '/conf/database.conf') #Hive连接配置
HIVE_HOSTS = db_config.get('HIVE_HOSTS').split(',')
HIVE_PORT = db_config.get('HIVE_PORT')
queue_name = db_config.get('QUEUE_NAME') ###################################连接hive执行sql###################################
#查询统计结果sql
sql=''
if batch_date[6:8]=='':
print 'batch_date[6:7]:%s'%batch_date[6:8]
sql = "select column1,column2,column3,column4 from table1 where batch_date=%s ;" % (batch_date)
else:
print 'batch_date[6:7]:%s'%batch_date[6:8]
sql = "select column1,column2 from table1 where batch_date=%s ;" % (batch_date)
database = "dt"
templatecode = ""
transcode = ""
orsenderid = ""
orsenderchannel = "" def select_hive(queue_name, database, sql, logger):
v_queue_name = "set mapred.job.queue.name=%s" % queue_name
v_database = "use %s" % database
sql = sql.encode('UTF-8')
v_sql = re.sub(r';$', '', sql)
timeout11 = 3 * 60 * 60 * 1000
conf = {"krb_host": "hadoop001", "krb_service": "hive"}
print v_queue_name
print v_database
print v_sql
try:
with HAConnection(hosts=HIVE_HOSTS,
port=HIVE_PORT,
timeout=timeout11,
authMechanism="KERBEROS",
user='rootuser',
configuration=conf) as haConn:
with haConn.getConnection() as conn:
with conn.cursor() as cur:
print v_queue_name
logger.info(v_queue_name)
cur.execute(v_queue_name)
print v_database
logger.info(v_database)
cur.execute(v_database)
print v_sql
logger.info(v_sql)
cur.execute(v_sql)
tuple_dic = cur.fetchall()
if len(tuple_dic) == 0:
tuple_dic = None
except Exception, e:
logger.error(e)
raise Exception(e)
return tuple_dic ####################################自定义异常类################################### class UserDefException(Exception):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg ####################################拼接json字符串 发送kafka方法################################### def send_json_to_Kafka(batch_date):
data_cnt_tuple_dic = select_hive(queue_name, database, sql, logger)
print data_cnt_tuple_dic list = []
try:
for a in data_cnt_tuple_dic:
if len(a)==2:
list.append(a[0])
list.append(a[1])
break
elif len(a)==4:
list.append(a[0])
list.append(a[1])
list.append(a[2])
list.append(a[3])
break
else:
raise UserDefException("select返回不是4也不是2")
except Exception, e:
list = []
logger.error(e)
print list orSenderSN = ''.join(random.sample(string.ascii_letters + string.digits, 22))
agentSerialNo = ''.join(random.sample(string.ascii_letters + string.digits, 8))
verison_name = "abc"
model_plat = "" msg_head = '{"TemplateCode":"%s","TransCode":"%s","orSenderID":"%s","orSenderChannel":"%s","orSenderSN":"%s",' \
'"orSenderDate":"%s","curTime":"%d","agentSerialNo":"%s"}' \
% (templatecode, transcode, orsenderid, orsenderchannel, orSenderSN,
time.strftime("%Y%m%d", time.localtime()), int(round(time.time() * 1000)), agentSerialNo)
start_time = batch_date
end_time = batch_date
if batch_date[6:8]=='':
end_time=datetime.datetime.combine(datetime.date(int(batch_date[0:4]),int(batch_date[4:6]),int(batch_date[6:8]))-datetime.timedelta(days=30),datetime.time.min).strftime("%Y%m%d")
try: if batch_date[6:8]=='':
msg_result = '{' \
'"%s":%s,' \
'"%s":%s,' \
'"%s":%s,' \
'"%s":%s' \
'}' % ("column1",list[0],"column2",list[1],"column3",list[2],"column4",list[3])
elif batch_date[6:8]!='':
msg_result = '{' \
'"%s":%s,' \
'"%s":%s' \
'}' % ("column1",list[0],"column2",list[1])
else:
raise UserDefException("select返回不是4也不是2")
except Exception, e:
logger.error(e)
raise Exception(e) msg_body = '{"verison_name":"%s","version":"","model_plat":"%s","event_start_tm":"%s","event_end_tm":"%s","result":%s}' \
% (verison_name, model_plat, start_time, end_time, str(msg_result).replace("'", '"'))
msg = '{"head":%s,"body":%s}' % (msg_head, msg_body)
logger.info(msg) try:
send_kafka(msg)
except Exception, e:
logger.error(e)
raise Exception(e) bootstrap_servers = '192.168.164.202:9092,192.168.164.203:9092,192.168.164.204:9092'
topic = 'topic1'
retries = 2 # 发送数据到kafka
def send_kafka(msg):
try:
producer = KafkaProducer(bootstrap_servers=bootstrap_servers, retries=retries)
except Exception as e:
logger.error(e)
raise Exception("catch an exception when create KafkaProducer")
try:
producer.send(topic, msg)
producer.flush()
producer.close() except Exception as e:
logger.error(e)
if producer:
producer.close()
raise Exception("catch an exception when send message:%s" % msg) if __name__ == '__main__':
send_json_to_Kafka(batch_date)
print "data from hive to kafka has all successed"

conf文件如下

#Hive
HIVE_HOSTS=192.168.154.201
HIVE_PORT=
QUEUE_NAME=NO1
PUB_BIGDATA_ENV_FILE=/home/root/bigdata_env
PUB_HIVE_ENV_FILE=/home/root/Hive/component_env
PUB_COMMON_PATH=/etl/pub
PUB_KEYTAB_PATH=/etl/pub/keytab_file

从hive中读取数据推送到kafka的更多相关文章

  1. HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)

    传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据 ...

  2. 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式

    Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...

  3. Kafka消费者 从Kafka中读取数据并写入文件

    Kafka消费者 从Kafka中读取数据 最近有需求要从kafak上消费读取实时数据,并将数据中的key输出到文件中,用于发布端的原始点进行比对,以此来确定是否传输过程中有遗漏数据. 不废话,直接上代 ...

  4. 使用Node.js实现数据推送

    业务场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器). 后端推送数据的解决方案有很多,比如轮询.Comet.WebSocket. 1. 轮询对于后端来说开发成本最低,就是按照传统的 ...

  5. iOS开发中的远程推送实现(最新,支持iOS9)

    我的个人项目<丁丁印记>中加入了远程推送功能,按照操作说明去做还是比较容易实现的,但是学的不够不系统,而且iOS8之后的推送和之前的版本是有所不同的,因此这篇文章希望总结一下最新的iOS推 ...

  6. 基于Web的数据推送技术(转)

    基于Web的数据推送技术 对于实时性数据显示要求比较高的系统,比如竞价,股票行情,实时聊天等,我们的解决方案有以下几种.1. HTTP请求发送模式,一般可以基于ajax的请求,比如每3秒一次访问下服务 ...

  7. HTML5中的服务器‘推送’技术 -Server-Sent Events

    转帖:http://www.developersky.net/thread-63-1-1.html 一直以来,HTTP协议都是严格遵循Request-Response模型的.客户端发送一个Reques ...

  8. SSE技术详解:使用 HTTP 做服务端数据推送应用的技术

    SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议. 严格地说,HTTP 协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来 ...

  9. C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送

    前言 本文将使用一个NuGet公开的组件技术来实现数据订阅推送功能,由服务器进行推送数据,客户端订阅指定的数据后,即可以接收服务器推送过来的数据,包含了自动重连功能,使用非常方便 nuget地址:ht ...

随机推荐

  1. SVN(linux版)安装与使用

    SVN(linux版)安装与使用 一 简述:  SVN有2种运行方式,一种是 linux自带的轻量级服务器svnserve,一种是基于Apache的. 基于svnserve的,默认端口为3690,通过 ...

  2. 切换windows系统输入法的中英文,可以忽视是哪种打字法

    调用windows的API //用户获取当前输入法句柄 [DllImport("imm32.dll")] public static extern IntPtr ImmGetCon ...

  3. 从零开始,SpreadJS 新人学习笔记(第二周)

    Hello,大家好,我是Fiona.经过上周的学习,我已经初步了解了SpreadJS的目录结构,以及如何创建Spread项目到我的工程目录中.>>还不知如何开始学习SpreadJS的同学, ...

  4. 【计算机网络】-介质访问控制子层-无线LAN

    [计算机网络]-介质访问控制子层-无线LAN 802.11体系结构和协议栈 802.11网络使用模式: 有架构模式(Infrastructure mode) 无线客户端连接接入点AP,叫做有架构模式 ...

  5. 十进制快速幂(牛客多校第五场)-- generator 1

    思路: 十进制快速幂. #include <stdio.h>//sprintf #include <cstdlib>////malloc exit strcat itoa sy ...

  6. Android渐变色xml配置

    这里渐变色: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=&quo ...

  7. java-阿里云发送短信

    <!--aliyun短信sdk--> <dependency> <groupId>com.aliyun</groupId> <artifactId ...

  8. python基本数据类型零碎知识点

                                                                                                        ...

  9. java.util.MissingFormatArgumentException: Format specifier '%s'

    java.util.MissingFormatArgumentException: Format specifier '%s' at java.util.Formatter.format(Format ...

  10. 03 Linux下运行Django项目

    1.安装windows和linux传输文件的工具 pip install lrzsz 提供两个命令 一个是上传一个是下载 rz 接收 直接rz sz 上传 直接sz 或者直接拖拽 2.在线下载资源的命 ...