Spark系列-SparkSQL实战
- Spark系列-初体验(数据准备篇)
- Spark系列-核心概念
- Spark系列-SparkSQL
之前系统的计算大部分都是基于Kettle + Hive的方式,但是因为最近数据暴涨,很多Job的执行时间超过了1个小时,即使是在优化了HiveQL的情况下也有超过30分钟,所以近期把计算引擎从Hive变更为Spark。
普通的简单Job就使用SparkSQL来计算,数据流是经过spark计算,把结果插入到Mysql中
在项目中新建三个类,第一个Logger类用于日志的输出
# coding=utf-8
import logging
from logging import handlers
class Logger(object):
leven_relations = {
'debug':logging.DEBUG,
'info':logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR
}
def __init__(self, fileName, level='info', when='D', backCount=3, fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
self.logger = logging.getLogger(fileName)
format_str = logging.Formatter(fmt)
self.logger.setLevel(self.leven_relations.get(level))
#屏幕日志
sh = logging.StreamHandler()
sh.setFormatter(format_str)
#文件日志
th = handlers.TimedRotatingFileHandler(filename=fileName, when=when, backupCount=backCount, encoding='utf-8')
th.setFormatter(format_str)
self.logger.addHandler(th)
self.logger.addHandler(sh)
第二个是SparkSQL公共类,引用的是pyspark
# coding=utf-8
from pyspark import SparkConf,SparkContext
from pyspark.sql import HiveContext
class SparkSqlCommon(object):
sql_str = ''
app_name = ''
def __init__(self, sql, app_name):
if sql is None:
raise Exception('sql cannot be empty')
self.sql_str = sql
if app_name is None:
raise Exception('app_name cannot be empty')
self.app_name = app_name
def execute(self):
spark_conf = SparkConf().setAppName(self.app_name)
spark_context = SparkContext(conf=spark_conf)
spark_context.setLogLevel("INFO")
hive_context = HiveContext(spark_context)
result_rdd = hive_context.sql(self.sql_str)
result = result_rdd.collect()
return result
第三个是Mysql公共类,用于把计算结果落地到mysql
# coding=utf-8
import pymysql
from com.randy.common.Logger import Logger
class DatacenterCommon(object):
sql_str = ''
jdbcHost = ''
jdbcPort = ''
jdbcSchema = ''
jdbcUserName = ''
jdbcPassword = ''
'):
if sql_str is None:
raise Exception('sql_str cannot be empty')
self.sql_str = sql_str
self.jdbcHost = jdbcHost
self.jdbcPort = jdbcPort
self.jdbcSchema = jdbcSchema
self.jdbcUserName = jdbcUserName
self.jdbcPassword = jdbcPassword
self.log = log
def execute(self):
db = pymysql.connect(host=self.jdbcHost,
port=self.jdbcPort,
user=self.jdbcUserName,
passwd=self.jdbcPassword,
db=self.jdbcSchema,
charset='utf8')
try:
db_cursor = db.cursor()
db_cursor.execute(self.sql_str)
db.commit()
except Exception, e:
self.log.logger.error('str(e):\t\t', str(e))
db.rollback()
调用的客户端代码如下
# coding=utf-8
# !/usr/bin/python2.7
import datetime
from com.randy.spark.Logger import Logger
from com.randy.spark.SparkSqlCommon import SparkSqlCommon
from com.randy.spark.DatacenterCommon import DatacenterCommon
#需要修改,每个应用都不一样
app_name = 'demo1'
# SparkSql(不能以分号结尾)
select_sql = '''
SELECT count(*) from futures.account
'''
# Mysql
insert_sql = '''
insert into demo.demo1(id) values({0});
'''
if __name__ == '__main__':
currentDay = datetime.datetime.now().strftime('%Y%m%d')
log = Logger('/home/python-big-data-job/log/' + app_name + "_" + str(currentDay) + '.log')
log.logger.info("**************************start invoke {0},{1} *****************".format(app_name,currentDay))
sparkSqlCommon = SparkSqlCommon(sql=select_sql,app_name=app_name)
selectResult = sparkSqlCommon.execute()
log.logger.info("sparkSqlCommon result:{0}".format(selectResult))
if selectResult is None:
log.logger.error("taojin_1 selectResult while is empty")
else:
insert_sql = insert_sql.format(selectResult[0][0])
log.logger.info(insert_sql)
datacenterCommon = DatacenterCommon(sql_str=insert_sql, log=log)
datacenterCommon.execute()
log.logger.info("**************************end invoke {0},{1} *****************".format(app_name, currentDay))
其中spark-submit提交代码如下:
sudo -u hdfs spark-submit --master local[*] --py-files='/home/python-big-data-job/com.zip,/home/python-big-data-job/pymysql.zip' /home/python-big-data-job/taojin/demo1.py
因为项目中使用到了本地文件,所有把三个公共类打包到了com.zip中作为依赖文件
其中pymysql.zip是pymysql的源码文件,因为我在过程中发现了ImportError: No module named pymysql
但是集群已经使用pip安装了pymysql,没有找到有效解决办法,按照https://zhuanlan.zhihu.com/p/43434216和https://www.cnblogs.com/piperck/p/10121097.html都无效,最终只能把pymysql以依赖文件的方式打包
其中使用yarn cluster部署也还存在问题
Spark系列-SparkSQL实战的更多相关文章
- sparkSQL实战详解
摘要 如果要想真正的掌握sparkSQL编程,首先要对sparkSQL的整体框架以及sparkSQL到底能帮助我们解决什么问题有一个整体的认识,然后就是对各个层级关系有一个清晰的认识后,才能真正的 ...
- Hive On Spark和SparkSQL
SparkSQL和Hive On Spark都是在Spark上实现SQL的解决方案.Spark早先有Shark项目用来实现SQL层,不过后来推翻重做了,就变成了SparkSQL.这是Spark官方Da ...
- Spark大型项目实战:电商用户行为分析大数据平台
本项目主要讲解了一套应用于互联网电商企业中,使用Java.Spark等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分 ...
- 基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言
基于Spark和SparkSQL的NetFlow流量的初步分析--scala语言 标签: NetFlow Spark SparkSQL 本文主要是介绍如何使用Spark做一些简单的NetFlow数据的 ...
- Spark系列-核心概念
Spark系列-初体验(数据准备篇) Spark系列-核心概念 一. Spark核心概念 Master,也就是架构图中的Cluster Manager.Spark的Master和Workder节点分别 ...
- Spark系列-初体验(数据准备篇)
Spark系列-初体验(数据准备篇) Spark系列-核心概念 在Spark体验开始前需要准备环境和数据,环境的准备可以自己按照Spark官方文档安装.笔者选择使用CDH集群安装,可以参考笔者之前的文 ...
- nginx高性能WEB服务器系列之五--实战项目线上nginx多站点配置
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- hive on spark VS SparkSQL VS hive on tez
http://blog.csdn.net/wtq1993/article/details/52435563 http://blog.csdn.net/yeruby/article/details/51 ...
- Docker系列之实战:3.安装MariaDB
环境 [root@centos181001 ~]# cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) [root@centos1 ...
随机推荐
- PyQt5 应用在 TeamViewer 下无法使用全屏模式
PyQt5 应用在 TeamViewer 下无法使用全屏模式 问题描述 使用 PyQt5 (版本为 5.7)中的 QtWebEngineView 构建的桌面应用,部署到远程机器(Windows 7 平 ...
- 【转】C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- JAVA实现多线程处理批量发送短信、APP推送
/** * 推送消息 APP.短信 * @param message * @throws Exception */ public void sendMsg(Message message) throw ...
- 阿里云服务器centos6.x升级内核以能安装docker
centos版本为6.9,因为需要安装docker,所以需要将内核升级 升级步骤: 先导入公钥: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elr ...
- Tomcat热启动
===== 2017.7.1 ===== 如果是对原来的类方法修改,那么热启动非常好用:如果是添加了新的类或方法(非最上层的controller),那么此方法也是好用的:但是如果是在controlle ...
- CSS基础知识---浮动,定位和盒模型
转载请注明出处! 需要掌握的三个最重要的CSS概念是浮动,定位和盒模型. 盒模型概述: 页面上的每个元素都被看做一个矩形框(元素框or盒模型),这个框由元素内容,内边距,边框和外边距组成. 内边距出现 ...
- golang学习之select用法
早期的select函数是用来监控一系列的文件句柄,一旦其中一个文件句柄发生IO操作,该select调用就会被返回.golang在语言级别直接支持select,用于处理异步IO问题. select用法同 ...
- window.open()被浏览器拦截问题汇总
一.问题描述 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截.何况当出现拦截时,很多用户根本不知道发 ...
- mac 好用软件地址存储
Navicat Premium 12.0.24 for mac已破解中文 https://www.52pojie.cn/thread-727433-1-1.html sublime 破解方法https ...
- springboot自定义异常
SpringBoot自定义异常以及异常处理 在web项目中,我们可能需要给前端返回不同的提示码.例如:401表示没有权限,500代表位置异常,200代表请求成功等.但是这些提示码远远不能满足我们返回给 ...