当前位置:   article > 正文

浅谈spark sql、hive on spark、spark on hive_hive on spark 和 sparksql

hive on spark 和 sparksql

Spark sql

1. spark rdd

Spark整个生态群中,底层计算引擎是基于RDD的。这个也是为什么Spark计算性能比较快的原因。

通常我们狭隘上理解的SparkRDD计算引擎,是指RDD底层生成DAG执行计划,基于DAG生成详细的excutor和更细粒度的多线程池模型来减少task启动开销。有如下特点:

  • 使用内存计算引擎,提供Cache缓存机制支持迭代计算或多次数据共享,减少数据读取的IO开销
  • DAG引擎,减少多次计算之间中间结果写到HDFS的开销
  • 使用多线程池模型来减少task启动开销,shuffle过程中避免不必要的
  • sort操作以及减少磁盘IO操作

图片来自网络,侵删
示例:

object MyScalaWordCount {

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setAppName("MyScalaWordCount").setMaster("local");

    //创建一个SparkContext对象
    val sc = new SparkContext(conf)

    //执行WordCount
    val result = sc.textFile("hdfs://bigdata02:9000/wordcount.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
    //打印在屏幕上
    result.foreach(println)
    //释放资源
    sc.stop()
}

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
2. spark sql

spark sql的目的就是为懂得dbms但是不熟悉spark的同学准备的。

spark sql的实现过程就是用spark sql解析引擎解析sql语句(中间可能会有一些优化),最终还是转换为spark rdd的方式去执行。

个人理解spark sql = spark sql解析引擎 + spark rdd计算。

示例:

// Primitive types (Int, String, etc) and Product types (case classes) encoders are
// supported by importing this when creating a Dataset.
import spark.implicits._

// A JSON dataset is pointed to by path.
// The path can be either a single text file or a directory storing text files
val path = "examples/src/main/resources/people.json"
val peopleDF = spark.read.json(path)

// The inferred schema can be visualized using the printSchema() method
peopleDF.printSchema()
// root
//  |-- age: long (nullable = true)
//  |-- name: string (nullable = true)

// Creates a temporary view using the DataFrame
peopleDF.createOrReplaceTempView("people")

// SQL statements can be run by using the sql methods provided by spark
val teenagerNamesDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")
teenagerNamesDF.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
3. 区别

个人感觉spark rdd的性能更高一些,毕竟不需要解析sql语句。

二 hive on spark

1. 含义

将hive底层的计算引擎由mr换位spark。

个人理解 hive on spark = hive sql解析引擎 + spark rdd计算。

2. 示例

在使用conn进行SQL操作之前,先执行SQL将hive.exection.engine设置为spark即可使用Hive on Spark。
图片来自网络,侵删

三 spark on hive

1. 含义

Spark通过Spark-SQL使用hive 语句,操作hive,底层运行的还是 spark rdd:

  • 就是通过sparksql,加载hive的配置文件,获取到hive的元数据信息
  • spark sql获取到hive的元数据信息之后就可以拿到hive的所有表的数据
  • 接下来就可以通过spark sql来操作hive表中的数据

个人理解,知识单纯hive当成了数据源,其他的用spark实现。

2. 示例

前置配置:

  • 将Hive的conf目录下的hive-site-xml文件拷贝到spark的conf目录下;
  • 将Hive中的mysql驱动包(mysql-connector-java-8.0.22.jar,根据自己mysql的版本进行选择)也拷贝到spark的jars目录下。

代码:

import org.apache.spark.sql.SparkSession


val warehouseLocation = "spark-warehouse"

val spark = SparkSession
  .builder()
  .appName("Spark Hive Example")
  .config("spark.sql.warehouse.dir", warehouseLocation)
  .enableHiveSupport()
  .getOrCreate()

import spark.implicits._
import spark.sql

// 到这里,你就可以随意读取Hive了
// test是hive中的表名
df = sql("select * from test") // 返回spaek的DataFrame
df.show() 

// 这里可以用sql语句,对Hive中的数据表进行任何的读写操作
sql(".....")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

四 总结

最终都转换为spark rdd进行计算。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/634605
推荐阅读
相关标签
  

闽ICP备14008679号