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 ...
随机推荐
- 学习Python要知道哪些重要的库和工具
本文转自:https://github.com/jobbole/awesome-python-cn 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具. ...
- Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)
正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Blend下能够设计出很多满意的动画作品,或许他具体是怎么实现的,通过什么方式实现的我们还是一无所知.本篇将续前面几篇基础动画之上,详细 ...
- js获取span标签的值
<!DOCTYPE html> <html lang="en"><head> <meta charset="UTF-8" ...
- Tomcat服务器使用(一)
1. Tomcat服务器端口的配置 Tomcat服务器的配置文件主要在conf文件夹中,conf文件夹下的server.xml是配置文件的核心,默认的配置端口是8080,如果想要修改为其他的端口,可在 ...
- fzu 2138 久违的月赛之一 容斥。
Problem 2138 久违的月赛之一 Accept: 40 Submit: 86 Time Limit: 1000 mSec Memory Limit : 32768 KB Probl ...
- hibernate下Session的获取方式
Session是应用程序与数据库之间的一个会话,其重要性不言而喻.初学Hibernate,使用SessionFactory,老老实实地打开事务,提交,回滚,关闭session. 1.直接通过Sessi ...
- AMD 规范与CMD 规范概要
命名冲突和文件依赖,是前端开发过程中的两个经典问题.通过模块化开发来解决. AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 规范在这 ...
- flask接收前台的ajax的post数据
html <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...
- DOM Tree
DOM Tree 什么是DOM树:网页的所有内容在内存当中,其实是以树形结构存储的 何时创建:当浏览器,读取html中内容的时候,会马上开始创建DOM树. 如何创建: 1.读到HTML的时候还没有 ...
- Dockerfile定制镜像
一.Dockerfile是什么? 镜像定制实质就是定制每一层所添加的配置.文件. Dockerfile就是一个脚本来构建和定制镜像,把每一层的修改.安装.构建.操作都写入脚本.以此来解决体积.镜像构建 ...