`
wbj0110
  • 浏览: 1612292 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Spark SQL & Spark Hive编程开发, 并和Hive执行效率对比

阅读更多

Spark SQL也公布了很久,今天写了个程序来看下Spark SQL、Spark Hive以及直接用Hive执行的效率进行了对比。以上测试都是跑在YARN上。
  首先我们来看看我的环境:

  1. 3台DataNode,2台NameNode,每台机器20G内存,24核
  2. 数据都是lzo格式的,共336个文件,338.6 G
  3. 无其他任务执行

如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

三个测试都是执行

1 select count(*), host, module
2 from ewaplog
3 group by host, module
4 order by host, module;

下面我们先来看看Spark SQL核心的代码(关于Spark SQL的详细介绍请参见Spark官方文档,这里我就不介绍了。):

01 /**
02  * User: 过往记忆
03  * Date: 14-8-13
04  * Time: 下午23:16
05  * bolg: http://www.iteblog.com
06  * 本文地址:http://www.iteblog.com/archives/1090
07  * 过往记忆博客,专注于hadoop、hive、spark、shark、flume的技术博客,大量的干货
08  * 过往记忆博客微信公共帐号:iteblog_hadoop
09  */
10  
11 JavaSparkContext ctx = ...
12 JavaSQLContext sqlCtx = ...
13 JavaRDD<Entry> stringJavaRDD = ctx.textFile(args[0]).map(
14       new Function<String, Entry>() {
15             @Override
16             public Entry call(String str) throws Exception {
17                 String[] split = str.split("\u0001");
18                 if (split.length < 3) {
19                     return new Entry("""""");
20                 }
21  
22                 return new Entry(split[0], split[1], split[2]);
23             }
24 });
25  
26 JavaSchemaRDD schemaPeople = sqlCtx.applySchema(stringJavaRDD, Entry.class);
27 schemaPeople.registerAsTable("entry");
28 JavaSchemaRDD teenagers = sqlCtx.sql("select count(*), host, module " +
29                 "from entry " +
30                 "group by host, module " +
31                 "order by host, module");
32  
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);
37      }
38 }).collect();
39  
40 for (String name : teenagerNames) {
41             System.out.println(name);
42 }

Spark Hive核心代码:

01 /**
02  * User: 过往记忆
03  * Date: 14-8-23
04  * Time: 下午23:16
05  * bolg: http://www.iteblog.com
06  * 本文地址:http://www.iteblog.com/archives/1090
07  * 过往记忆博客,专注于hadoop、hive、spark、shark、flume的技术博客,大量的干货
08  * 过往记忆博客微信公共帐号:iteblog_hadoop
09  */
10 JavaHiveContext hiveContext =....;
11 JavaSchemaRDD result = hiveContext.hql("select count(*), host, module " +
12                 "from ewaplog " +
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));
18 }

  大家可以看到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
3                              --class SparkSQLTest
4                              --queue queue1
5                              ./spark-1.0-SNAPSHOT.jar
6                              /home/wyp/test/*.lzo

分别经过了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;
03  
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
09 OK
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 SQL&&&Kafka&& HBase&&HiveSpark第二次小测Spark第二次小测Spark第二次小测

    Atlas Spark SQL血缘分析,Hive Hook

    4. **执行Spark SQL操作**:当Spark SQL通过Hive接口执行DML(Data Manipulation Language)或DDL(Data Definition Language)操作时,Hive Hook会捕获这些操作的元数据变更。 5. **血缘信息收集和存储**:捕获的...

    spark-hive-2.11和spark-sql-以及spark-hadoop包另付下载地址

    Spark与Hive的集成,使得用户可以通过Spark SQL进行Hive数据的处理和分析,从而利用Spark的高性能来提升大数据查询的效率。 在标题"spark-hive-2.11和spark-sql-以及spark-hadoop包另付下载地址"中,我们关注的是...

    spark2.3.1-with-hive

    5. **Spark SQL 和 HiveQL 混合使用**:用户可以在同一个 Spark 应用程序中混合使用 SQL 和 HiveQL 查询,无缝切换,提升了开发效率。 然而,值得注意的是,压缩包名称为 "spark-2.3.1-bin-hadoop2-without-hive",...

    【Spark大数据习题】习题-Spark SQL&&&Kafka&& HBase&&HivePDF资源路径-Spark2

    【Spark大数据习题】涉及到的知识点涵盖了Spark的基础、Spark SQL、Kafka、HBase和Hive等关键领域。首先,我们从Scala语言基础部分开始。 Scala是一种多范式编程语言,融合了面向对象编程和函数式编程的特点。它...

    Spark不能使用hive自定义函数.doc

    - 执行包含 Hive UDF 的 Spark SQL 查询时出现运行时错误。 - Spark 的 DataFrame API 无法正确转换 Hive UDF。 #### 二、原因分析 导致 Spark 无法使用 Hive 自定义函数的主要原因有以下几点: 1. **环境配置不...

    hive3.x编译spark3.x包

    7. **验证和测试**:编译完成后,将生成的二进制包部署到Hadoop集群上,并运行一些测试用例以验证Hive和Spark的集成是否正常工作。 8. **打包与分发**:将编译好的Hive和Spark二进制包打包并分发到集群的各个节点,...

    《Spark SQL编程指南(v1.1.0)

    **Spark SQL编程指南** Spark SQL是Apache Spark的一个重要模块,专为处理结构化数据而设计。它是Apache Spark的原生SQL接口,允许开发者使用SQL或DataFrame/Dataset API进行数据分析。在Spark SQL中,数据可以被...

    spark或mr引擎插入的数据,hive表查询数据为0

    1. **源头上更换引擎**:最简单直接的方式是不在数据源端使用Tez引擎,而是选择使用Hive或Spark-SQL直接进行数据写入。这种方式避免了额外子目录的生成,从而消除了后续查询中的潜在问题。 2. **使用Tez引擎并进行二...

    Spark Sql中时间字段少8个小时问题解决

    本文将详细探讨在使用Spark SQL处理Hive表中的时间戳字段时,遇到的时间字段少8个小时的问题,并提供具体的解决方案。 #### 问题描述 在使用Spark SQL将Hive表中的`timestamp`类型字段插入到另一个表中时,发现最终...

    spark2.0编译版-适用于hive2.3的hive on spark

    6. **监控和调试**:使用Spark的Web UI(默认端口8080)和Hive的Web UI(默认端口9999)监控任务执行情况,以便找出性能瓶颈并进行调优。 7. **安全性**:如果在生产环境中,还需考虑安全认证,如Kerberos,以及...

    项目实战——Spark将Hive表的数据写入ElasticSearch(Java版本)

    在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...

    简单的spark 读写hive以及mysql

    首先,`SparkToHive.java` 和 `SparkHive.java` 文件涉及的是 Spark 读取和写入 Hive 数据。Spark 支持通过 HiveContext(现在称为 HiveSession)连接到 Hive,这样可以使用 SQL 查询 Hive 表并将其结果转换为 Spark...

    Spark_SQL大数据实例开发教程.pdf by Spark_SQL大数据实例开发教程.pdf (z-lib.org)1

    1. **认识Spark SQL**:这部分介绍了Spark SQL的基本概念,包括它的设计哲学和如何对比Hive进行优化。Hive作为早期SQL on Hadoop的工具,虽然提供了方便,但效率较低。Spark SQL通过改进,实现了更高的性能和更好的...

    Hive on Spark源码分析DOC

    例如,对于 SELECT 语句,Hive 会生成一个 QueryTask 对象,并将其提交到 Spark 集群中执行。 在 Hive on Spark 中,Hive 的 SQL 解析引擎会将 SQL 语句解析成 SparkTask 对象。SparkTask 对象包含了执行该 Task 所...

    eclipse集成hadoop+spark+hive开发源码实例

    这个压缩包"SparkHive"可能包含了示例代码或教程资源,用于演示如何在Eclipse中实现Hadoop、Spark和Hive的集成开发。通过这些例子,你可以学习如何创建数据处理项目,如何在Spark中运行SQL查询,以及如何在Hive中...

    基于CDH 6.3.0 搭建 Hive on Spark 及相关配置和调优

    然而,默认情况下,Hive使用MapReduce作为执行引擎,其效率较低,尤其对于迭代式算法等场景,处理速度明显慢于新兴的Spark计算框架。因此,将Hive的执行引擎从MapReduce切换至Spark(Hive on Spark),成为提高大...

    spark sql解析-源码分析

    7. **Code Generation**:Spark SQL利用Tungsten项目实现了代码生成技术,将优化后的物理计划转换为高效的Java或Scala代码,进一步提升了执行效率。 8. **Datalog与Catalyst规则**:Catalyst优化器利用Datalog规则...

    Learning Spark SQL - Aurobindo Sarkar

    通过学习《Learning Spark SQL - Aurobindo Sarkar》,读者不仅能掌握Spark SQL的技术细节,还能了解到如何在大数据处理中有效地运用这一工具,从而提升数据分析的效率和质量。这本书对于想要在大数据领域深入发展的...

    spark-2.3.0-bin-hadoop2-without-hive

    然后,我们可以在 Spark 任务中通过编程接口(如 Scala、Python 或 Java API)访问 Hive 表,或者使用 Spark SQL 语句进行查询,只不过这些操作不会直接依赖于 Hive 的执行引擎。 总结一下,"spark-2.3.0-bin-...

Global site tag (gtag.js) - Google Analytics