从hive中读取数据推送到kafka
由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的更多相关文章
- HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)
传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据 ...
- 一个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 ...
- Kafka消费者 从Kafka中读取数据并写入文件
Kafka消费者 从Kafka中读取数据 最近有需求要从kafak上消费读取实时数据,并将数据中的key输出到文件中,用于发布端的原始点进行比对,以此来确定是否传输过程中有遗漏数据. 不废话,直接上代 ...
- 使用Node.js实现数据推送
业务场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器). 后端推送数据的解决方案有很多,比如轮询.Comet.WebSocket. 1. 轮询对于后端来说开发成本最低,就是按照传统的 ...
- iOS开发中的远程推送实现(最新,支持iOS9)
我的个人项目<丁丁印记>中加入了远程推送功能,按照操作说明去做还是比较容易实现的,但是学的不够不系统,而且iOS8之后的推送和之前的版本是有所不同的,因此这篇文章希望总结一下最新的iOS推 ...
- 基于Web的数据推送技术(转)
基于Web的数据推送技术 对于实时性数据显示要求比较高的系统,比如竞价,股票行情,实时聊天等,我们的解决方案有以下几种.1. HTTP请求发送模式,一般可以基于ajax的请求,比如每3秒一次访问下服务 ...
- HTML5中的服务器‘推送’技术 -Server-Sent Events
转帖:http://www.developersky.net/thread-63-1-1.html 一直以来,HTTP协议都是严格遵循Request-Response模型的.客户端发送一个Reques ...
- SSE技术详解:使用 HTTP 做服务端数据推送应用的技术
SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议. 严格地说,HTTP 协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来 ...
- C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送
前言 本文将使用一个NuGet公开的组件技术来实现数据订阅推送功能,由服务器进行推送数据,客户端订阅指定的数据后,即可以接收服务器推送过来的数据,包含了自动重连功能,使用非常方便 nuget地址:ht ...
随机推荐
- C++学习笔记-运算符重载
运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...
- vue中 Vue.set 的使用
Vue.set(vm.items, indexOfItem, newValue) 1.vm.items :源数据:2.indexOfItem : 要修改的数据的键3.newValue : 要修改的数据 ...
- 【Windows】Windows server2008远程桌面只允许同时存在一个会话
打开控制面板-管理工具,终端服务-终端服务配置 1.连接:RDP-tcp 点右键,属性.网络适配器-最大连接数,只允许1个. 2.终端服务器授权模式:点右键,属性.常规,限制每个用户只能使用一个会话, ...
- XML 基本概念和XPath选择
books.xml文件 <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> ...
- WIN32_FIND_DATA
基本信息 编辑 关于文件的全部属性信息.总计有以下以下9种:文件的标题名.文件的属性(只读.存档,隐藏等).文件的创建时间.文件的最后访问时间.文件的最后修改时间.文件大小的高位双字.文件大小的低位双 ...
- js同步任务和异步任务的执行顺序
先来道今日头条面试题开开胃 async function async1() { console.log('async1 start'); await async2(); console.log('as ...
- 使用feign上传图片
1.添加依赖,支持SpringEncoder <dependency> <groupId>io.github.openfeign.form</groupId> &l ...
- Spring(十一)-- Spring代理生成器
Spring代理生成器 1.创建需要的dao接口 2.创建需要的daoImpl实现类 3.创建前置增强类 4.创建spring.xml文件 <!-- 这个案例 需要解决的问题: 一个代理工厂 配 ...
- Java中对象和引用的理解
偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两方面去更形象的认识理解,再去记忆. 一.对象和引用的概念: 在Java中万 ...
- 安装Python环境
首先我们来安装Python,Python3.5+以上即可 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图 ...