【Spark九十四】spark-sql工具的使用

Spark SQL与Hive整合使用教程
本文详细介绍了如何在Spark环境下使用Spark SQL与Hive进行整合,包括配置步骤、数据库展示、表显示、查询操作及创建加载数据表等核心功能,展示了Spark SQL等同于Hive操作的能力。

spark-sql是Spark bin目录下的一个可执行脚本,它的目的是通过这个脚本执行Hive的命令,即原来通过

hive>输入的指令可以通过spark-sql>输入的指令来完成。

spark-sql可以使用内置的Hive metadata-store,也可以使用已经独立安装的Hive的metadata store

 

关于Hive build into Spark

1.

Spark SQL can be built with or without Apache Hive, the Hadoop SQL engine. Spark
SQL with Hive support allows us to access Hive tables, UDFs (user-defined functions),
SerDes (serialization and deserialization formats), and the Hive query language
(HiveQL). Hive query language (HQL) It is important to note that including
the Hive libraries does not require an existing Hive installation.

 2.关于Hive和Spark SQL的关系,参见:http://bit1129.iteye.com/blog/2192739

 

3.

Note that if you don’t have an existing Hive installation, Spark SQL will create its
own Hive metastore (metadata DB) in your program’s work directory, called meta
store_db. 
In addition, if you attempt to create tables using HiveQL’s CREATE TABLE
statement (not CREATE EXTERNAL TABLE), they will be placed in the /user/hive/warehouse
directory on your default filesystem (either your local filesystem, or HDFS if
you have a hdfs-site.xml on your classpath).

 

 

 

配置步骤:

 

1. 将Hive的conf目录的hive-site.xml拷贝到Spark的conf目录

2. 将hive-site.xml中关于时间的配置的时间单位,比如ms,s全部删除掉

3. 将mysql jdbc的驱动添加到Spark的Classpath上

export SPARK_CLASSPATH=$SPARK_CLASSPATH:/home/hadoop/software/spark-1.2.0-bin-hadoop2.4/lib/mysql-connector-java-5.1.34.jar

4.启动Spark SQL

[hadoop@hadoop bin]$ ./spark-sql
Spark assembly has been built with Hive, including Datanucleus jars on classpath
SET spark.sql.hive.version=0.13.1

 

5. 显示所有的数据库

 

spark-sql> show databases;
OK
default
financials
financials2
sales
Time taken: 18.67 seconds

 

6. 显示表

 

spark-sql> use default;
OK
Time taken: 0.657 seconds
spark-sql> show tables;
OK
abc
avro_table
employees
invites
my_word
mytable1
parquet_table
table1
word
word3
word4
word5
Time taken: 1.011 seconds

 

7. 查询

spark-sql> select * from word
         > ;
1	MSN  
10	QQ  
100	Gtalk  
1000	Skype 
NULL	NULL
Time taken: 39.852 seconds

 

8.创建表并加载数据

spark-sql> create table word6 (id int,word string) row format delimited fields terminated by ',' stored as textfile ; 
OK
Time taken: 10.852 seconds

 

spark-sql> load data local inpath '/home/hadoop/word.txt' into table word6;
Copying data from file:/home/hadoop/word.txt
Copying file: file:/home/hadoop/word.txt
Loading data to table default.word6
Table default.word6 stats: [numFiles=1, numRows=0, totalSize=31, rawDataSize=0]
OK
Time taken: 2.307 seconds

 

通过如上操作可以看到,实际上spark-sql操作等同于Hive操作,也就是spark-sql是提供了等价于Hive的能力

 

 

 

 

 

