Spark SQL也公布了很久,今天写了个程序来看下Spark SQL、Spark Hive以及直接用Hive执行的效率进行了对比。以上测试都是跑在YARN上。
首先我们来看看我的环境:
- 3台DataNode,2台NameNode,每台机器20G内存,24核
- 数据都是lzo格式的,共336个文件,338.6 G
- 无其他任务执行
如果想及时了解
Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:
iteblog_hadoop
三个测试都是执行
1 |
select count(*), host, module |
下面我们先来看看Spark SQL核心的代码(关于Spark SQL的详细介绍请参见Spark官方文档,这里我就不介绍了。):
07 |
* 过往记忆博客,专注于hadoop、hive、spark、shark、flume的技术博客,大量的干货
|
08 |
* 过往记忆博客微信公共帐号:iteblog_hadoop
|
11 |
JavaSparkContext ctx = ... |
12 |
JavaSQLContext sqlCtx = ... |
13 |
JavaRDD<Entry> stringJavaRDD = ctx.textFile(args[ 0 ]).map(
|
14 |
new Function<String, Entry>() {
|
16 |
public Entry call(String str) throws Exception {
|
17 |
String[] split = str.split( "\u0001" );
|
18 |
if (split.length < 3 ) {
|
19 |
return new Entry( "" , "" , "" );
|
22 |
return new Entry(split[ 0 ], split[ 1 ], split[ 2 ]);
|
26 |
JavaSchemaRDD schemaPeople = sqlCtx.applySchema(stringJavaRDD, Entry. class );
|
27 |
schemaPeople.registerAsTable( "entry" );
|
28 |
JavaSchemaRDD teenagers = sqlCtx.sql( "select count(*), host, module " +
|
30 |
"group by host, module " +
|
31 |
"order by host, module" );
|
33 |
List<String> teenagerNames = teenagers.map( new Function<Row, String>() {
|
34 |
public String call(Row row) {
|
35 |
return row.getLong( 0 ) + "\t" +
|
36 |
row.getString( 1 ) + "\t" + row.getString( 2 );
|
40 |
for (String name : teenagerNames) {
|
41 |
System.out.println(name);
|
Spark Hive核心代码:
07 |
* 过往记忆博客,专注于hadoop、hive、spark、shark、flume的技术博客,大量的干货
|
08 |
* 过往记忆博客微信公共帐号:iteblog_hadoop
|
10 |
JavaHiveContext hiveContext =....; |
11 |
JavaSchemaRDD result = hiveContext.hql( "select count(*), host, module " +
|
13 |
"group by host, module " +
|
14 |
"order by host, module" );
|
15 |
List<Row> collect = result.collect(); |
16 |
for (Row row : collect) {
|
17 |
System.out.println(row.get( 0 ) + "\t" + row.get( 1 ) + "\t" + row.get( 2 ));
|
大家可以看到Spark Hive核心代码里面的SQL语句和直接在Hive上面执行一样,在执行这个代码的时候,需要确保ewaplog存在。而且在运行这个程序的时候需要依赖Hive的一些jar包,需要依赖Hive的元数据等信息。对Hive的依赖比较大。而Spark SQL直接读取lzo文件,并没有涉及到Hive,相比Spark Hive依赖性这方便很好。Spark SQL直接读取lzo文件,然后将数据存放在RDD中,applySchema方法将JavaRDD转换成JavaSchemaRDD,我们来看看文档是怎么来描述的
At the core of this component is a new type of RDD, SchemaRDD. SchemaRDDs are composed Row objects along with a schema that describes the data types of each column in the row. A SchemaRDD is similar to a table in a traditional relational database. A SchemaRDD can be created from an existing RDD, Parquet file, a JSON dataset, or by running HiveQL against data stored in Apache Hive.
转换成JavaSchemaRDD之后,我们可以用用registerAsTable将它注册到表中,之后就可以通过JavaSQLContext的sql方法来执行相应的sql语句了。
用Maven编译完上面的程序之后,放到Hadoop集群上面运行:
1 |
iteblog @Spark $ spark-submit --master yarn-cluster
|
2 |
--jars lib/spark-sql_2. 10 - 1.0 . 0 .jar
|
5 |
./spark- 1.0 -SNAPSHOT.jar
|
分别经过了20分钟左右的时间,Spark SQL和Spark Hive都可以运行完,结果如下:
01 |
39511517 bokingserver1 CN1_hbase_android_client
|
02 |
59141803 bokingserver1 CN1_hbase_iphone_client
|
03 |
39544052 bokingserver2 CN1_hbase_android_client
|
04 |
59156743 bokingserver2 CN1_hbase_iphone_client
|
05 |
23472413 bokingserver3 CN1_hbase_android_client
|
06 |
35251936 bokingserver3 CN1_hbase_iphone_client
|
07 |
23457708 bokingserver4 CN1_hbase_android_client
|
08 |
35262400 bokingserver4 CN1_hbase_iphone_client
|
09 |
19832715 bokingserver5 CN1_hbase_android_client
|
10 |
51003885 bokingserver5 CN1_hbase_iphone_client
|
11 |
19831076 bokingserver6 CN1_hbase_android_client
|
12 |
50997314 bokingserver6 CN1_hbase_iphone_client
|
13 |
30526207 bokingserver7 CN1_hbase_android_client
|
14 |
50702806 bokingserver7 CN1_hbase_iphone_client
|
15 |
54844214 bokingserver8 CN1_hbase_android_client
|
16 |
88062792 bokingserver8 CN1_hbase_iphone_client
|
17 |
54852596 bokingserver9 CN1_hbase_android_client
|
18 |
88043401 bokingserver9 CN1_hbase_iphone_client
|
19 |
54864322 bokingserver10 CN1_hbase_android_client
|
20 |
88041583 bokingserver10 CN1_hbase_iphone_client
|
21 |
54891529 bokingserver11 CN1_hbase_android_client
|
22 |
88007489 bokingserver11 CN1_hbase_iphone_client
|
23 |
54613917 bokingserver12 CN1_hbase_android_client
|
24 |
87623763 bokingserver12 CN1_hbase_iphone_client
|
为了比较基于Spark的任务确实比基于Mapreduce的快,我特意用Hive执行了同样的任务,如下:
01 |
hive> select count(*), host, module from ewaplog |
02 |
> group by host, module order by host, module;
|
04 |
Job 0 : Map: 2845 Reduce: 364 Cumulative CPU: 17144.59 sec
|
05 |
HDFS Read: 363542156311 HDFS Write: 36516 SUCCESS
|
06 |
Job 1 : Map: 1 Reduce: 1 Cumulative CPU: 4.82 sec
|
07 |
HDFS Read: 114193 HDFS Write: 1260 SUCCESS
|
08 |
Total MapReduce CPU Time Spent: 0 days 4 hours 45 minutes 49 seconds 410 msec
|
10 |
39511517 bokingserver1 CN1_hbase_android_client
|
11 |
59141803 bokingserver1 CN1_hbase_iphone_client
|
12 |
39544052 bokingserver2 CN1_hbase_android_client
|
13 |
59156743 bokingserver2 CN1_hbase_iphone_client
|
14 |
23472413 bokingserver3 CN1_hbase_android_client
|
15 |
35251936 bokingserver3 CN1_hbase_iphone_client
|
16 |
23457708 bokingserver4 CN1_hbase_android_client
|
17 |
35262400 bokingserver4 CN1_hbase_iphone_client
|
18 |
19832715 bokingserver5 CN1_hbase_android_client
|
19 |
51003885 bokingserver5 CN1_hbase_iphone_client
|
20 |
19831076 bokingserver6 CN1_hbase_android_client
|
21 |
50997314 bokingserver6 CN1_hbase_iphone_client
|
22 |
30526207 bokingserver7 CN1_hbase_android_client
|
23 |
50702806 bokingserver7 CN1_hbase_iphone_client
|
24 |
54844214 bokingserver8 CN1_hbase_android_client
|
25 |
88062792 bokingserver8 CN1_hbase_iphone_client
|
26 |
54852596 bokingserver9 CN1_hbase_android_client
|
27 |
88043401 bokingserver9 CN1_hbase_iphone_client
|
28 |
54864322 bokingserver10 CN1_hbase_android_client
|
29 |
88041583 bokingserver10 CN1_hbase_iphone_client
|
30 |
54891529 bokingserver11 CN1_hbase_android_client
|
31 |
88007489 bokingserver11 CN1_hbase_iphone_client
|
32 |
54613917 bokingserver12 CN1_hbase_android_client
|
33 |
87623763 bokingserver12 CN1_hbase_iphone_client
|
34 |
Time taken: 1818.706 seconds, Fetched: 24 row(s)
|
从上面的显示我们可以看出,Hive执行同样的任务用了30分钟,而Spark用了20分钟,也就是省了1/3的时间,还是很快的。在运行的过程中,我发现Spark消耗内存比较大,在程序运行期间,三个子节点负载很高,整个队列的资源消耗了一半以上。我想如果集群的机器数据更多的话,Spark的运行速度应该还会有一些提升。好了今天就说到这,欢迎关注本博客。
转载自过往记忆(http://www.iteblog.com/)
分享到:
相关推荐
【Spark大数据习题】习题_Spark SQL&&&Kafka&& HBase&&HiveSpark第二次小测Spark第二次小测Spark第二次小测
4. **执行Spark SQL操作**:当Spark SQL通过Hive接口执行DML(Data Manipulation Language)或DDL(Data Definition Language)操作时,Hive Hook会捕获这些操作的元数据变更。 5. **血缘信息收集和存储**:捕获的...
Spark与Hive的集成,使得用户可以通过Spark SQL进行Hive数据的处理和分析,从而利用Spark的高性能来提升大数据查询的效率。 在标题"spark-hive-2.11和spark-sql-以及spark-hadoop包另付下载地址"中,我们关注的是...
5. **Spark SQL 和 HiveQL 混合使用**:用户可以在同一个 Spark 应用程序中混合使用 SQL 和 HiveQL 查询,无缝切换,提升了开发效率。 然而,值得注意的是,压缩包名称为 "spark-2.3.1-bin-hadoop2-without-hive",...
【Spark大数据习题】涉及到的知识点涵盖了Spark的基础、Spark SQL、Kafka、HBase和Hive等关键领域。首先,我们从Scala语言基础部分开始。 Scala是一种多范式编程语言,融合了面向对象编程和函数式编程的特点。它...
- 执行包含 Hive UDF 的 Spark SQL 查询时出现运行时错误。 - Spark 的 DataFrame API 无法正确转换 Hive UDF。 #### 二、原因分析 导致 Spark 无法使用 Hive 自定义函数的主要原因有以下几点: 1. **环境配置不...
7. **验证和测试**:编译完成后,将生成的二进制包部署到Hadoop集群上,并运行一些测试用例以验证Hive和Spark的集成是否正常工作。 8. **打包与分发**:将编译好的Hive和Spark二进制包打包并分发到集群的各个节点,...
**Spark SQL编程指南** Spark SQL是Apache Spark的一个重要模块,专为处理结构化数据而设计。它是Apache Spark的原生SQL接口,允许开发者使用SQL或DataFrame/Dataset API进行数据分析。在Spark SQL中,数据可以被...
在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...
本文将详细探讨在使用Spark SQL处理Hive表中的时间戳字段时,遇到的时间字段少8个小时的问题,并提供具体的解决方案。 #### 问题描述 在使用Spark SQL将Hive表中的`timestamp`类型字段插入到另一个表中时,发现最终...
6. **监控和调试**:使用Spark的Web UI(默认端口8080)和Hive的Web UI(默认端口9999)监控任务执行情况,以便找出性能瓶颈并进行调优。 7. **安全性**:如果在生产环境中,还需考虑安全认证,如Kerberos,以及...
首先,`SparkToHive.java` 和 `SparkHive.java` 文件涉及的是 Spark 读取和写入 Hive 数据。Spark 支持通过 HiveContext(现在称为 HiveSession)连接到 Hive,这样可以使用 SQL 查询 Hive 表并将其结果转换为 Spark...
1. **认识Spark SQL**:这部分介绍了Spark SQL的基本概念,包括它的设计哲学和如何对比Hive进行优化。Hive作为早期SQL on Hadoop的工具,虽然提供了方便,但效率较低。Spark SQL通过改进,实现了更高的性能和更好的...
例如,对于 SELECT 语句,Hive 会生成一个 QueryTask 对象,并将其提交到 Spark 集群中执行。 在 Hive on Spark 中,Hive 的 SQL 解析引擎会将 SQL 语句解析成 SparkTask 对象。SparkTask 对象包含了执行该 Task 所...
这个压缩包"SparkHive"可能包含了示例代码或教程资源,用于演示如何在Eclipse中实现Hadoop、Spark和Hive的集成开发。通过这些例子,你可以学习如何创建数据处理项目,如何在Spark中运行SQL查询,以及如何在Hive中...
7. **Code Generation**:Spark SQL利用Tungsten项目实现了代码生成技术,将优化后的物理计划转换为高效的Java或Scala代码,进一步提升了执行效率。 8. **Datalog与Catalyst规则**:Catalyst优化器利用Datalog规则...
通过学习《Learning Spark SQL - Aurobindo Sarkar》,读者不仅能掌握Spark SQL的技术细节,还能了解到如何在大数据处理中有效地运用这一工具,从而提升数据分析的效率和质量。这本书对于想要在大数据领域深入发展的...
然而,默认情况下,Hive使用MapReduce作为执行引擎,其效率较低,尤其对于迭代式算法等场景,处理速度明显慢于新兴的Spark计算框架。因此,将Hive的执行引擎从MapReduce切换至Spark(Hive on Spark),成为提高大...
在构建大数据处理环境时,Hadoop、HBase、Spark和Hive是四个核心组件,它们协同工作以实现高效的数据存储、处理和分析。本教程将详细介绍如何在Ubuntu系统上搭建这些组件的集群。 1. **Hadoop**:Hadoop是Apache...
2. **Catalyst优化器**:Spark SQL使用Catalyst优化器进行查询优化,这个优化器能够对查询计划进行转换,提高执行效率,包括列裁剪、代码生成等优化策略。 3. **DataFrame API**:DataFrame API提供了类似于SQL的...