文章目录

  • FusionInsight平台——Spark连接MPPDB(LibrA、GuassDB)
    • 前言
    • 遇到的问题
    • 问题分析
    • 问题解决
    • Spark从数据库"读/写"的代码示例

FusionInsight平台——Spark连接MPPDB(LibrA、GuassDB)

前言

  • 目前国内大数据行业盛行,华为推出了自己的大数据发行版FusionInsight,属于国内领先的发行版。FusionInsight产品其中就包括了Hadoop、Hive、Spark、HBase、MPPDB等组件。对于多数大数据从业人员来说,对大数据主流产品都有一定了解,但这款MPPDB相对来说较为陌生,笔者也在这上面遇到了坑,特此分享。

  • MPPDB:简单来说,它一款分布式的关系型数据库,基于Postgres-XL框架,支持JDBC、ODBC

  • MPPDB已更名为LibrA(GuassDB)


遇到的问题

  • 在FusionInsight平台,Spark使用JDBC连接MPPDB失败
  • 报错内容大致为“Invalid username/password;logon denied”
  • 注意:在C80(不包含)以后的新版本已无该问题(但是不同的部署版本,还会存在jdbc驱动包的选择的问题,有问题请私信)

问题分析

  1. 起初一看,还以为是"用户名/密码"错了。笔者在同一环境下使用该"用户名/密码"尝试直接登录数据库、尝试使用纯Java(或Scala)方式用JDBC连接数据库、尝试使用第三方软件工具登录数据库,均无任何问题,都可以正常使用。看来问题出在了Spark上。
  2. 经询问华为相关工程师得知,FusionInsight平台还有一个DBService组件。而该组件要用到的JDBC包的Driver的包名(org.posetgresql.Driver)和MPPDB的JDBC包一致,但实际两个JDBC包是有区别的。
  3. 同时,为了便于访问DBService组件,Spark的lib下也提供了该JDBC的jar包,导致jar包冲突。故可知,用户在使用spark-submit提交任务时添加的jar包与Spark lib下的jar包发生了冲突,而Spark优先使用了lib下的JDBC包。

问题解决

  • 较差方案:删除集群中所有Spark节点下lib路径中的DBService的JDBC包,再由用户提交任务时指定需要用到的jar包。(该方案能够解决问题,但是会导致其他不知情的用户访问DBservice组件时出现问题,同时节点太多删除也很麻烦)

  • 良好方案:修改客户端spark/conf/spark-default.conf文件,或者在代码中的conf指定

    1. 修改spark.executor.userClassPathFirst = true
    2. 修改spark.driver.userClassPathFirst = true
    3. 最后在提交应用时指定jar包。(示例: spark-submit --jars gsjdbc.jar,jars前面是两个减号)
    4. 这样即可让jar包冲突时,优先使用用户提交的jar包
  • 未知方案:修改配置的lib加载的路径即可(让该路径不包括冲突的包)。例如YARN模式下,修改spark.yarn.lib指定的路径。

  • 相关源码(下面对应的是Driver的,Executor同理)

    // SparkSubmit中的方法
    private def runMain(args: SparkSubmitArguments, uninitLog: Boolean): Unit = {// 省略部分代码// 决定使用的ClassLoader,由参数spark.driver.userClassPathFirst决定,默认为falseval loader =if (sparkConf.get(DRIVER_USER_CLASS_PATH_FIRST)) {// 该ClassLoader会优先使用用户提供的jar包new ChildFirstURLClassLoader(new Array[URL](0),Thread.currentThread.getContextClassLoader)} else {// 默认的ClassLoadernew MutableURLClassLoader(new Array[URL](0),Thread.currentThread.getContextClassLoader)}Thread.currentThread.setContextClassLoader(loader)for (jar <- childClasspath) {addJarToClasspath(jar, loader)}// 省略部分代码}
    

Spark从数据库"读/写"的代码示例

注1:如果数据量很大, 速度较慢,推荐使用MPPDB的导入工具
注2:部分版本需要选择合适的jdbc驱动包(华为提供了2个jdbc驱动包,Driver全路径、填写的url都不同,有问题请私信)

  • Spark从MPPDB读取数据(其他关系型数据库类似)
import java.util.Propertiesimport org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}/*** Spark从关系型数据库读取数据** @author ALion* @version 2018/1/7 18:06*/
object ReadDemo {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("ReadDemo")val sc = new SparkContext(conf)val sqlContext = new HiveContext(sc) // 或者SQLContext// 写好JDBC连接相关信息val url = "jdbc:postgresql://192.168.1.100/testDB"val table = "tb_test"val props = new Properties()props.setProperty("user", "jerry")props.setProperty("password", "123456")props.setProperty("driver", "org.postgresql.Driver")// 开始读取数据,并显示sqlContext.read.jdbc(url, table, props).show()sc.stop()}}
  • Spark向MPPDB库写入数据(其他关系型数据库类似)
import java.util.Propertiesimport org.apache.spark.sql.SaveMode
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}/*** Spark向关系型数据库写入数据** @author ALion* @version 2018/1/7 18:23*/
object WriteDemo {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("WriteDemo ")val sc = new SparkContext(conf)val sqlContext = new HiveContext(sc) // 或者SQLContext// 首先,需要拿到一个DataFrame(可以自己创建、可以从其他RDD转换而来、可以从Hive库或关系型数据库中读取等)// 在这里,自己创建了一个RDD,并转换为DataFrameval personList = List(("xiaoming", 18, "shanghai"),("laowang", 30, "beijing"),("lilei", 22, "chongqing"))val personRDD = sc.parallelize(personList)case class Person(name: String, age: Int, addr: String) // 也可以写schema: StructTypeval personDF = sqlContext.createDataFrame(personRDD, Person.getClass)// 然后,写好JDBC连接相关信息val url = "jdbc:postgresql://192.168.1.100/testDB"val table = "tb_person"val props = new Properties()props.setProperty("user", "jerry")props.setProperty("password", "123456")props.setProperty("driver", "org.postgresql.Driver")// 最后,开始写入数据personDF.write.mode(SaveMode.Append).jdbc(url, table, props)sc.stop()}}

FusionInsight平台——Spark连接MPPDB(LibrA、GuassDB)相关推荐

