由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. CentOS下Subversion(SVN)的快速安装与配置

    如果你是一个软件开发者,你一定对Subversion不会感到陌生.Subversion是一个自由开源的版本控制系统.在Subversion管理下,文件和目录可以超越时空.Subversion将文件存放 ...

  2. hdfs(分布式文件系统)优缺点

    hdfs(分布式文件系统) 优点 支持超大文件 支持超大文件.超大文件在这里指的是几百M,几百GB,甚至几TB大小的文件.一般来说hadoop的文件系统会存储TB级别或者PB级别的数据.所以在企业的应 ...

  3. rtsp学习----海康RTSP客户端连接深入分析

    转载于:http://blog.csdn.net/zhouyongku/article/details/41546789 海康相机RTSP连接代码分析 最近在做海康相机rtsp连接获取音视频的工作,现 ...

  4. swift MT报文解析处理

    swift 官方资料:https://www2.swift.com/knowledgecentre/publications/us5mc_20180720/2.0?topic=alec.htm#gen ...

  5. session的垃圾回收机制

    session.gc_maxlifetime session.gc_probability session.gc_divisor session.gc_divisor 与 session.gc_pro ...

  6. Django创建数据库常用字段及参数

    Django创建数据库常用字段及参数 常用字段 1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列 ...

  7. rabbitmq中关于exchange模式type报错

    channel.exchange_declare(exchange='logs', type='fanout') 报错: Traceback (most recent call last):  Fil ...

  8. P3488 [POI2009]LYZ-Ice Skates

    传送门 这一题基础是二分图匹配,并且要知道一个 $Hall$ 定理:对于二分图能完全匹配的充要条件是,设点数少的那边为左边,点数为 $n$,对于 $k \in [1,n]$ ,左边任意 $k$ 个点, ...

  9. Leetcode简单题

    # Title Solution Acceptance Difficulty Frequency     1 Two Sum       44.5% Easy     2 Add Two Number ...

  10. bash脚本测试总结

    bash脚本测试总结   跟踪脚本的执行 可以让bash打印出你脚本执行的过程中的所有语句.这很简单,只需要使用bash的-x选项就可以做到,下面让我们来看一下.   下面的这段脚本,先是输出一个问候 ...