Spark SQL快速离线数据分析

 


1.Spark SQL概述

1)Spark SQL是Spark核心功能的一部分,是在2014年4月份Spark1.0版本时发布的。

http://ke.dajiangtai.com/content/6918/1.png

2)Spark SQL可以直接运行SQL或者HiveQL语句

http://ke.dajiangtai.com/content/6918/2.png

3)BI工具通过JDBC连接SparkSQL查询数据

http://ke.dajiangtai.com/content/6918/3.png

4)Spark SQL支持Python、Scala、Java和R语言

http://ke.dajiangtai.com/content/6918/4.png

5)Spark SQL不仅仅是SQL

http://ke.dajiangtai.com/content/6918/5.png

6)Spark SQL远远比SQL要强大

http://ke.dajiangtai.com/content/6918/6.png

7)Spark SQL处理数据架构

http://ke.dajiangtai.com/content/6918/7.png

8)Spark SQL简介

Spark SQL is a Spark module for structured data processing

http://ke.dajiangtai.com/content/6918/8.png

9)Spark SQL的愿景

a)Write less code

对不同的数据类型使用统一的接口来读写。

http://ke.dajiangtai.com/content/6918/9.png

b)Read less data

提升大数据处理速度最有效的方法就是忽略无关的数据。

(1)使用列式存储(columnar formats),比如Parquet、ORC、RCFile

(2)使用分区裁剪(partitioningpruning),比如按天分区,按小时分区等

(3)利用数据文件中附带的统计信息进行剪枝:例如每段数据都带有最大值、最小值和NULL值等统计信息,当某一数据段肯定不包含查询条件的目标数据时,可以直接跳过这段数据。(例如字段age某段最大值为20,但查询条件是>50岁的人时,显然可以直接跳过这段)

(4)将查询源中的各种信息下推至数据源处,从而充分利用数据源自身的优化能力来完成剪枝、过滤条件下推等优化。

c)Let the optimizer do the hard work

Catalyst优化器对SQL语句进行优化,从而得到更有效的执行方案。即使我们在写SQL的时候没有考虑这些优化的细节,Catalyst也可以帮我们做到不错的优化结果。

http://ke.dajiangtai.com/content/6918/10.png

2.Spark SQL服务架构

http://ke.dajiangtai.com/content/6918/11.png

3.Spark SQL 与Hive集成(spark-shell)

1)需要配置的项目

a)将hive的配置文件hive-site.xml拷贝到spark conf目录,同时添加metastore的url配置(对应hive安装节点,我的为3节点)。

vi hive-site.xml

<property>

        <name>hive.metastore.uris</name>

        <value>thrift://bigdata-pro03.kfk.com:9083</value>

</property>

修改完后再发送给其他节点

scp hive-site.xml bigdata-pro01.kfk.com:/opt/modules/spark-2.2.0-bin/conf/

scp hive-site.xml bigdata-pro02.kfk.com:/opt/modules/spark-2.2.0-bin/conf/

b)拷贝hive中的mysql jar包到spark的jar目录下,再发送给其他节点

cp hive-0.13.1-bin/lib/mysql-connector-java-5.1.27-bin.jar spark-2.2-bin/jars/

scp mysql-connector-java-5.1.27.jar bigdata-pro01.kfk.com:/opt/modules/spark-2.2.0-bin/jars/

scp mysql-connector-java-5.1.27.jar bigdata-pro02.kfk.com:/opt/modules/spark-2.2.0-bin/jars/

c)检查spark-env.sh 文件中的配置项,没有添加,有则跳过

vi spark-env.sh

HADOOP_CONF_DIR=/opt/modules/hadoop-2.6.0/etc/hadoop

2)启动服务

a)检查mysql是否启动

#查看状态

service mysqld status

#启动

service mysqld start

b)启动hive metastore服务

bin/hive --service metastore

c)启动hive

bin/hive

show databases;

create database kfk;

use kfk;

create table if not exists test(userid string,username string)ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS textfile;

