Spark SQL 大数据处理

InfoQ 上有学者对 Spark 的大数据处理,做了一些归纳演讲
我尝试着对这些演讲做翻译,加入了一些自己的理解和实验
理解是我自己的,有可能是错误的,实验是为了证明自己的理解是正确的

Big Data Processing with Apache Spark - Part 2 : Spark SQL

https://www.infoq.com/articles/apache-spark-sql?utm_source=apachesparkseries&utm_medium=link&utm_campaign=internal

这是有关 Spark 大数据处理的第二讲。
上一篇《为什么要使用 Spark》是引言介绍 Spark, 这一篇讲实际应用。

Spark 是一套计算框架

脚手架就那么几种,是想要摩天大楼,还是想要濠苑别墅,都基于 Spark 的基础建设。
Spark SQL 就是一种对 Spark 基建的改造应用, Spark 的底子, SQL 的上层建筑。
你照样写你的 SQL , Spark SQL 帮你翻译成 Spark 底层应用的计算步骤,
完成分布式计算后,把结果汇总好了,给到你, Spark 是如何处理的,完全不用你操心

关于底层,唯一要注意的是,数据“底料”的格式,
盖楼大概都是钢筋水泥,或者木料
或者跟南京城墙一样,用米糊垒砖,屹立几百年不倒

如何体现出 Spark SQL 的优越性?

假设我们有 3 台 Spark 计算机组成了 Spark SQL 集群
还有一台和 spark 节点一样配置的 SQL Server/ Oracle
计算同样的 3 亿条数据的汇总,分别看看时间长短。

Select AVG(SalesAmount) From FctSales ;

假设 FctSales 有 30亿条数据,每台计算机的内存都是 1 G, CPU 1.3.
看看计算返回的时间,便可以知晓那种架构快了

数据底料,Spark SQL 连接的数据格式,除了 Hive, 还有 Json , Batch File等
可能最新的版本还会支持更多的格式,
比如 2018.02.28 发表的 Spark 2.3 就支持 Vectorized ORC Reader.

从 Spark 1.3 开始,之前的 SchemaRDD 等概念就有新的更新了:

*DataFrame: The new release provides a programming abstraction called DataFrames which can act as distributed SQL query engine.
Data Sources: With the addition of the data sources API, Spark SQL now makes it easier to compute over structured data stored in a wide variety of formats, including Parquet, JSON, and Apache Avro library.
JDBC Server: The built-in JDBC server makes it easy to connect to the structured data stored in relational database tables and perform big data analytics using the traditional BI tools.*

DataFrame 取代了 SchemaRDD, 成了新一代的分布式查询引擎
但对于用户来说这是透明的,我们还是用 SQL 来写,DataFrame 自动帮我们完成解析 SQL 语句,网络通信,抓取数据,汇总数据等操作

Data Source, 也就是数据底料,开始支持 Parquet, Avro , Json.
Json, 大家都很容易理解,平时用的也不少,就是JavaScript Object.

那么 Parquet, Avro 是什么,
为什么要有这两种格式的数据?
分别有什么先进的地方,这些都留给我们去发现。

Apache Parquet , 是一种列式存储格式的数据,以下是wikipedia 的说明:

Apache Parquet is a free and open-source column-oriented data store of the Apache Hadoop ecosystem. It is similar to the other columnar storage file formats available in Hadoop namely RCFile and Optimized RCFile.

所以 Apache Parquet 也是基于分布式的列式存储

Apache Avro 就没那么简单了:

https://en.wikipedia.org/wiki/Apache_Avro

*Avro is a remote procedure call and data serialization framework developed within Apache’s Hadoop project. It uses JSON for defining data types and protocols, and serializes data in a compact binary format. Its primary use is in Apache Hadoop, where it can provide both a serialization format for persistent data, and a wire format for communication between Hadoop nodes, and from client programs to the Hadoop services.
It is similar to Thrift and Protocol Buffers, but does not require running a code-generation program when a schema changes (unless desired for statically-typed languages).*

它可以将 Json 序列化成压缩的二进制格式,使得数据体积更小,更容易传播和存储。

最大化利用我们的 Spark SQL - Spark SQL JDBC Server

并不是每个用户都会有 Spark SQL 的编程技巧
数据分析手段的使用,正在慢慢推进。
从一开始的 C/S 系统的报表工具, 到分析人员大量的 Excel 制作, 到 BI 报表的大量使用
每一个阶段,都代表着数据分析这一生产力的提升。
而当大数据盛行的时候,我们同样也需要升级我们的的分析工具
使其可以跟得上时代的进步,跨入大数据分析领域的分析

那么有没有办法让分析人员在 Excel, BI 报表上的技术积累,得以扩展到大数据分析呢?

设想我们只要在excel, BI 报表上增加一条 JDBC 的连接
就能连到 Spark SQL 上,执行常用的 SQL 来抓取数据,分析大数据了
这就是 Spark SQL JDBC Server!

Thrift JDBC Server 就是一个服务器进程,属于 Spark SQL 的一部分
当我们把 Thrift JDBC Server 启动起来的时候,默认是开启了本地的10000端口

start-thriftserver.sh

此时就允许多个客户端来访问我们的 Spark SQL 了

通过向本地的10000端口发送 SQL 请求,Spark SQL 会将这些 SQL 请求转译成 Spark SchemaRDD, DataFrame 的执行命令,通过集群管理器(YARN) 发送到各个执行节点上运行。直到最终结果的返回!

下面是个简单的 Java 连接 Spark SQL JDBC Server 的例子。
在这个例子里,我们没有使用任何 Spark 的库
完全是和 Spark 环境独立开来的应用,却还能访问 Spark SQL 利用它的并行计算
所以即使我们的应用程序是一个网站,只要能连接上Spark SQL JDBC Server
就能使用Spark SQL

package SparkSQL;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Employee{
public static void main(String args[]) {
    try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    Connection conn = null ;
    try {
conn = DriverManager.getConnection("jdbc:hive2://localhost:10000/default","","");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    System.out.println("Connected!");

    Statement stmt = null;
try {
stmt = conn.createStatement();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    String sql;
    sql = "SELECT count(*) as employeesCnt FROM employees";
    ResultSet rs = null;
try {
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    //STEP 5: Extract data from result set
    try {
while(rs.next()){
  //Retrieve by column name
  int cnt  = rs.getInt("employeesCnt");

  System.out.print("employeeCnt: " + cnt);

}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

这里概念需要特别清楚:

a 以上Spark SQL 其中的 SQL 指的就是 Hive.
b 这个 Thrift JDBC Server 就是一个 Hive Server. 可以接收客户端对于 Hive 的请求
c 当我们创建 Java 连接 spark SQL 的应用,就是去连接 Hive Server.

那么 Spark SQL JDBC Server 的意义在哪里? Hive 也可以开启 Remote Access, 同样也是使用 Thrift Server. Spark SQL 其实是一类特殊的 SQL . 它支持常规的 SQL 语言,只是这类语言在别的语言里调用时,发送到 Spark SQL JDBC Server 上之后,会被 Spark 内置的分布式引擎翻译为 Spark 命令,分配到各个 Spark 执行节点上执行。而 Spark SQL 支持的分布式库,就有 Hive. 因此 Hive 的 HQL 语言是被 Spark SQL 支持的(HiveContext)。而这里的 Spark SQL JDBC Server 不仅仅是 Hive Server , 而是一层 Spark编译层.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dbLenis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值