Hadoop之spark浅析
Posted 柳小葱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop之spark浅析相关的知识,希望对你有一定的参考价值。
🙀Hive之后,接下来就是Spark,Spark是由Scala语言编写,但是也提供其他语言的API供我们访问,让我们开启python学习spark的第一章👊
1.SparkSession
我们真正开始编写spark应用程序时,需要一种将用户命令和数据发送给spark的方法,我们通过创建一个SparkSession来实现。或者说,SparkSession就是用来控制spark程序的驱动,每一个spark应用程序都需要一个SparkSession与之对应。在Scala和Python中,你启动控制台,这个SparkSession就会被实例化成一个名叫spark的对象。
2.DataFrame
DataFrame大家太熟悉了,在spark中也有这种类型,在spark中dataframe的列和列类型的一些规则被称为模式(schema)。与其它语言中dataframe不一样的是,其他语言的dataframe位于一台计算机上,而spark的dataframe可以跨越数千台计算机。原因是因为数据太大或者数据处理太慢。这里我们创建一个简单的dataframe类型。
#创建一列dataframe列名为num
spdf=spark.range(100).toDF("num")
#显示前10行
spdf.show(10)#这里的show是这真的计算了,我是为了显示效果
结果如下:
3.数据分区
为了使机器能够并行地工作,spark将数据分解成多个数据块,每个数据块叫做一个分区,分区是位于集群中的一台物理机上的多行数据的集合,Dataframe的分区也说明在执行过程中数据在集群中的物理分布。如果只有一个分区,即使拥有数千个执行器,spark也只有一个执行器在处理数据。类似的,如果有多个分区,但只有一个分类器,那么spark仍然只有一个执行器在处理数据,因为只有一个计算资源单位。
在使用dataframe时,大部分情况下你不需要手动操作分区,只需要指定数据的高级转换操作,然后spark决定此工作如何在集群上执行。
4.转换操作
Spark的核心数据结构在计算过程中是保持不变的,这意味着他们在创建之后是无法改变的,无法改变那该如何使用?这就需要你告诉spark如何修改dataframe,此过程被称为转换。
执行这些转化并没有实际输出,这是因为我们仅仅指定了一个抽象转换。我们在调用一个动作之前,spark并不会真的执行转换操作。转换有两种方式:
- 窄依赖:每个输入分区仅仅决定一个输出分区的转换。(内存)
- 宽依赖:每个输入分区决定了多个输出分区,这种操作叫做shuffle。(磁盘)
例如:查找dataframe中所有的偶数
#我们使用上次创建的dataframe
df2=spdf.where("num%2=0")
df2.show(10)#这里的show是这真的计算了,我是为了显示效果
结果如下:
我们这里引出了一个叫做惰性评估的概念:即spark需要等到绝对需要时才执行计算。当用户需要对数据进行操作时,不是立即修改数据,而是建立一个转换计划,spark首先会对这个计划编译成可以在集群中高速运行的流水线式的物理执行计划,然后等待,直到最后时刻才开始执行代码。
5.动作操作
转换操作能够使我们建立逻辑转换计划,为了触发计算,我们需要一个动作操作。最简单的动作操作是count。它计算一个dataframe中的记录总数。这一类的动作有三类:
- 在控制台查看的动作
- 在某个语言中将数据汇集为原生对象的动作
- 写入输出数据源的动作
参考资料
《Hadoop权威指南》
《大数据hadoop3.X分布式处理实战》
《Spark权威指南》
《Pyspark实战》
以上是关于Hadoop之spark浅析的主要内容,如果未能解决你的问题,请参考以下文章