<think> 我们之前讨论了Spark提交作业的不同方式(spark-submit的各种模式),现在用户询问spark shell、spark-submit、spark-sql在提交作业方面的特点和区别。 根据用户提供的引用和之前的问题,我们需要总结这三个工具Spark作业提交中的角色和区别。 1. spark-submit: - 引用[2]提到:spark-submit用来提交打成jar包的任务。它是一个提交Spark应用程序(通常是打包好的JAR包)到集群的命令行工具- 支持多种集群模式(Standalone, YARN, Mesos, Kubernetes)和部署模式(client/cluster)。 - 示例命令:提交一个计算Pi的Spark作业到YARN集群(cluster模式)[^2]。 2. spark-shell: - 引用[2]提到:spark-shell是一个简单的用来测试的交互式窗口。它是一个基于Scala的REPL(交互式解释环境),主要用于交互式数据处理和调试。 - 特点: - 自动初始化SparkContext(通常变量名为sc)和SparkSession(变量名为spark)。 - 适合小规模数据探索和快速原型开发,不能用于生产环境。 - 在启动时指定master(如--master yarn --deploy-mode client)[^2]。 3. spark-sql- 引用[4]提到:spark on hive & spark-sql on hive。它是一个用于执行Spark SQL查询的交互式命令行工具,类似于Hive的CLI。 - 特点: - 支持执行SQL语句,可以连接Hive Metastore(需要配置)[^4]。 - 通常用于执行SQL脚本或交互式查询,背后运行的是Spark SQL引擎。 - 也可以指定master(如--master yarn)来运行在集群上。 三者的主要区别: | 工具 | 用途 | 运行模式 | 适用场景 | |--------------|----------------------------------------------------------------------|--------------------|------------------------------| | **spark-submit** | 提交打包好的Spark应用程序(JAR包)到集群执行 | 支持所有集群模式 | 生产环境任务提交 | | **spark-shell** | 提供交互式Scala环境,用于探索性数据分析或调试(自动初始化Spark环境) | 通常使用client模式 | 开发/调试阶段 | | **spark-sql** | 提供SQL交互环境,执行SQL查询(支持Hive语法) | 通常使用client模式 | SQL查询、数据操作(替代Hive)| 详细说明: - **spark-submit**: - 是生产环境中最常用的提交方式。 - 支持细粒度资源控制(如--executor-memory, --executor-cores等)[^2]。 - 可以提交用Scala/Java/Python编写的Spark应用程序。 - **spark-shell**: - 启动后,用户可以直接在命令行中输入Scala代码,并立即看到结果。 - 在后台,它实际上启动了一个Spark应用(在指定的master上),但Driver在启动shell的机器上(client模式)。 - 不适合长时间运行的任务,因为一旦shell退出,任务就结束。 - **spark-sql**: - 启动后,可以执行SQL语句,也可以执行Spark SQL特有的命令(如SHOW TABLES)。 - 支持从文件系统(如HDFS)读取数据,也可以连接Hive Metastore[^4]。 - 可以通过`-f`参数执行SQL脚本文件。 示例: 1. 使用spark-submit提交作业(YARN cluster模式): ```bash spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ --executor-memory 2g \ --num-executors 4 \ /path/to/examples.jar 100 ``` 2. 启动spark-shell(本地模式测试): ```bash spark-shell --master local[4] ``` 然后在shell中输入: ```scala val data = Array(1,2,3,4,5) val rdd = sc.parallelize(data) rdd.reduce(_ + _) ``` 3. 使用spark-sql查询Hive表: ```bash spark-sql --master yarn --conf spark.sql.hive.thriftServer.singleSession=true ``` 然后输入SQL: ```sql SELECT * FROM my_hive_table LIMIT 10; ``` 注意:spark-shell和spark-sql在提交时也可以指定资源参数(如--executor-memory),但通常只在交互式调试时使用。 总结: - 编写好的Spark应用程序(jar包)使用spark-submit提交。 - 需要交互式探索数据或调试代码用spark-shell。 - 需要执行SQL查询(尤其是Hive表)用spark-sql。 根据用户之前的问题,可能还涉及Hive集成(引用[1][4])和YARN模式(引用[5]),但这里主要关注三个工具的区别。 生成相关问题: </think> ### Spark Shell、Spark-Submit、Spark-SQL 在作业提交中的区别 以下是三个核心工具Spark作业提交中的对比总结: | **工具** | **核心用途** | **运行模式** | **资源控制** | **适用场景** | |-----------------|--------------------------------------|----------------------------------|--------------------------|----------------------------------| | **spark-shell** | 交互式探索和调试 | `--master local[*]` (默认) | 不支持集群资源参数 | 开发调试、小规模数据探索 | | **spark-submit**| 提交打包的应用程序 | 支持所有模式(Local/YARN/K8s等) | 支持细粒度资源调控 | 生产环境作业、定时任务 | | **spark-sql** | 执行SQL/DDL操作 | 通常以`--master yarn-client`运行 | 有限支持资源参数 | Hive查询、数据仓库操作 | --- #### 1. **spark-shell:交互式探索工具** - **核心特点**: - REPL环境(Read-Eval-Print Loop),实时执行Scala/Python代码[^2] - **自动初始化**:启动时自动创建`SparkContext`(sc)和`SparkSession`(spark- **默认本地模式**:未指定`--master`时使用`local[*]`(本地所有核心)[^2] - **使用示例**: ```bash spark-shell \ --master yarn \ # 可切换至YARN模式 --executor-memory 4g # 资源控制有限 ``` ```scala // 交互式执行代码 val rdd = sc.parallelize(1 to 100) println(rdd.count()) ``` - **适用场景**: - 数据探索和原型验证 - 调试复杂转换逻辑 - 不适合生产环境长时间运行[^2] --- #### 2. **spark-submit:生产级作业提交** - **核心特点**: - 提交**预编译的JAR包**(Scala/Java)或Python脚本[^1][^2] - 完整集群资源控制: ```bash --executor-memory 8g \ --executor-cores 4 \ --num-executors 10 ``` - 支持**所有集群模式**: - YARN:`--master yarn --deploy-mode cluster`[^5] - Kubernetes:`--master k8s://...` - Standalone:`--master spark://...` - **使用示例**: ```bash spark-submit \ --class com.example.ETLJob \ --master yarn \ --deploy-mode cluster \ # Driver在YARN集群运行[^5] --queue production \ /path/to/your-app.jar ``` - **适用场景**: - 生产环境定时任务 - 大规模ETL流水线 - 需要资源隔离的作业[^2] --- #### 3. **spark-sqlSQL专用接口** - **核心特点**: - 专为SQL/DDL操作优化(兼容Hive语法)[^4] - 集成Hive Metastore: ```xml <property> <name>hive.execution.engine</name> <value>spark</value> <!-- 使用Spark引擎 --> </property> ``` - **执行方式**: - 交互式命令行:`spark-sql` - 脚本模式:`spark-sql -f script.sql` - **使用示例**: ```bash spark-sql \ --master yarn \ --conf spark.sql.shuffle.partitions=200 \ -e "SELECT * FROM hive_table LIMIT 10" # 直接执行SQL ``` - **适用场景**: - 替代Hive CLI执行查询[^4] - 数据仓库表管理(CREATE/ALTER) - SQL-centric工作流 --- ### 关键差异总结 1. **作业生命周期**: - `spark-shell`:会话结束时作业终止 - `spark-submit`:作业独立于客户端运行(尤其cluster模式) - `spark-sql`:SQL会话结束后释放资源 2. **元数据集成**: - `spark-sql`天然集成Hive Metastore[^4] - `spark-submit`需手动配置Hive支持 - `spark-shell`需显式启用Hive支持 3. **资源管理**: ```mermaid graph LR A[spark-shell] -->|仅基础配置| B(本地/YARN-client) C[spark-submit] -->|精细控制| D(所有集群模式) E[spark-sql] -->|中等控制| F(YARN-client为主) ``` > **最佳实践**: > - 开发阶段用`spark-shell`验证逻辑 > - 生产环境用`spark-submit`提交JAR包 > - Hive表操作首选`spark-sql`[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值