一 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()
}
}
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()
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(".....")
四 总结
最终都转换为spark rdd进行计算。
本文探讨了Spark的RDD计算引擎优势,介绍了Spark SQL和Hive on Spark的区别,指出Spark SQL通过解析引擎加速SQL操作。重点在于两者如何利用Spark RDD进行高效计算,并总结了它们在实际项目中的应用和性能对比。

3875

被折叠的 条评论
为什么被折叠?



