自己写的Spark入门实战教程,适合于有一定hadoop和数据分析经验的朋友。
Spark简介
Spark是一个开源的计算框架平台,使用该平台,数据分析程序可自动分发到集群中的不同机器中,以解决大规模数据快速计算的问题,同时它还向上提供一个优雅的编程范式,使得数据分析人员通过编写类似于本机的数据分析程序即可实现集群并行计算。
Spark项目由多个紧密集成的组件组成。
核心是Spark Core组件
,它实现了Spark的基本功能,包括:任务调度、内存管理、错误恢复、与存储系统交互等模块,特别的,Spark Core还定义了d性分布式数据集(RDD)的API,是Spark内存计算与并行计算的主要编程抽象。
在Spark Core上有一系列软件栈,用于满足了各种不同数据分析计算任务需求,包括连接关系型数据库或Hadoop Hive的SQL/HQL的查询组件Spark SQL,对实时数据进行流式计算的组件Spark Steaming,支持常见机器学习算法并行计算组件MLlib,支持并行图计算组件GraphX等。
为了进一步支持在数千个计算节点上的伸缩计算,Spark Core底层支持在各种集群管理器上运行,包括Hadoop YARN、Apache Mesos,或者Spark自带的Standalone独立调度器。
Spark部署
安装Spark比较简单,只要在机器上配置好最新版JAVA环境,下载编译好的Spark软件包后即可在本地运行。当然,也可以根据具体环境,使用Maven编译需要的Spark功能。
Spark部署有两种方式,一是本地部署,二是集群部署。前者只需启动本地的交互式环境spark-shellsh脚本即可,常用在本机快速程序测试,后者的应用场景更多些,具体根据集群环境不同,可部署在简易的Spark独立调度集群上、部署在Hadoop YARN集群上、或部署在Apache Mesos上等。
其中,Spark自带的独立调度器是最简单实现Spark集群环境的一种方式,只需在多台联网计算机上安装好Spark,然后在其中一台启动集群管理器(通过start-mastersh脚本),然后再在其他计算机上启动工作节点(通过start-slavesh脚本),并连接到管理器上即可。
Spark编程
使用Spark编程,需要先在本机安装好Spark环境,然后启动Spark上下文管理器连接到本机(本地部署)或是集群上的集群管理器(集群部署),再使用Spark提供的抽象接口编程即可。
支持Spark的原生语言是Scala,一种支持JVM的脚本语言,可以避免其他语言在做数据转化过程的性能或信息丢失。但随着Spark项目的不断完善,使用Python和PySpark包、或者R和SparkR包进行Spark编程也都是不错的选择。
不论使用何种编程语言,使用Spark进行数据分析的关键在于掌握Spark抽象的编程范式,其基本流程包括4步:
初始化SparkContext
。SparkContext即是Spark上下文管理器(也称为驱动器程序),它主要负责向Spark工作节点上发送指令并获得计算结果,但数据分析人员无需关注具体细节,只需使用SparkContext接口编程即可。
创建RDD
。d性分布数据集RDD是Spark在多机进行并行计算的核心数据结构,因此使用Spark进行数据分析,首先需使用SparkContext将外部数据读入到Spark集群内。
设计数据转化 *** 作
。即 *** 作的结果是返回一个新的RDD,即在图计算中只是一个中间节点。类比于Hadoop的Map()映射算子,但又不仅于此,Spark还支持filter()过滤算子、distinct()去重算子、sample()采样算子,以及多个RDD集合的交差补并等集合 *** 作。
设计数据执行 *** 作
。即 *** 作的结果向SparkContext返回结果,或者将结果写入外部 *** 作系统。类比于Hadoop的Reduce()算子,按某函数 *** 作两个数据并返回一个同类型的数据,此外Spark还支持collect()直接返回结果算子、count()计数算子、take()/top()返回部分数据算子、foreach()迭代计算算子等 *** 作。
Spark编程范式的本质是有向无环图方式的惰性计算
,即当使用上述方式进行编程后,Spark将自动将上述RDD和转化算子转换为有向无环图的数据工作流,只有当触发执行算子时,才按需进行数据工作流的计算。此外,为进一步提高计算效率,Spark默认将在内存中执行,并自动进行内存分配管理,当然分析人员也可根据需求通过persist()算子将中间步骤数据显式的将内存数据持久化到磁盘中,以方便调试或复用。
在R环境下使用Spark实例
最新版的RStudio已经较完整的集成了Spark数据分析功能,可以在SparkR官方扩展接口基础上更方便的使用Spark,主要需要安装两个包,分别是sparklyr和dplyr。其中,sparklyr包提供了更简洁易用的Spark R编程接口,dplyr包提供了一个语法可扩展的数据 *** 作接口,支持与主流SQL/NoSQL数据库连接,同时使数据 *** 作与数据集数据结构解耦合,并且和Spark原生算子可基本对应。
若第一次运行,先在本机安装必要的包和Spark环境:
之后运行下面的小例子,可以发现,除了需要初始化SparkContext、导入RDD数据和导出数据外,其他数据处理 *** 作都与在本机做数据分析是一样的。
此外,除了dplyr接口外,sparklyr还封装了一套特征工程和常用机器学习算法,足以满足80%常见的数据分析与挖掘工作,至于剩余的20%定制算法或是流处理、图计算等任务,便需要了解更多高阶的Spark接口来实现了。
之前对RDD的理解是,用户自己选定要使用spark处理的数据,然后这些数据经过transaction后会被赋予d性,分布特性的特点,具备这样特点的数据集,英文缩写就是RDD。
但RDD再怎么有特性,还是数据集,在理解里就像关系型数据库里的表,里面是存储的数据,抓来就用。
但之后看到dataframe和下面这张图之后,迷惑了……
感觉似乎dataframe的结构才更符合对rdd的理解……好像transaction在赋予数据集d性,分布特性的同时,还顺带把数据变成对象然后序列化存储了。
一般来讲,对于陌生的名词,大家的第一个反应都是“What is it”
RDD是Spark的核心内容,在Spark的官方文档中解释如下:RDD is a fault-tolerant collection of elements that can be operated on in parallel由此可见,其中有两个关键词:fault-tolerant & in parallel首先,容错性是RDD的一个重要特性;其次,它是并行计算的数据
RDD的中文解释为:d性分布式数据集,全称Resilient Distributed Datasets宾语是dataset,即内存中的数据库RDD 只读、可分区,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用所谓d性,是指内存不够时可以与磁盘进行交换这涉及到了RDD的另一特性:内存计算,就是将数据保存到内存中同时,为解决内存容量限制问题,Spark为我们提供了最大的自由度,所有数据均可由我们来进行cache的设置,包括是否cache和如何cache
如果看到这里,你的思维里对RDD还是没有任何概念的话,或许可以参照我的形象化理RDD,就是一个被武装起来的数据集
f(isset($_POST['submit'])&&$_POST['submit']=='提交'){
3 //判断是否是提交过来的
4 $intext = $_POST['intext'];
5 if($intext!=null||$intext!=''){
6 $link = mysql_connect("localhost", "root", "123456");
7 //数据库配置信息 第一个参数数据库位置第二个是用户名第三个是密码
8 mysql_select_db("szn_test");
9 //设置要使用的数据库
10 $sql = "select from demo where res = '"$intext"'";
DataSourceAPI就是如何从存储系统进行读写的相关API接口。
一般而言,DataSourceAPI应该是比较底层的API,但是这个版本的DataSourceAPI依赖了上层的API,比如SQLContext、DataFrame以及RDD等。在Spark20中,SQLContext已经被遗弃了,逐渐被SparkSession替代,同理,DataFrame也被DatasetAPI取代。但是Spark无法更新数据源API以反映这些变化。我们可以看到高层次的API随着时间的推移而发展。较低层次的数据源API依赖于高层次的API不是一个好主意。如果我们想添加其他优化,比如添加limiy优化,那么我们需要添加其他接口:
buildScan(limit)
buildScan(limit,requiredCols)
buildScan(limit,filters)
buildScan(limit,requiredCols,filters)
缺乏对列式存储读取的支持从上面的buildScanAPI可以看出,Spark数据源进支持以行式的形式读取数据。即使Spark内部引擎支持列式数据表示,它也不会暴露给数据源。但是我们知道使用列式数据进行分析会有很多性能提升,所以Spark完全没必要读取列式数据的时候把其转换成行式,然后再再Spark里面转换成列式进行分析。缺乏分区和排序信息物理存储信息(例如,分区和排序)不会从数据源传递到Spark计算引擎,因此不会在Spark优化器中使用。这对于像HBase/Cassandra这些针对分区访问进行了优化的数据库来说并不友好。在DataSourceV1API中,当Spark从这些数据源读取数据时,它不会尝试将处理与分区相关联,这将导致性能不佳。写 *** 作不支持事务当前的写接口非常通用。它的构建主要是为了支持在HDFS等系统中存储数据。但是像数据库这样更复杂的Sink需要更多地控制数据写入。例如,当数据部分写入数据库并且作业出现异常时,Spark数据源接口将不会清理这些行。这个在HDFS写文件不存在这个问题,因为写HDFS文件时,如果写成功将生成一个名为_SUCCESS的文件,但是这种机制在数据库中是不存在的。在这种情况下,会导致数据库里面的数据出现不一致的状态。这种情况通常可以引入事务进行处理,但是DataSourceV1版本不支持这个功能。不支持流处理越来越多的场景需要流式处理,但是DataSourceAPIV1不支持这个功能,这导致想Kafka这样的数据源不得不调用一些专用的内部API或者独自实现。正是因为DataSourceAPIV1的这些缺点和不足,引入DataSourceAPIV2势在必行。DataSourceAPIV2为了解决DataSourceV1的一些问题,从ApacheSpark230版本开始,社区引入了DataSourceAPIV2,在保留原有的功能之外,还解决了DataSourceAPIV1存在的一些问题,比如不再依赖上层API,扩展能力增强。
以上就是关于spark怎么把两个数据库通过姓名匹配成一个全部的内容,包括:spark怎么把两个数据库通过姓名匹配成一个、如何打印Spark RDD中的内容、怎样从spark rdd中得到某个元素,并将他赋值给一个对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)