浅谈PySpark SQL 相关知识介绍
1 大数据简介
大数据是这个时代最热门的话题之一。但是什么是大数据呢?它描述了一个庞大的数据集,并且正在以惊人的速度增长。大数据除了体积(volume)和速度(velocity)外,数据的多样性(variety)和准确性(veracity)也是大数据的一大特点。让我们详细讨论体积、速度、多样性和准确性。这些也被称为大数据的4v特征。
1.1 volume
数据体积(volume)指定要处理的数据量。对于大量数据,我们需要大型机器或分布式系统。计算时间随数据量的增加而增加。所以如果我们能并行化计算,最好使用分布式系统。数据可以是结构化数据、非结构化数据或介于两者之间的数据。如果我们有非结构化数据,那么情况就会变得更加复杂和计算密集型。你可能会想,大数据到底有多大?这是一个有争议的问题。但一般来说,我们可以说,我们无法使用传统系统处理的数据量被定义为大数据。现在让我们讨论一下数据的速度。
1.2 velocity
越来越多的组织机构开始重视数据。每时每刻都在收集大量的数据。这意味着数据的速度在增加。一个系统如何处理这个速度?当必须实时分析大量流入的数据时,问题就变得复杂了。许多系统正在开发,以处理这种巨大的数据流入。将传统数据与大数据区别开来的另一个因素是数据的多样性。
1.3 variety
数据的多样性使得它非常复杂,传统的数据分析系统无法正确地分析它。我们说的是哪一种?数据不就是数据吗?图像数据不同于表格数据,因为它的组织和保存方式不同。可以使用无限数量的文件系统。每个文件系统都需要一种不同的方法来处理它。读取和写入json文件与处理csv文件的方式不同。现在,数据科学家必须处理数据类型的组合。您将要处理的数据可能是图片、视频、文本等的组合。大数据的多样性使得分析变得更加复杂。
1.4 veracity
你能想象一个逻辑错误的计算机程序产生正确的输出吗?同样,不准确的数据将提供误导的结果。准确性,或数据正确性,是一个重要的问题。对于大数据,我们必须考虑数据的异常。
2 hadoop 介绍
hadoop是一个解决大数据问题的分布式、可伸缩的框架。hadoop是由doug cutting和mark cafarella开发的。hadoop是用java编写的。它可以安装在一组商用硬件上,并且可以在分布式系统上水平扩展。
在商品硬件上工作使它非常高效。如果我们的工作是在商品硬件,故障是一个不可避免的问题。但是hadoop为数据存储和计算提供了一个容错系统。这种容错能力使得hadoop非常流行。
hadoop有两个组件:第一个组件是hdfs(hadoop distributed file system),它是一个分布式文件系统。第二个组件是mapreduce。hdfs用于分布式数据存储,mapreduce用于对存储在hdfs中的数据执行计算。
2.1 hdfs介绍
hdfs用于以分布式和容错的方式存储大量数据。hdfs是用java编写的,在普通硬件上运行。它的灵感来自于谷歌文件系统(gfs)的谷歌研究论文。它是一个写一次读多次的系统,对大量的数据是有效的。hdfs有两个组件namenode和datanode。
这两个组件是java守护进程。namenode负责维护分布在集群上的文件的元数据,它是许多datanode的主节点。hdfs将大文件分成小块,并将这些块保存在不同的datanode上。实际的文件数据块驻留在datanode上。hdfs提供了一组类unix-shell的命令。但是,我们可以使用hdfs提供的java filesystem api在更细的级别上处理大型文件。容错是通过复制数据块来实现的。
我们可以使用并行的单线程进程访问hdfs文件。hdfs提供了一个非常有用的实用程序,称为distcp,它通常用于以并行方式将数据从一个hdfs系统传输到另一个hdfs系统。它使用并行映射任务复制数据。
2.2 mapreduce介绍
计算的mapreduce模型最早出现在谷歌的一篇研究论文中。hadoop的mapreduce是hadoop框架的计算引擎,它在hdfs中对分布式数据进行计算。mapreduce已被发现可以在商品硬件的分布式系统上进行水平伸缩。它也适用于大问题。在mapreduce中,问题的解决分为map阶段和reduce阶段。在map阶段,处理数据块,在reduce阶段,对map阶段的结果运行聚合或缩减操作。hadoop的mapreduce框架也是用java编写的。
mapreduce是一个主从模型。在hadoop 1中,这个mapreduce计算由两个守护进程jobtracker和tasktracker管理。jobtracker是处理许多任务跟踪器的主进程。tasktracker是jobtracker的从节点。但在hadoop 2中,jobtracker和tasktracker被yarn取代。
我们可以使用框架提供的api和java编写mapreduce代码。hadoop streaming体模块使具有python和ruby知识的程序员能够编写mapreduce程序。
mapreduce算法有很多用途。如许多机器学习算法都被apache mahout实现,它可以在hadoop上通过pig和hive运行。
但是mapreduce并不适合迭代算法。在每个hadoop作业结束时,mapreduce将数据保存到hdfs并为下一个作业再次读取数据。我们知道,将数据读入和写入文件是代价高昂的活动。apache spark通过提供内存中的数据持久性和计算,减轻了mapreduce的缺点。
更多关于mapreduce 和 mahout 可以查看如下网页:
3 apache hive 介绍
计算机科学是一个抽象的世界。每个人都知道数据是以位的形式出现的信息。像c这样的编程语言提供了对机器和汇编语言的抽象。其他高级语言提供了更多的抽象。结构化查询语言(structured query language, sql)就是这些抽象之一。世界各地的许多数据建模专家都在使用sql。hadoop非常适合大数据分析。那么,了解sql的广大用户如何利用hadoop在大数据上的计算能力呢?为了编写hadoop的mapreduce程序,用户必须知道可以用来编写hadoop的mapreduce程序的编程语言。
现实世界中的日常问题遵循一定的模式。一些问题在日常生活中很常见,比如数据操作、处理缺失值、数据转换和数据汇总。为这些日常问题编写mapreduce代码对于非程序员来说是一项令人头晕目眩的工作。编写代码来解决问题不是一件很聪明的事情。但是编写具有性能可伸缩性和可扩展性的高效代码是有价值的。考虑到这个问题,apache hive就在facebook开发出来,它可以解决日常问题,而不需要为一般问题编写mapreduce代码。
根据hive wiki的语言,hive是一个基于apache hadoop的数据仓库基础设施。hive有自己的sql方言,称为hive查询语言。它被称为hiveql,有时也称为hql。使用hiveql, hive查询hdfs中的数据。hive不仅运行在hdfs上,还运行在spark和其他大数据框架上,比如apache tez。
hive为hdfs中的结构化数据向用户提供了类似关系数据库管理系统的抽象。您可以创建表并在其上运行类似sql的查询。hive将表模式保存在一些rdbms中。apache derby是apache hive发行版附带的默认rdbms。apache derby完全是用java编写的,是apache license version 2.0附带的开源rdbms。
hiveql命令被转换成hadoop的mapreduce代码,然后在hadoop集群上运行。
了解sql的人可以轻松学习apache hive和hiveql,并且可以在日常的大数据数据分析工作中使用hadoop的存储和计算能力。pyspark sql也支持hiveql。您可以在pyspark sql中运行hiveql命令。除了执行hiveql查询,您还可以直接从hive读取数据到pyspark sql并将结果写入hive
相关链接:
https://cwiki.apache.org/confluence/display/hive/tutorial
4 apache pig介绍
apache pig是一个数据流框架,用于对大量数据执行数据分析。它是由雅虎开发的,并向apache软件基金会开放源代码。它现在可以在apache许可2.0版本下使用。pig编程语言是一种pig拉丁脚本语言。pig松散地连接到hadoop,这意味着我们可以将它连接到hadoop并执行许多分析。但是pig可以与apache tez和apache spark等其他工具一起使用。
apache hive用作报告工具,其中apache pig用于提取、转换和加载(etl)。我们可以使用用户定义函数(udf)扩展pig的功能。用户定义函数可以用多种语言编写,包括java、python、ruby、javascript、groovy和jython。
apache pig使用hdfs读取和存储数据,hadoop的mapreduce执行算法。apache pig在使用hadoop集群方面类似于apache hive。在hadoop上,pig命令首先转换为hadoop的mapreduce代码。然后将它们转换为mapreduce代码,该代码运行在hadoop集群上。
pig最好的部分是对代码进行优化和测试,以处理日常问题。所以用户可以直接安装pig并开始使用它。pig提供了grunt shell来运行交互式的pig命令。因此,任何了解pig latin的人都可以享受hdfs和mapreduce的好处,而不需要了解java或python等高级编程语言。
相关链接
https://en.wikipedia.org/wiki/pig_(programming_tool))
https://cwiki.apache.org/confluence/display/pig/index
5 apache kafka 介绍
apache kafka是一个发布-订阅的分布式消息传递平台。它由linkedin开发,并进一步开源给apache基金会。它是容错的、可伸缩的和快速的。kafka术语中的消息(数据的最小单位)通过kafka服务器从生产者流向消费者,并且可以在稍后的时间被持久化和使用。
kafka提供了一个内置的api,开发人员可以使用它来构建他们的应用程序。接下来我们讨论apache kafka的三个主要组件。
5.1 producer
kafka producer 将消息生成到kafka主题,它可以将数据发布到多个主题。
5.2 broker
这是运行在专用机器上的kafka服务器,消息由producer推送到broker。broker将主题保存在不同的分区中,这些分区被复制到不同的broker以处理错误。它本质上是无状态的,因此使用者必须跟踪它所消费的消息。
5.3 consumer
consumer从kafka代理获取消息。记住,它获取消息。kafka broker不会将消息推送给consumer;相反,consumer从kafka broker中提取数据。consumer订阅kafka broker上的一个或多个主题,并读取消息。broker还跟踪它所使用的所有消息。数据将在broker中保存指定的时间。如果使用者失败,它可以在重新启动后获取数据。
相关链接:
6 apache spark介绍
apache spark是一个通用的分布式编程框架。它被认为非常适合迭代和批处理数据。它是在amp实验室开发的,它提供了一个内存计算框架。它是开源软件。一方面,它最适合批量处理,另一方面,它对实时或接近实时的数据非常有效。机器学习和图形算法本质上是迭代的,这就是spark的神奇之处。根据它的研究论文,它比它的同行hadoop快得多。数据可以缓存在内存中。在迭代算法中缓存中间数据提供了惊人的快速处理。spark可以使用java、scala、python和r进行编程。
如果您认为spark是经过改进的hadoop,在某种程度上,确实是可以这么认为的。因为我们可以在spark中实现mapreduce算法,所以spark使用了hdfs的优点。这意味着它可以从hdfs读取数据并将数据存储到hdfs,而且它可以有效地处理迭代计算,因为数据可以保存在内存中。除了内存计算外,它还适用于交互式数据分析。
还有许多其他库也位于pyspark之上,以便更容易地使用pyspark。下面我们将讨论一些:
- mllib: mllib是pyspark核心的一个包装器,它处理机器学习算法。mllib库提供的机器学习api非常容易使用。mllib支持多种机器学习算法,包括分类、聚类、文本分析等等。
- ml: ml也是一个位于pyspark核心的机器学习库。ml的机器学习api可以用于数据流。
- graphframes: graphframes库提供了一组api,可以使用pyspark core和pyspark sql高效地进行图形分析。
7 pyspark sql介绍
数据科学家处理的大多数数据在本质上要么是结构化的,要么是半结构化的。为了处理结构化和半结构化数据集,pyspark sql模块是该pyspark核心之上的更高级别抽象。我们将在整本书中学习pyspark sql。它内置在pyspark中,这意味着它不需要任何额外的安装。
使用pyspark sql,您可以从许多源读取数据。pyspark sql支持从许多文件格式系统读取,包括文本文件、csv、orc、parquet、json等。您可以从关系数据库管理系统(rdbms)读取数据,如mysql和postgresql。您还可以将分析报告保存到许多系统和文件格式。
7.1 dataframes
dataframes是一种抽象,类似于关系数据库系统中的表。它们由指定的列组成。dataframes是行对象的集合,这些对象在pyspark sql中定义。dataframes也由指定的列对象组成。用户知道表格形式的模式,因此很容易对数据流进行操作。
dataframe 列中的元素将具有相同的数据类型。dataframe 中的行可能由不同数据类型的元素组成。基本数据结构称为弹性分布式数据集(rdd)。数据流是rdd上的包装器。它们是rdd或row对象。
相关链接:
7.2 sparksession
sparksession对象是替换sqlcontext和hivecontext的入口点。为了使pyspark sql代码与以前的版本兼容,sqlcontext和hivecontext将继续在pyspark中运行。在pyspark控制台中,我们获得了sparksession对象。我们可以使用以下代码创建sparksession对象。
为了创建sparksession对象,我们必须导入sparksession,如下所示。
from pyspark.sql import sparksession
导入sparksession后,我们可以使用sparksession.builder进行操作:
spark = sparksession.builder.appname("pythonsqlapp") .getorcreate()
appname函数将设置应用程序的名称。函数的作用是:返回一个现有的sparksession对象。如果不存在sparksession对象,getorcreate()函数将创建一个新对象并返回它。
7.3 structured streaming
我们可以使用结构化流框架(pyspark sql的包装器)进行流数据分析。我们可以使用结构化流以类似的方式对流数据执行分析,就像我们使用pyspark sql对静态数据执行批处理分析一样。正如spark流模块对小批执行流操作一样,结构化流引擎也对小批执行流操作。结构化流最好的部分是它使用了类似于pyspark sql的api。因此,学习曲线很高。对数据流的操作进行优化,并以类似的方式在性能上下文中优化结构化流api。
7.4 catalyst optimizer
sql是一种声明性语言。使用sql,我们告诉sql引擎要做什么。我们不告诉它如何执行任务。类似地,pyspark sql命令不会告诉它如何执行任务。这些命令只告诉它要执行什么。因此,pyspark sql查询在执行任务时需要优化。catalyst优化器在pyspark sql中执行查询优化。pyspark sql查询被转换为低级的弹性分布式数据集(rdd)操作。catalyst优化器首先将pyspark sql查询转换为逻辑计划,然后将此逻辑计划转换为优化的逻辑计划。从这个优化的逻辑计划创建一个物理计划。创建多个物理计划。使用成本分析仪,选择最优的物理方案。最后,创建低层rdd操作代码。
8 集群管理器(cluster managers)
在分布式系统中,作业或应用程序被分成不同的任务,这些任务可以在集群中的不同机器上并行运行。如果机器发生故障,您必须在另一台机器上重新安排任务。
由于资源管理不善,分布式系统通常面临可伸缩性问题。考虑一个已经在集群上运行的作业。另一个人想做另一份工作。第二项工作必须等到第一项工作完成。但是这样我们并没有最优地利用资源。资源管理很容易解释,但是很难在分布式系统上实现。开发集群管理器是为了优化集群资源的管理。有三个集群管理器可用于spark单机、apache mesos和yarn。这些集群管理器最好的部分是,它们在用户和集群之间提供了一个抽象层。由于集群管理器提供的抽象,用户体验就像在一台机器上工作,尽管他们在集群上工作。集群管理器将集群资源调度到正在运行的应用程序。
8.1 单机集群管理器(standalone cluster manager)
apache spark附带一个单机集群管理器。它提供了一个主从架构来激发集群。它是一个只使用spark的集群管理器。您只能使用这个独立的集群管理器运行spark应用程序。它的组件是主组件和工作组件。工人是主过程的奴隶,它是最简单的集群管理器。可以使用spark的sbin目录中的脚本配置spark独立集群管理器。
8.2 apache mesos集群管理器(apache mesos cluster manager)
apache mesos是一个通用的集群管理器。它是在加州大学伯克利分校的amp实验室开发的。apache mesos帮助分布式解决方案有效地扩展。您可以使用mesos在同一个集群上使用不同的框架运行不同的应用程序。来自不同框架的不同应用程序的含义是什么?这意味着您可以在mesos上同时运行hadoop应用程序和spark应用程序。当多个应用程序在mesos上运行时,它们共享集群的资源。apache mesos有两个重要组件:主组件和从组件。这种主从架构类似于spark独立集群管理器。运行在mesos上的应用程序称为框架。奴隶告诉主人作为资源提供的可用资源。从机定期提供资源。主服务器的分配模块决定哪个框架获取资源。
8.3 yarn 集群管理器(yarn cluster manager)
yarn代表着另一个资源谈判者(resource negotiator)。在hadoop 2中引入了yarn来扩展hadoop。资源管理与作业管理分离。分离这两个组件使hadoop的伸缩性更好。yarn的主要成分是资源管理器(resource manager)、应用程序管理器(application master)和节点管理器(node manager)。有一个全局资源管理器,每个集群将运行许多节点管理器。节点管理器是资源管理器的奴隶。调度程序是resourcemanager的组件,它为集群上的不同应用程序分配资源。最棒的部分是,您可以在yarn管理的集群上同时运行spark应用程序和任何其他应用程序,如hadoop或mpi。每个应用程序有一个application master,它处理在分布式系统上并行运行的任务。另外,hadoop和spark有它们自己的applicationmaster。
相关链接:
9 postgresql介绍
关系数据库管理系统在许多组织中仍然非常常见。这里的关系是什么意思?关系表。postgresql是一个关系数据库管理系统。它可以运行在所有主要的操作系统上,比如microsoft windows、基于unix的操作系统、macos x等等。它是一个开源程序,代码在postgresql许可下可用。因此,您可以*地使用它,并根据您的需求进行修改。
postgresql数据库可以通过其他编程语言(如java、perl、python、c和c++)和许多其他语言(通过不同的编程接口)连接。还可以使用与pl/sql类似的过程编程语言pl/pgsql(过程语言/postgresql)对其进行编程。您可以向该数据库添加自定义函数。您可以用c/ c++和其他编程语言编写自定义函数。您还可以使用jdbc连接器从pyspark sql中读取postgresql中的数据。
postgresql遵循acid(atomicity, consistency, isolation and
durability/原子性、一致性、隔离性和持久性)原则。它具有许多特性,其中一些是postgresql独有的。它支持可更新视图、事务完整性、复杂查询、触发器等。postgresql使用多版本并发控制模型进行并发管理。
postgresql得到了广泛的社区支持。postgresql被设计和开发为可扩展的。
相关链接:
https://wiki.postgresql.org/wiki/main_page
https://en.wikipedia.org/wiki/postgresql
https://en.wikipedia.org/wiki/multiversion_concurrency_control
10 mongodb介绍
mongodb是一个基于文档的nosql数据库。它是一个开放源码的分布式数据库,由mongodb公司开发。mongodb是用c++编写的,它是水平伸缩的。许多组织将其用于后端数据库和许多其他用途。
mongodb附带一个mongo shell,这是一个到mongodb服务器的javascript接口。mongo shell可以用来运行查询以及执行管理任务。在mongo shell上,我们也可以运行javascript代码。
使用pyspark sql,我们可以从mongodb读取数据并执行分析。我们也可以写出结果。
相关链接:
11 cassandra介绍
cassandra是开放源码的分布式数据库,附带apache许可证。这是一个由facebook开发的nosql数据库。它是水平可伸缩的,最适合处理结构化数据。它提供了高水平的一致性,并且具有可调的一致性。它没有一个单一的故障点。它使用对等的分布式体系结构在不同的节点上复制数据。节点使用闲话协议交换信息。
相关链接:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: 孔子仅说过的两句脏话,现代人经常用