Spark-SQL的Java实践案例(五)

本章核心:JDBC 连接外部数据库,sparkSQL优化,故障监测

史上最简单的spark教程
所有代码示例地址:https://github.com/Mydreamandreality/sparkResearch

(提前声明:文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章,写作不易,转载请注明)
(文章参考:Elasticsearch权威指南,Spark快速大数据分析文档,Elasticsearch官方文档,实际项目中的应用场景)
(帮到到您请点点关注,文章持续更新中!)
Git主页 https://github.com/Mydreamandreality

在这里我们继续之前的SparkSQL的案例啊,没有看上一章节的兄弟萌 点击这里哈https://blog.csdn.net/youbitch1/article/details/88852644

装逼开始:[狗头保命]

ps:这应该是sparkSql的最后一章节了
  • Spark还支持使用JDBC从其他的数据库读取数据的数据源,返回的结果是dataframe
  • 如何使用
    • 使用DataSourceApi将来自远程数据库的表作为dataframe或者sparkSQL的临时视图进行加载
    • 用户可以在数据源中指定JDBC连接属性
    • 连接属性如下:

属性说明只是简单的说明,具体看后续的代码案例

属性参数 属性说明
URL JDBC的URL,这个我们搞java开发的应该都知道
user 数据库用户名
password 数据库密码
dbtable 表名称
driver jdbc driver
partitioncolumn,lowerbound,upperbound 指定分区的大小
numPartitions 表读写的并行度最大分区数,也是并发JDBC的最大连接数
fetchsize JDBC抓取大小,用于确定数据每次往返传递的行数,默认值较小(一般为10),适用于读取操作
batchsize JDBC批处理的大小,用于确定数据每次往返传递的行数,有利于提升jdbcdriver的性能默认1000,只适用于写操作
isolationlevel 事务隔离级别,适用于写操作
truncate 此选项会导致Spark截断现有表,而不是删除并重新创建
createtableoptions 创建表时指定各种选项,比如 CREATE TABLE t (name string) ENGINE=InnoDB
createtablecolumntypes 使用数据库的数据类型,而不是sparkSQL的默认类型,适用于写操作

老规矩,理论BB完了,下面就是我们的代码案例


读取JDBC数据代码案例:

        //第一种方式Dataset<Row> rddDataset = sparkSession.read().format("jdbc").option("url","jdbc:mysql:dbserver").option("user","root").option("password","root").option("dbtable","sys_alarm").load();//创建的第二种方式Properties properties = new Properties();properties.put("user","root");properties.put("password","root");Dataset<Row> rowDataset = sparkSession.read().jdbc("jdbc:mysql:dbserver","sys_alarm",properties);

可以看到第二种创建方法 .jdbc()的有参方法,参数已经帮我们定义好了

源码解析如下:


在此处也有各个参数的详解以及需要注意的事项


写入JDBC数据代码案例

  • 其实写入和读取基本都差不太多,看下面的案例
        //数据保存到JDBC源rddDataset.write().format("jdbc").option("url","jdbc:mysql:dbserver").option("user","root").option("password","root").option("dbtable","sys_alarm").save();//第二种方式把数据保存到JDBC源rddDataset.write().jdbc("jdbc:mysql:dbserver","sys_alarm",properties);//第三种方式:指定写的时候创建表列的数据类型rddDataset.write().option("createTableColumnTypes", "name CHAR(64), comments VARCHAR(1024)").jdbc("jdbc:mysql:dbserver","sys_alarm",properties);
  • 还是指定一些必须的参数,第三个中指定数据类型
  • 还是相对比较简单的
  • 大家在做的过程中可以没事看看源码,加深理解,很多的概念在源码中已经写得很清楚了


故障排除(摘自:官方文档)

  • 在客户端会话(client session)中或者所有 executor 上,JDBC 驱动类必须可见于原生的类加载器。
  • 这是因为 Java 的驱动管理(DriverManager )类在打开一个连接之前会做一个安全检查,这就导致它忽略了所有对原生类加载器不可见的驱动
  • 一个方便的方法,就是修改所有 worker 节点上的 compute_classpath.sh 以包含你的驱动 Jar 包

性能调优

  • 之前说sparkSQL会自动帮我们调优,但是我们还是可以在此基础上优化的
  • 不过调优嘛,从代码层面说要么就是缓存,要么就是调整初始选项