  1. MPP架构数据库优化总结——华为LibrA(MPPDB、GuassDB)

    文章目录 MPP架构数据库优化总结--华为LibrA(MPPDB.GuassDB) 1. 简介 2. 优化点 2.1 建表时选择合适的数据类型 2.2 选择合理的存储模型(行存和列存) 2.3 选择表 ...

  2. 记录一次spark连接mysql遇到的问题

    在使用spark连接mysql的过程中报错了,错误如下 08:51:32.495 [main] ERROR - Error loading factory org.apache.calcite.jdb ...

  3. 本地Spark连接远程集群Hive(Scala/Python)

    精选30+云产品,助力企业轻松上云!>>> 点击蓝色"大数据每日哔哔"关注我 加个"星标",第一时间获取大数据架构,实战经验 摘要:本地Spa ...

  4. spark代码连接hive_spark SQL学习(spark连接hive)

    spark 读取hive中的数据 scala> import org.apache.spark.sql.hive.HiveContext import org.apache.spark.sql. ...

  5. 【全网详解】从0到1搭建双十一实时交易数据展示平台——Spark+Kafka构建实时分析系统

    目录 万事具备之巧借东风 预备知识 环境搭建 Spark安装 Kafka安装 Kafka核心知识介绍 Kafka开启及测试服务 Python依赖库 PyCharm安装 搭建总结 八仙过海之各显神通 数 ...

  6. Spark 连接hive local

    采用读取recources文件夹下的配制文件方式hive-site.xml 一.通过hiveserver2 服务连接 $HIVE_HOME/bin/hiveserver2 object NewSpar ...

  7. NT平台拨号连接密码恢复原理

    文摘出处: http://www.xfocus.net/articles/200411/749.html Author : eyas Email  : eyas at xfous.org Date   ...

  8. 云计算与大数据第16章 分布式内存计算平台Spark习题

    第16章 分布式内存计算平台Spark习题 16.1 选择题 1.Spark是Hadoop生态(  B  )组件的替代方案. A. Hadoop     B. MapReduce        C. ...

  9. Spark连接redis问题 Caused by: java.io.NotSerializableException

    **spark连接Redis的时候报错: ** Caused by: java.io.NotSerializableException: io.jimdb.JimdbNewCluster$$Enhan ...

最新文章

  1. 一文读懂Python版的十大经典排序算法(附动图演示)
  2. catia直线测距怎么调出来_为户外远程测距而生
  3. 大数据产业正处在蓬勃发展的孕育期与机遇期
  4. zoj 3329 概率dp
  5. 事件委托能够优化js性能
  6. C#使用Json.NET解析Json
  7. 被文献坑是一种什么样的体验?
  8. 终于有人把AI、BI、大数据、数据科学讲明白了
  9. 用DeflateStream和GZipStream压缩数据
  10. 学者CIO邓遵红:让人文梦想照进职业现实
  11. mysql 局域网_MySQL 局域网授权问题
  12. 《OSPF和IS-IS详解》一2.4 理解内部BGP
  13. Android 5.1-7.1 高通驱动修改 - 上篇
  14. 一些高薪职位的能力需求。
  15. c# asp.net web程序获取当前文件路径
  16. 宝藏级别的负数取模,让你关于负数取模不在陌生 >o< 进来看看吧
  17. cbrt c语音,多态性(C语言)
  18. 巧用模板和友联类型为vc++单元测试加一利器
  19. WPM2015 P沟道增强型MOS场效应晶体管WILLSEM
  20. 人像摄影长焦镜头拍摄攻略

热门文章

  1. zy是什么意思网络_der什么意思,你是个derder啥意思,网络语der是什么意思一起来看看...
  2. VMware此平台不支持虚拟化的 AMD-V/RVI解决方法
  3. 智慧油田远程监控系统方案
  4. 茴香豆的茴有多种写法 (之 线程池)
  5. SDP 情绪算法丨场景品牌的角逐,上瘾算法的较量
  6. 怎么把游戏藏到计算机里,怎么藏游戏不要在桌面,华为怎么藏游戏不要在桌面...
  7. 谌椿抵喜票狼疗阎兄凑咦,王超?是你?你来这里干什么,找人么?”王超一边
  8. 致远推出全分销A6+,走协同OA差异化竞争路
  9. 【关于时间序列的ML】项目 5 :用机器学习预测天气
  10. Java多线程同步和通信