Spark做为ETL工具与SequoiaDB的结合应用

1、前言

ETL一词较经常使用于数据仓库,但其对象并不只限于数据仓库。ETL是指将数据从源系统中通过抽取(Extract)、转换(Transform)、加载(Load)到目标数据存储区的过程。常见的ETL工具备Oracle Data Integrator、Informatica PowerCenter、DataStage、Kettle、DataSprider等。php

在大数据应用中,海量的数据及对潜在应用的支持是很是重要的方面,并体现出与传统应用开发的巨大不一样。所以,在选择合适的ETL工具时,除了须要考虑数据处理的正确性、完整性、工具易用性、对不一样数据格式的支持程度以外,还必须考虑数据处理的效率、处理能力的可扩展、容错性。
Spark是UC Berkeley AMP lab开源的类Hadoop MapReduce的通用的并行计算框架,是一个新兴的大数据处理引擎,主要特色是提供了一个集群的分布式内存抽象。与Hadoop相比,Spark将中间数据放在内存中,避免频繁写盘,所以效率更高,更适合于迭代计算;在操做类型、开发语言支持上更丰富;在分布式数据集计算时经过checkpoint来实现容错。并且,因为Spark的分布式特性,处理能力的扩展更容易,也更经济。所以,从总体上,Spark做为ETL工具能帮助企业实现技术和财务的共赢。java

SequoiaDB是新一代NewSQL数据库,是文档型分布式数据的典型表明。SequoiaDB企业版经过深度集成最新的Spark内存计算框架,实现了批处理分析、流处理等贴近应用的功能。存储层和计算层两层分离的架构,技术互补,是硅谷大数据新架构的主流,将分布式计算与分布式存储的能力分别发挥到了极致。在Spark最新版本中,SparkSQL对标准SQL的支持也愈来愈完善,更加体现出Spark产品的成熟。所以,在SequoiaDB应用中,利用Spark进行数据加工分析是理想之选。git

2、功能概述

做为ETL工具,必须具有多样数据源的支持,好比HDFS、HBase、Amazon S三、MongoDB等。在这一点上,Spark支持跟多种数据源的对接,常见的数据源包括HDFS、Cassandra、HBase、Hive、ALLUXIO(即Tachyon)、Amazon S3;Spark也能从全文检索工具Elasticsearch中读写数据。Spark做为ETL工具能知足工具功能通用性的要求。github

以Spark为ETL处理的数据流图如图一所示:sql

图片描述

图一 Spark为ETL数据流图
在以上数据流图中,能够将存储于HDFS、Cassandra等系统中的存量数据经过Spark提供的接口抽到Spark中,利用Spark的快速处理能力进行处理,好比数据去重、更新,最后将结构数据存储到巨杉数据库中。整个处理过程当中,不须要将数据以数据文件的形式存盘,加快了处理速度。数据库

对于已存储到巨杉数据库中的数据,也能够在Spark中处理,并将处理后的数据落到库中。架构

3、环境搭建

3.1 Spark环境搭建框架

Spark运行模式包括Standalone、Spark on YARN、Spark on Mesos。三种模式的主要区别在于使用的资源管理调度工具不同。这里以Standalone模式为例进行说明。分布式

在部署以前,将须要部署Spark的机器两两之间的信任关系配置好,并根据Spark版本对JDK版本的需求安装配置好JDK。而后就能够开始安装Spark。ide

首先,从Spark官网获取最新版本的Spark安装文件。下载完成后将其解压到目标文件夹。

tar -zxvf spark-2.0.0-bin-hadoop2.6.tgz

从解压出来的文件目录能够看到,跟1.6版本相比,2.0版本的目录结构有一些细微变化,lib目录被删除,增长了jars目录。

而后,修改配置文件。一般须要修改的配置文件包含spark-env.sh、slaves,但为了后续使用方便,还须要修改或增长hive-site.xml、spark-defaults.conf、log4j.properties。下面分别进行说明。

  1. spark-env.sh
    配置Spark环境变量,包括:

SPARK_MASTER_IP:Spark集群Master节点IP地址;
SPARK_MASTER_PORT:Master节点端口号,默认为7077;
SPARK_WORKER_INSTANCES:每节点启动的Worker进程数量;
SPARK_WORKER_CORES:本机上Worker可用核数;
SPARK_WORKER_MEMORY:Worker可分配给executor使用的总内存;
SPARK_WORKER_DIR:Worker工做目录;
SPARK_LOCAL_DIRS:节点shuffle数据存放目录;
SPARK_CLASSPATH:Spark默认classpath。
2.slaves
配置Spark集群中运行Worker的节点,值为主机名,每一行一个主机名。

  1. hive-site.xml
    主要用于元数据库的配置。Spark默认使用Derby做为数据库管理元数据,当咱们须要配置其余数据库做为元数据库时,须要增长并修改此配置文件。一个例子以下所示:

<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:postgresql://192.168.111.129:5432/metastore</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>org.postgresql.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hiveuser</value>
    <description>Username to use against metastore database</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>mypassword</value>
    <description>password to use against metastore database</description>
  </property>
  <property>
    <name>datanucleus.autoCreateSchema</name>
    <value>false</value>
  </property>