第一种调优方式:缓存数据到内存

  • SparkSQL可以通过cacheTable("tableName)或者dataFrame.cache()以列式存储的方式缓存表到内存中
  • 之后的话,sparkSQL会扫描必要的列,并且自动调整压缩的比例,以此减少GC和内存的压力
  • 我们可以用 spark.uncacheTable("tablename)删除内存中的表

第二种调优方式:调整初始选项

  • 下面的选项可以提升sparkSQL的查询能力,不过spark每次更新都会自动执行很多的优化操作,这些选项可能在以后就不需要我们手动调节优化了
参数名称 默认值 含义
spark.sql.files.maxPartitionBytes 134217728 (128 MB) 读取文件时单个分区可容纳的最大字节数
spark.sql.files.openCostInBytes 4194304 (4 MB) 打开文件的估算成本,按照同一时间能够扫描的字节数来测量。当往一个分区写入多个文件的时候会使用。高估更好, 这样的话小文件分区将比大文件分区更快 (先被调度)
spark.sql.autoBroadcastJoinThreshold 10485760 (10 MB) 配置一个表在执行 join 操作时能够广播给所有 worker 节点的最大字节大小。通过将这个值设置为-1,可以禁用广播
spark.sql.shuffle.partitions 200 配置为连接或聚合操作混洗(shuffle)数据时使用的分区数

Spark-SQL JavaApi案例总结

  • 兄弟萌,到目前为止,我们已经学会了用spark的spark-SQL组件处理结构化,半结构化的数据,包括调优技巧,外部JDBC的连接,数据读写等,已经可以进行基本的开发了,在开发中遇到问题可以源码阅读,或者留言我们一起交流学习!


[加油]

史上最简单的spark教程第十三章-SparkSQL编程Java案例实践(终章)相关推荐

  1. 史上最简单的spark教程第二十三章-运行第一个机器学习Java和Python代码案例

    [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 代码案例地址: ?https://github.com/Mydreamandrea ...

  2. 史上最简单的spark教程第十七章-快速开发部署第一个sparkStreaming+Java流处理程序

    第一个流处理程序sparkStreaming+Java 史上最简单的spark教程 所有代码示例地址:https://github.com/Mydreamandreality/sparkResearc ...

  3. 史上最简单的SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix Turbine)

    转:https://blog.csdn.net/forezp/article/details/70233227 上一篇文章讲述了如何利用Hystrix Dashboard去监控断路器的Hystrix ...

  4. 史上最简单的spark系列教程 | 完结

    <史上最简单的spark系列教程>系列: 与其说是教程不如说是改良后的个人学习笔记|| 教程参考自:<spark官方文档>,<spark快速分析>,<图解Sp ...

  5. 史上最简单的 SpringCloud 教程

    关注公众号"风色年代"订阅更多精彩文章,本博大部分文章为转载并已标明原文出处,如有再转敬请保留,请自觉尊重原创作者的劳动成果! https://blog.csdn.net/fore ...

  6. 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

    最新Finchley版本请访问: https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f1-eureka/ 或者 http://blog.csd ...

  7. 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心

    转自:https://blog.csdn.net/forezp/article/details/81041101 文章 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eu ...

  8. 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)

    转:https://blog.csdn.net/forezp/article/details/70037291 最新版本: 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spr ...

  9. 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)

    转:https://blog.csdn.net/forezp/article/details/69939114 最新版本: 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)( ...

最新文章

  1. Unicorn 4.6.3 发布,Rack的HTTP服务器
  2. sql server 游标的使用
  3. ios Runloop
  4. 图形图像处理_c/c++
  5. google bigtable论文原文_CTR论文笔记[1]:Wideamp;Deep
  6. 全面支持开源,微软加速 Visual Studio 和 Azure DevOps 云升级
  7. final个人阅读作业
  8. user_tab_columns是什么
  9. Android wifi carlife,carlife可以无线连接吗?carlife蓝牙连接流程
  10. lable 标签右对齐
  11. 利用百度api接口制作在线语音合成软件
  12. js数组、数组嵌套根据某个字段排序(eachart图标双击事件、vue双击)
  13. 根据网络画板(画线)分析一下思路
  14. 数字金字塔(C++)
  15. 工欲善其事必先利其器,利用搜狗输入法设置代码片段
  16. “如果没有从事研发,学习自动化的我可能在装水表”
  17. 计算机中浮点数的表示及正负数小数的反码补码
  18. C++代码重用(一)
  19. VLC学习笔记(1): 概述
  20. ISO22000 HACCP食品安全管理体系认证范围

热门文章

  1. 跟李沐学AI:实用机器学习 | 第九章
  2. 解决Laragon的nginx/apache重启后网站配置文件被修改的问题 - This file has been modified by another program - 文件auto.conf
  3. 用全开源的协同OA办公平台,可以自己搭建OA啦!
  4. mysql pt kill脚本_使用pt-kill为MySQL保驾护航
  5. mysql修改游戏元宝_页游源码【武斗乾坤】自带安装启动教程+元宝游戏数据修改教程+自由一键游戏启动服务端...
  6. WPF AirSpace 空域问题解决方案
  7. 【计算机毕业设计】251毕业论文管理系统设计与实现
  8. VGG16的猫狗识别
  9. 制作IOS企业版APP网页下载
  10. 激活office时出现空白框的解决方法