慕课网Spark SQL日志分析 - 4.从Hive平滑过渡到Spark SQL
4.1 SQLContext/HiveContext/SparkSesson
1.SQLContext
老版本文档:spark.apache.org/docs/1.6.1/
- SQLContext示例文件:
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext/**
* SQLContext使用
* 注意:IDEA是在本地,而测试数据是在服务器上 ,能不能在本地进行开发测试的?
*/
object SQLContextApp {def main(args: Array[String]): Unit = {val path = args(0)//1)创建相应的Context
val sparkConf = new SparkConf()//在测试或者生产中,AppName和Master我们是通过脚本进行指定
sparkConf.setAppName("SQLContextApp").setMaster("local[2]").set("spark.driver.bindAddress","127.0.0.1")val sc = new SparkContext(sparkConf)
val sqlContext = new SQLContext(sc)//2)相关的处理: json
val people = sqlContext.read.format("json").load(path)
people.printSchema()
people.show()//3)关闭资源
sc.stop()
}
}
复制代码
- 打包:
mvn clean package -DSkipTests
复制代码
- 提交Spark Application到环境中运行 文档: spark.apache.org/docs/1.6.1/…
./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
./bin/spark-submit \
--class com.gwf.spark.SQLContextApp
--master local[2] \
/Users/gaowenfeng/Downloads/MySparkSqlProject/target/sql-1.0.jar \
file:///Users/gaowenfeng/software/spark-2.2.0-bin-2.6.0-cdh5.7.0/examples/src/main/resources/people.json复制代码
- 脚本提交: 将上面的命令做成shell脚本,赋予执行权限即可执行
2.HiveContext使用
To use a HiveContext, you do not need to have an existing Hive setup
代码上面代码类似,只是把SQLContext改成HiveContext。不过使用时需要通过--jars 把mysql的驱动传递到classpath
3.SparkSession
def main(args: Array[String]): Unit = {
val path = args(0)val spark = SparkSession
.builder()
.appName("SQLContextApp")
.config("spark.driver.bindAddress","127.0.0.1")
.master("local[2]")
.getOrCreate()val people = spark.read.format("json").load(path)
people.printSchema()
people.show()
spark.stop()
}
复制代码
4.2 spark-shell/spark-sql的使用
- 在conf目录添加hive-site.xml
- --jars 传递mysql驱动包
# shell
spark-shell --master local[2] --jars /Users/gaowenfeng/.m2/repository/mysql/mysql-connector-java/5.1.45/mysql-connector-java-5.1.45.jar
# spark.sql('sql语句').show
# mysql
spark-sql --master local[2] --jars /Users/gaowenfeng/.m2/repository/mysql/mysql-connector-java/5.1.45/mysql-connector-java-5.1.45.jar
# 可以直接执行SQL
复制代码
分析执行计划理解sparksql的架构
create table t(key string,value string);
explain extended select a.key * (2+3),b.value from t a join t b on a.key = b.key and a.key > 3;# 解析成一个逻辑执行计划
== Parsed Logical Plan ==
# unresolvedalias:并没有解析全
'Project [unresolvedalias(('a.key * (2 + 3)), None), 'b.value] # select 的两个字段
+- 'Join Inner, (('a.key = 'b.key) && ('a.key > 3)) # or后面的条件
:- 'SubqueryAlias a
: +- 'UnresolvedRelation `t`
+- 'SubqueryAlias b
+- 'UnresolvedRelation `t`# 解析操作(需要与底层的metastore打交道)
== Analyzed Logical Plan ==
(CAST(key AS DOUBLE) * CAST((2 + 3) AS DOUBLE)): double, value: string # 将a.key , (2+3) 分别转换成double类型
Project [(cast(key#8 as double) * cast((2 + 3) as double)) AS (CAST(key AS DOUBLE) * CAST((2 + 3) AS DOUBLE))#12, value#11] # select 的两个字段
+- Join Inner, ((key#8 = key#10) && (cast(key#8 as int) > 3))
:- SubqueryAlias a
: +- SubqueryAlias t # 已经解析出了使元数据中的哪张表
: +- CatalogRelation `default`.`t`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, [key#8, value#9]
+- SubqueryAlias b
+- SubqueryAlias t
+- CatalogRelation `default`.`t`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, [key#10, value#11]# 优化操作
== Optimized Logical Plan ==
Project [(cast(key#8 as double) * 5.0) AS (CAST(key AS DOUBLE) * CAST((2 + 3) AS DOUBLE))#12, value#11]
+- Join Inner, (key#8 = key#10)
:- Project [key#8]
: +- Filter (isnotnull(key#8) && (cast(key#8 as int) > 3)) # 把a.key>3 提到前面来,先过滤,
: +- CatalogRelation `default`.`t`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, [key#8, value#9]
+- Filter (isnotnull(key#10) && (cast(key#10 as int) > 3))
+- CatalogRelation `default`.`t`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, [key#10, value#11]# 物理执行计划
== Physical Plan ==
*Project [(cast(key#8 as double) * 5.0) AS (CAST(key AS DOUBLE) * CAST((2 + 3) AS DOUBLE))#12, value#11]
+- *SortMergeJoin [key#8], [key#10], Inner
:- *Sort [key#8 ASC NULLS FIRST], false, 0
: +- Exchange hashpartitioning(key#8, 200)
: +- *Filter (isnotnull(key#8) && (cast(key#8 as int) > 3))
: +- HiveTableScan [key#8], CatalogRelation `default`.`t`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, [key#8, value#9]
+- *Sort [key#10 ASC NULLS FIRST], false, 0
+- Exchange hashpartitioning(key#10, 200)
+- *Filter (isnotnull(key#10) && (cast(key#10 as int) > 3))
+- HiveTableScan [key#10, value#11], CatalogRelation `default`.`t`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, [key#10, value#11]
复制代码
4.3 thriftserver/beeline的使用
- 启动thriftserver,默认端口是10000
./sbin/start-thriftserver.sh \
# 修改端口
--hiveconf hive.server2.thrift.port=<listening-port> \
# 修改host
--hiveconf hive.server2.thrift.bind.host=<listening-host> \
--master <master-uri>
复制代码
- 启动beeline beeline -u jdbc:hive2://localhost:10000 -n gaowenfeng
- http://localhost:4040/sqlserver/ 这个界面可以查看具体执行过的sql语句,可以查看执行计划
- http://localhost:4040/SQL/execution/ 可以查看sql执行的详细信息
3.thriftserver 和 spark-shell/spark-sql 的区别:
- spark-shell,spark-sql都是一个spark application
- thriftserver不管你启动了多少个客户端(beeline/code),永远都是一个spark application,解决了一个数据共享的问题,多个客户端可以共享数据
4.4 jdbc方式编程访问
1.添加maven依赖
<dependency>
<groupId>org.spark-project.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1.spark2</version>
</dependency>
复制代码
2.开发代码访问thriftserver
注意事项:在使用jdbc开发时,一定要先启动thriftserver
def main(args: Array[String]): Unit = {
Class.forName("org.apache.hive.jdbc.HiveDriver")
try{}
val conn = DriverManager.getConnection("jdbc:hive2://localhost:10000","gaowenfeng","")
val pstmt = conn.prepareStatement("select * from emp")
val rs = pstmt.executeQuery()while (rs.next()){
print(rs.getInt("id")+"\t"+rs.getString("name"))
}rs.close()
pstmt.close()
conn.close()
}
复制代码
慕课网Spark SQL日志分析 - 4.从Hive平滑过渡到Spark SQL相关推荐
- 达梦数据库SQL日志分析工具Dmlog的使用
1.使用条件 运行环境预先安装Java环境:支持liunx和windows系统运行. 说明:推荐使用java1.8版本,linux最小化安装最少要安装打印服务组件,windows下不支持java1.6 ...
- mysql分析日志_MYSQL 索引(三)--- SQL日志分析
慢查询日志 Mysql 的慢查询日志是 Myql 提供的一种日志记录,用来记录在 Myql 中响应时间查过阈值的语句,具体指运行时间超过 long_query_time 值的 SQL,则会被记录在日志 ...
- spark SQL快速入门 1-9 慕课网
1.hadoop安装 1.修改hadoop配置文件hadoop-env.shexport JAVA_HOME=/home/hadoop/app/jdk1.8.0_91core-site.xml< ...
- MySQL慢查询日志分析(二)
1: 为什么在慢查询日志里面出现Query_time小于long_query_time阀值的SQL语句呢? 例如,long_query_time=5, 但是Query_time小于1秒的SQL都记录到 ...
- 优化器-SQL语句分析与优化
一.连接-配置优化 1.1 连接数过多问题 有时会碰到Mysql:error 1040:Too many connection的错误.原因:超过了服务端设置的最大并发连接数. 1.2 从两个方面解决问 ...
- MySQ5.7数据库-基准测试SQL语句分析
文章目录 MySQL基准测试 什么是基准测试 基准测试特点 压力测试特点 基准测试的目的 如何进行基准测试 对整个系统进行基准测试 MySQL基准测试的常见指标 MySQL基准测试之mysqlslap ...
- spark 源码分析 Blockmanager
原文链接 参考, Spark源码分析之-Storage模块 对于storage, 为何Spark需要storage模块?为了cache RDD Spark的特点就是可以将RDD cache在memo ...
- dm归档文件配置、sql 日志的开启和关闭以 及基本的操作、创建定时备份和删除备份的作业、数据库物理、逻辑备份还原
1.达梦数据库中归档文件配置. 生产环境必须开启归档日志,且必须限制归档日志保留量,限制方法: 设置归档空间大小限制即指定 SPACE_LIMIT 参数(单位是 MB). 定期删除归档日志(设置定时作 ...
- java sql 美化插件_Mybatis插件-sql日志美化输出
同步自本人博客 mybatis有基本的sql日志,但是看起来很不舒服,sql一行参数在另一行,查询多的时候sql行和参数行分开很远.下面就是相同颜色的是一组: 看了大哥的文章决定试试弄个美化日志的my ...
最新文章
- 真的有能开光追的手游了!自带实机演示的那种,OPPO这次玩“大”了
- CSVHelper在Asp.Net MVC中的使用
- BJUI修改详情页的标题内容
- 北斗导航 | 北斗伪距定位、测速与授时——PNT:最小二乘法、加权最小二乘:伪距单点定位
- 基于分代的垃圾回收算法
- jquery中获取下拉框的文本值
- python如何避免访问对象不存在的属性_Python3基础 setattr 设置对象的属性值,如果属性不存在就创建一个...
- 通讯协议集合- - -类比道路交通- - -一般肯定有数据电信号线和收发控制电信号线
- 魔兽世界怀旧服服务器显示配置,魔兽世界怀旧服配置要求很高吗 魔兽世界怀旧服电脑最低配置要求...
- oracle静默安装报错,静默安装oracle时报错
- DDS每个数据包和域ID大小的数据开销
- Unison 的相关参数介绍
- Classic Shell给你的Win8/7装上更好用的开始菜单
- Python+VSCode+Git【转】
- 书写历史的甲骨文--ORACLE公司传奇
- Java Web高级面试题(二)
- 【2021】网络协议从入门到底层原理-MJ【新】附上下载链接
- HTML中上传与读取图片或文件(input file)----在路上(25)
- 苹果发布 iOS14 系统 Beta7,升级了这些内容
- 笔记:js:onfocus和onblur事件
热门文章
- vue调用接口获取后台数据_Vuex 存储||获取后台接口数据
- extmail mysql数据库 重启_centos 5.8 x86_64下安装mysql+postfix+extmail+extman+courier-authlib+courier-imap...
- android 怎么初始化下拉框_第30讲:“二师兄”的成长历程之二,类属性的初始化...
- 西工大c语言noj100作业,西工大17秋《C语言程序设计》平时作业
- linux网络寻址顺序,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- python3多进程 pool manager_Python多进程multiprocessing.Pool
- java网关限流_网关限流使用
- 分布式是什么,集群又是什么呢
- json.dumps直接保存中文而非字符集的方法
- MSE与MAE的区别与如何选择