</configuration>
  1. spark-defaults.conf
    Spark默认配置。该配置能够配置spark.master、spark.driver.memory、spark.executor.extraJavaOptions等。当咱们须要经过JDBC使用SparkSQL时,须要首先启动Thriftserver,启动时须要指定MASTER_URL,这个MASTER_URL能够配置到spark-defaults.conf中的spark.master参数中,省去在命令行启动时都须要输入MASTER_URL的麻烦。

  2. log4j.properties
    配置Spark log日志。

最后,启动Spark集群。配置文件修改好后,就能够启动Spark。因为已经配置好Master及Worker的信息,能够经过以下命令启动Spark集群:

sbin/start-all.sh

3.2 配置Spark与SequoiaDB的链接
SequoiaDB开源了Spark链接器,能够在github网站上找到相应的代码(https://github.com/SequoiaDB/...),打包后获得链接器命名为spark-sequoiadb-2.0.0.jar。将链接器和SequoiaDB Java驱动包sequoiadb.jar一块儿,拷贝至jars目录,并在spark-env.sh中配置SPARK_CLASSPATH,将链接器及驱动包全路径配置到SPARK_CLASSPATH环境变量中,如

SPARK_CLASSPATH=/opt/spark-2.0.0-bin-hadoop2.6/jars/spark-sequoiadb-2.0.0.jar:/opt/spark-2.0.0-bin-hadoop2.6/jars/sequoiadb.jar

配置完成后,经过以下命令启动Thriftserver:

sbin/start-thriftserver.sh

启动成功后,经过jps命令能够看到Thriftserver相关的进程:

图片描述

图二 Thriftserver相关进程
至此,Spark与SequoiaDB的环境已经搭建完成,能够开始用Spark处理数据了。

4、SequoiaDB数据处理

4.1 处理流程
SequoiaDB与Spark环境搭建完成以后,能够根据数据源的不一样,采起不一样的方式在Spark中建立针对不一样数据源的映射,就能够将数据源与SequoiaDB经过Spark链接起来,完成ETL处理。

本节以SparkSQL对SequoiaDB中数据进行ETL为例,说明Spark与SequoiaDB的结合应用。源数据为其余时可使用相似的处理逻辑。

在Spark中建立到SequoiaDB中集合的映射表语法为:

create table tablename (
f1 string,
f2 string,
f3 int,
f4 double,
f5 string,
f6 long
) using com.sequoiadb.spark OPTIONS ( host 'sdbserver1:11810,sdbserver2:11810,sdbserver3:11810', collectionspace 'foo', collection 'bar');

其中,host为SequoiaDB的访问地址,格式为hostname:svcname,能够包含多个地址。collectionspace及collection分别表明SequoiaDB中的集合空间及集合。

本例为利用天天增量数据对已有存量数据进行更新的场景,涉及的表为:帐户信息表acct_info为结果表、帐户信息中转表repo_acct_info为天天增量数据、acct_info_his为已有存量数据。因为SparkSQL不支持UPDATE及DELETE操做,所以,涉及到UPDATE及DELETE的场景能够经过将结果数据存于新表的方式来完成。UPDATE分为两步:
第一步:将中转表中最新数据插入结果表。经过这一步,保证第一次进来的数据和存在更新的数据进到结果表。执行语句为:

insert into table dst.acct_info
select * from src.repo_acct_info
where tx_date = '2016-06-23' ;"

第二步:将未作任何更新的数据数据插入结果表。执行语句为:

insert into table dst.acct_info
select distinct a.* from src.acct_info_his a left join src.repo_acct_info b
on a.id = b.id and b.tx_date = '2016-06-23'
where b.id is null ;"

其中id为acct_info表的主键,经过id惟一标识一条记录。经过以上两个步骤,结果表acct_info即为通过去重后的更新数据。
而DELETE操做则只须要将不知足删除条件的数据插入新表便可。

4.2 性能结果

1.系统配置

硬件环境
图片描述

软件环境
图片描述

2.UPDATE场景

图片描述

3.DELETE场景

图片描述

5、结论

Spark可以方便地读取多样数据源,做为一种较为成熟的新框架,Spark不只支持HDFS、Cassandra、HIVE、Amazon S3这类相对较新的数据源,对传统行业常见的如Oracle、DB二、Teradata,Spark也能很好地支持,且Spark支持SQL2003,应用Spark也能充分发挥传统企业在SQL处理上的强项。在大数据应用中,以Spark为ETL工具能够充分发挥分布式计算框架Spark的处理能力的性能优点。

做为全球得到Databricks认证的14家发行商之一,SequoiaDB企业版深度集成最新的Spark内存计算框架,存储层和计算层两层分离的架构、技术互补,是硅谷大数据新架构的主流,将分布式计算与分布式存储的能力分别发挥到了极致。现在,Spark技术已经被大量运用到实时流处理、分析等不一样领域,后台数据加工也能够利用Spark技术得以实现。

SequoiaDB巨杉数据库2.6最新版下载
SequoiaDB巨杉数据库技术博客
SequoiaDB巨杉数据库社区

相关文章
相关标签/搜索