spark常见操作系列(1)--spark scala 以及hadoop不同版本的api区别

spark常见操作系列

做数据处理有一段时间了,现把工作中遇到的问题和处理思路做个整理.文章分为5块,依次是:

1. spark hadoop,hbase 版本划分, 以及spark1.5.2,scala2.10.4 与spark2.0, scala2.11版本区别
2. spark读写hadoop
3. spark读写hbase
4. spark广播变量的应用
5. spark,scala程序的调优几种思路

本人之前用spark1.5 和spark2.1 做开发,的时候,两个版本的切换, 所使用的spark api不一样,带来了一些麻烦.现把发现的spark 不同版本区别记录一下, 供大家做个参考.

Jdk版本 Spark版本 Scala版本 Hadoop版本 Hbase版本
1.7以上 Spark1.5/1.6 Scala2.10 Hadoop2.5/2.6 Hbase0.98及以上
1.7以上 Spark2.x Scala2.11 Hadoop2.7 Hbase0.98及以上

当然,hbase 连接会依赖zookeeper,在使用hadoop文件读写的时候,在消息流的处理上,我们使用的kafka的版本都要保持一致.
之前听同事说过,kafka对spark1.5 支持不是太好.

版本一致,在应用具体api的时候,
(1)遇到的不明报错会少很多;
(2)程序运行比较稳定

一般在maven里面管理依赖包的版本.实际上,具体加载依赖也要仔细,比如,hadoop使用client jar包;而hbase 在使用较新版本的api,比如rdd.saveAsNewAPIHadoopDataset() ,反而需要使用hbase server jar包.

spark1.5/1.6 与spark2.x api区别

区别还是挺大的.spark2.x 的程序初始化方式与原来不一样了;在原来基础上增加了一些新的api,新的配置,以及在jvm heap 的利用方式也有了改进. 突出的,比如,spark读取数据源,spark1.5 会使用:

/**
    * Description: 读csv转成rdd
    * Author: zhouyang
    * Date 2017/11/29 19:20
    * @param csvFileName:String
    *
    * @return RDD[String]
    */
  def getCsvDataToRdd(sparkContext: SparkContext, csvFileName:String) : (RDD[String], String) = {
    val sqlContext = new org.apache.spark.sql.SQLContext(sparkContext)
    // Create an RDD
    val csvRDD = sparkContext.textFile(csvFileName, 15)//.asInstanceOf[RDD[Double]]//.persist()
    //文件第一行
    val header = csvRDD.first()
    //去除header
    val mainDataRdd = csvRDD.filter(_ != header)
    (mainDataRdd, header)
  }

而spark2.x会是这样:

/**
   * Description 读取显示出指定列数据
   * Author: zhouyang
   * Date 2017/11/2 14:05
    * @param sparkSession:SparkSession
    * @param csvFileName:String 读取的csv文件目录
    * @param columnsNameArr:Array[String] 包含列名的数组
   */
  def readSampleCsvToSql(sparkSession:SparkSession,csvFileName:String, columnsNameArr:Array[String]) : Unit = {
    val df = sparkSession.read.format("com.databricks.spark.csv").option("header", "true").option("mode", "DROPMALFORMED").load(csvFileName).cache()
    var columnsNameStr = ""
    for(i<-0 until columnsNameArr.length){
      columnsNameStr+=columnsNameArr(i)+","
    }
    columnsNameStr = columnsNameStr.substring(0,columnsNameStr.length()-1)
    //注册临时表
    df.createOrReplaceTempView("temp_table")
    df.show
    sparkSession.stop()
  }

这里sparkSession 配置方式:

def getSparkSession():SparkSession={
      val conf = new SparkConf()
      if(testModel){
        conf.set("spark.driver.host",driverHost)
        conf.set("spark.executor.memory", executorMemory)
        //序列化方式
        conf.set("spark.driver.memory", driverMemory)
      }
      conf.set("spark.serializer",serializer)
      val sparkContext = SparkSession.builder().master(sparkMaster).config(conf).appName(this.appName ).getOrCreate()
      //引入dataFrame 使用外部数据源接口来自定义CSV输入格式
      sparkContext
    }

spark2.x 的sparkContext改动很大,而且新增的sparkSession 继承自sparkContext,但同一个main 程序里面,sparkContext 和sparkSession不能同时使用.

除此之外,一些插件,比如读取csv的com.databricks.spark.csv jar 也会有些差异.
本人推荐使用spark2.x版本.

另外,spark的配置文件也有少许改动,比如在/conf/spark-defaults.conf ,原有的几个配置项现在会不用了.具体可以参考spark2.2官网:
http://spark.apache.org/docs/latest/submitting-applications.html

在使用spark2.x时,会发现有重要的api被新的api替代,比如myAccumulator .新的myAccumulator 支持更多数据类型,应用性会更好一些.

在读写hadoop和hbase,对应的api 也会不一样.这个以后细讲.

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页