由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. API接口设计的五大公共参数

    1.平台参数 2.操作系统参数 iOS.Android.PC等等 3.软件版本参数 4.udid号(设备唯一ID) 每个设备都会有一个唯一udid 5.渠道号 app软件从那个渠道下载

  2. Blender建模与游戏换装(转载文)

    本文转载自https://my.oschina.net/huliqing/blog/880113?hmsr=toutiao.io 如果本文涉及侵权行为,请原作者联系博主邮箱,我将及时进行删除处理 博主 ...

  3. Linux后台运行python程序并输出到日志文件

    后台运行python程序并标准输出到文件 现在有test.py程序要后台部署, 里面有输出内容 使用命令: nohup python -u test.py > test.log 2>&am ...

  4. (4.16)mysql备份还原——物理备份之XtraBackup实践

    关键词:XtraBackup实践,物理备份,xtrabackup备份,innobackupex备份 [1]如何使用? [3]系列:innobackupex --help |more [4]系列:xtr ...

  5. EM 算法(三)-GMM

    高斯混合模型 混合模型,顾名思义就是几个概率分布密度混合在一起,而高斯混合模型是最常见的混合模型: GMM,全称 Gaussian Mixture Model,中文名高斯混合模型,也就是由多个高斯分布 ...

  6. linux 下如何将网页版应用生成桌面图标

    使用linux mint已经两年了,很多国民应用,都没有Linux版,但是这些应用都有网页版,今天就说下最简单的将网页应用变成桌面应用,无需配置,安装任何插件.以微信为例; 首先,在谷歌浏览器打开网页 ...

  7. 安装gitlab ce

    切换到root用户,安装相关依赖 yum install curl policycoreutils openssh-server openssh-clients service sshd restar ...

  8. java 给定一个日期期间 返回形如Mar 2015 3/20-3/31的数据

    最近一个项目中有个前台对于表头要求: 给定一个日期期间返回形如 Mar 2015 3/20-3/31Apr 2015 4/1-4/30 这样的月年数据,简单的写了下代码,暂时没想到更好的办法 例如传进 ...

  9. hdu 6399 City Development

    vjudge 读进来可能会有相同的\(n_i\),不过在相同的\(n_i\)中只有最后一个是有用的,所以其他的要缩起来,缩完后这些\(n\)的数量不会超过19个 可以发现一个城市的答案为所有城市初始权 ...

  10. thinkphp3.2.3 自定义路由实践

    使用了很久的tp3,却没发现还有这么可玩性的功能. 官方文档:要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),并且在应用( ...