sparkSQL,hive on spark ,thriftserver

SparkSQL特性

1.可以在程序里使用SQL
2.DataFrames和SQL可以以相同方式连接外部数据源
3.HIVE的支持性,通过Spark查询HIVE已有的东西
4.它能够使用JDBC或者ODBC的方式来连接到你外部的其他的BI的工具上面

SparkSQL不止是写sql还有:sql,datasets,dataframes

Hive on Spark

Hive运行在MapReduce/Tez/Spark之上。之前hadoop的hive运行的时候,底层跑的是MapReduce。

Spark需要hadoop吗?
不需要,hadoop的hdfs和yarn,spark可以不跑在yarn上,也不一定要把数据写到hdfs上。

Spark需要Hive吗?
不需要,只要有metastore服务就行,能存元数据。metastore可以在其他节点起,然后spark只要在hive-site.xml里配置metastore的地址(thrift://…),这样就能做统一的元数据管理。

shark
写sql,基于hive解析,转换为rdd

Spark各版本特性

待更新
Spark1.6

Spark2.0
SQL 2003的支持,结构化流,UDF的支持

一个好的学习网站

https://databricks.com/blog

SparkSQL配置支持Hive

概念

Spark SQL支持在HIVE上读写数据。然而由于HIVE需要很多依赖,而这些依赖在spark默认里没装。如果HIVE的依赖没找到,Spark会自动加载(hadoop/etc/hadoop/)。HIVE的dependency需要在所有的工作节点上都要有。
最后还要把hive-site.xml(必要)和core-site.xml(为了安全配置),hdfs-site.xml(为了hdfs配置)拷贝到spark的conf/下。
用户没必要安装HIVE也能有hive的支持,如果没找到hive-site.xml,context会自动创建metastore_db在当前目录下

试验

没配置hdfs-site.xml到spark/conf下,在spark/bin里启动spark-sql ./spark-sql。然后发现在spark/bin下面有metastore_db文件夹。退出再启动spark-sql,报错
在这里插入图片描述

原因是默认情况下是derby存元数据,但是它是单session,也就是一个用户连,把原先的删了即可。

可以设置spark.sql.warehouse.dir来指定spark在warehouse的位置,需要给启动spark程序的用户赋予写权限。

配置

拷贝hive-site.xml到spark/conf

[hadoop@hadoop000 conf]$ cp /home/hadoop/app/hive-1.1.0-cdh5.7.0/conf/hive-site.xml .

启动spark-sql报错
在这【里插入图片描述

需要mysql的驱动,为了以后更新驱动方便,在一个地方建一个专门存放此驱动的文件夹

[hadoop@hadoop000 lib]$ cp /home/hadoop/software/mysql-connector-java-5.1.27.jar .
[hadoop@hadoop000 lib]$ ls
mysql-connector-java-5.1.27.jar
[hadoop@hadoop000 lib]$ pwd
/home/hadoop/lib

在spark-defaults.conf里加这段代码,指定驱动路径

spark.executor.extraClasspath /home/hadoop/lib/mysql-connector-java-5.1.27.jar
spark.driver.extraClasspath /home/hadoop/lib/mysql-connector-java-5.1.27.jar

启动

如果不配置spark-defaults.conf可以在启动的时候指定驱动

[hadoop@hadoop000 bin]$ ./spark-sql --driver-class-path /home/hadoop/lib/mysql-connector-java-5.1.27.jar
[hadoop@hadoop000 bin]$ ./spark-shell --jars /home/hadoop/lib/mysql-connector-java-5.1.27.jar
spark.sql(" ").show()

sparkSQL cache

sparkSQL cache 会立即执行

cache table xxx

不管cache不cache,都不会shuffle

thriftserver

在sbin目录下,和hiveserver2类似

ThriftServer是一个JDBC/ODBC接口,用户可以通过JDBC/ODBC连接ThriftServer来访问SparkSQL的数据。ThriftServer在启动的时候,会启动了一个sparkSQL的应用程序,而通过JDBC/ODBC连接进来的客户端共同分享这个sparkSQL应用程序的资源,也就是说不同的用户之间可以共享数据;ThriftServer启动时还开启一个侦听器,等待JDBC客户端的连接和提交查询。所以,在配置ThriftServer的时候,至少要配置ThriftServer的主机名和端口,如果要使用hive数据的话,还要提供hive metastore的uris。

起动他后,然后 ./beeline -u jdbc:hive2://localhost:10000 -n hadoop
注意这个指令和hive的是一样的,如果是在环境变量里配了beeline,要注意别起的是hiveserver2

thriftserver vs spark application

长服务 例行
前者只需要启动时申请资源,后者每次启动spark都要申请资源
后者做不到多个客户端共享资源

Datasets和DataFrames

当在其他编程语言里跑SparkSQL的时候,结果会以dataset和dataframe返回
Dataset是分布式集合数据,在spark1.6增加的,提供了比rdd更好的东西(强类型,lambda)
python用不了

DataFrames,被组织成带名字的列,带有schema信息
在scala里,DataFrames可以简化为Dataset[Row]

配置在IDEA

添加依赖

<dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.11</artifactId>
      <version>${spark.version}</version>
    </dependency>

简单程序

import org.apache.spark.sql.SparkSession

object SparkSessionApp {
  def main(args: Array[String]): Unit = {
    //SparkSession也是调用sparkcontext
    val session = SparkSession.builder().appName("SparkSessionApp")
      .master("local[2]")
      .getOrCreate()

    session.sparkContext.parallelize(Array(1,2,3)).foreach(println)

    session.stop()
  }
}

猜你喜欢

转载自blog.csdn.net/qq_36459386/article/details/85242541