load data local inpath "/opt/datas/kfk.txt" into table test;

本地kfk.txt文件

more /opt/datas/kfk.txt

0001 spark

0002 hive

0003 hbase

0004 hadoop

d)启动spark-shell

bin/spark-shell

spark.sql("select * from kfk.test").show

+------+--------+

|userid|username|

+------+--------+

|  0001|   spark|

|  0002|    hive|

|  0003|   hbase|

|  0004|  hadoop|

+------+--------+

4.Spark SQL 与Hive集成(spark-sql)

启动spark-sql

bin/spark-sql

#查看数据库

show databases;

default

kfk

#使用数据库

use kfk

#查看表

show tables;

test

#查看表数据

select * from test;

5.Spark SQL之ThriftServer和beeline使用

通过使用beeline可以实现启动一个应用给多个用户同时操作,而不必要启动多个应用,这样更加节省资源。

1)启动ThriftServer

sbin/start-thriftserver.sh

2)启动beeline

[kfk@bigdata-pro02 spark-2.2.0-bin]$ bin/beeline

Beeline version 1.2.1.spark2 by Apache Hive

beeline> !connect jdbc:hive2://bigdata-pro02.kfk.com:10000

Connecting to jdbc:hive2://bigdata-pro02.kfk.com:10000

Enter username for jdbc:hive2://bigdata-pro02.kfk.com:10000: kfk

Enter password for jdbc:hive2://bigdata-pro02.kfk.com:10000: ***

19/04/18 17:56:52 INFO Utils: Supplied authorities: bigdata-pro02.kfk.com:10000

19/04/18 17:56:52 INFO Utils: Resolved authority: bigdata-pro02.kfk.com:10000

19/04/18 17:56:52 INFO HiveConnection: Will try to open client transport with JDBC Uri: jdbc:hive2://bigdata-pro02.kfk.com:10000

Connected to: Spark SQL (version 2.2.0)

Driver: Hive JDBC (version 1.2.1.spark2)

Transaction isolation: TRANSACTION_REPEATABLE_READ

0: jdbc:hive2://bigdata-pro02.kfk.com:10000> 

#查看数据库

show databases;

+----------------+--+

| database_name  |

+----------------+--+

| default        |

| kfk            |

+----------------+--+

2 rows selected (0.977 seconds)

#查看表数据

select * from kfk.test;

+--------------+----------------+--+

| test.userid  | test.username  |

+--------------+----------------+--+

| 0001         | spark          |

| 0002         | hive           |

| 0003         | hbase          |

| 0004         | hadoop         |

+--------------+----------------+--+

4 rows selected (1.063 seconds)

6.Spark SQL与MySQL集成

启动spark-shell

sbin/spark-shell

:paste

val jdbcDF = spark

  .read

  .format("jdbc")

  .option("url", "jdbc:mysql://bigdata-pro01.kfk.com:3306/test")

  .option("dbtable", "spark1")

  .option("user", "root")

  .option("password", "root")

  .load()

ctr+d

#打印读取数据

jdbcDF.show

+------+--------+

|userid|username|

+------+--------+

|  0001|   spark|

|  0002|    hive|

|  0003|   hbase|

|  0004|  hadoop|

+------+--------+

7.Spark SQL与HBase集成

Spark SQL与HBase集成,其核心就是Spark Sql通过hive外部表来获取HBase的表数据。

1)拷贝HBase的包和hive包到spark 的jars目录下

http://ke.dajiangtai.com/content/6918/12.png

2)启动Hbase

bin/start-hbase.sh

3)启动Hive

bin/hive

4)启动spark-shell

bin/spark-shell


val df =spark.sql("select * from weblogs limit 10").show

这一步如果报NoClassDefFoundError错误请参考博文: Spark-HBase集成错误之 java.lang.NoClassDefFoundError: org/htrace/Trace 

到这,Spark与HBase的集成就算成功了!

猜你喜欢

转载自blog.csdn.net/py_123456/article/details/89641651