本文主要是介绍Spark官方文档-SparkCore,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
快速开始
RDD
1.Spark 的主要抽象是一个分布式弹性数据集(RDD),可以从 Hadoop InputFormats(例如 HDFS 文件)或通过转换其他RDD来创建RDD。
val textFile = spark.read.textFile("README.md")
2.可以通过调用某些操作直接从 RDD中获取值,或者转换RDD以获得新的值
textFile.count()
textFile.first() // First item in this Dataset
3.将此数据集转换为新的数据集。我们调用filter
返回一个包含文件中RDD子集的新数据集。
val linesWithSpark = textFile.filter(line => line.contains("Spark"))
更多关于数据集操作
1.找到单词最多的那一行:
先计算每行单词数;reduce
在该数据集上调用以查找最大字数;
textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
textFile.map(line => line.split(" ").size).reduce((a, b) => Math.max(a, b))
RDD
初始化 Spark
Spark 程序必须做的第一件事是创建一个SparkContext对象,它告诉 Spark 如何访问集群。要创建一个,SparkContext
您首先需要构建一个SparkConf对象,该对象包含有关您的应用程序的信息。每个 JVM 应该只有一个 SparkContext 处于活动状态。stop()
在创建新的之前,您必须激活 SparkContext。
val conf = new SparkConf().setAppName(appName).setMaster(master)
new SparkContext(conf)
该appName
参数是您的应用程序在集群 UI 上显示的名称。 master
是一个Spark、Mesos 或 YARN 集群 URL,或者一个特殊的“本地”字符串以在本地模式下运行。
Using the Shell
$ ./bin/spark-shell --master local[4] --jars code.jar
弹性分布式数据集 (RDD)
Spark 围绕弹性分布式数据集(RDD)的概念展开,RDD 是可以并行操作的元素的容错集合。
有两种方法可以创建 RDD: 在驱动程序中并行化现有集合,或引用外部存储系统中的数据集,例如共享文件系统、HDFS、HBase 或任何提供 Hadoop InputFormat 的数据源。
并行集合
并行化集合是通过在驱动程序(Scala )中的现有集合上调用SparkContext
的parallelize
方法来创建的Seq
。集合的元素被复制以形成可以并行操作的分布式数据集。例如,这里是如何创建一个包含数字 1 到 5 的并行化集合:
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
创建后,distData
可以并行操作分布式数据集 ( )。例如,我们可能会调用distData.reduce((a, b) => a + b)
将数组的元素相加。稍后我们将描述分布式数据集上的操作。
并行集合的一个重要参数是将数据集切割成的分区数。Spark 将为集群的每个分区运行一个任务。通常,集群中的每个 CPU 需要 2-4 个分区。通常,Spark 会尝试根据您的集群自动设置分区数。但是,您也可以通过将其作为第二个参数传递给parallelize
(例如sc.parallelize(data, 10)
)来手动设置它。注意:代码中的某些地方使用术语切片(分区的同义词)来保持向后兼容性。
外部数据集
Spark 可以从 Hadoop 支持的任何存储源创建分布式数据集,包括本地文件系统、HDFS、Cassandra、HBase、Amazon S3等。Spark 支持文本文件、SequenceFiles和任何其他 Hadoop InputFormat。
可以使用SparkContext
的textFile
方法创建文本文件 RDD 。此方法需要一个URI的文件(本地路径的机器上,或一个hdfs://
,s3a://
等URI),并读取其作为行的集合。这是一个示例调用:
val distFile = sc.textFile("data.txt")
使用 Spark 读取文件的一些注意事项:
-
如果使用本地文件系统上的路径,则该文件也必须可以在所有工作节点上的相同路径上访问。要么将文件复制到所有工作节点,要么使用网络安装的共享文件系统。
-
Spark 的所有基于文件的输入方法,包括
textFile
,都支持在目录、压缩文件和通配符上运行。例如,你可以使用textFile("/my/directory")
,textFile("/my/directory/*.txt")
和textFile("/my/directory/*.gz")
。当读取多个文件时,分区的顺序取决于文件从文件系统返回的顺序。例如,它可能会也可能不会遵循文件的字典顺序(按路径)。在分区内,元素根据它们在底层文件中的顺序进行排序。 -
该
textFile
方法还采用可选的第二个参数来控制文件的分区数。默认情况下,Spark 为文件的每个块创建一个分区(在 HDFS 中默认块为 128MB),但您也可以通过传递更大的值来请求更多的分区。请注意,分区数不能少于块数。
除了文本文件,Spark 的 Scala API 还支持其他几种数据格式:
-
SparkContext.wholeTextFiles
允许您读取包含多个小文本文件的目录,并将每个文件作为(文件名、内容)的二元组对返回。与textFile
对比,后者将在每个文件中的每行的一条记录返回。分区由数据本地性决定,在某些情况下,这可能导致分区太少(本地数据较少)。对于这些情况,wholeTextFiles
提供可选的第二个参数来控制最小分区数。 -
对于SequenceFiles(K,V存储格式的文件),使用 SparkContext 的
sequenceFile[K, V]
方法,其中K
和V
是文件中键和值的类型。这些应该是 Hadoop 的Writable接口的子类,如IntWritable和Text。此外,Spark 允许您为一些常见的 Writable 指定基础类型;例如,sequenceFile[Int, String]
会自动读取 IntWritables 和 Texts。 -
对于其他 Hadoop InputFormats,您可以使用该
SparkContext.hadoopRDD
方法,该方法采用任意JobConf
输入格式类、键类和值类。以与使用输入源的 Hadoop 作业相同的方式设置这些。您还可以使用SparkContext.newAPIHadoopRDD
基于“新”MapReduce API (org.apache.hadoop.mapreduce
) 的InputFormats 。 -
RDD.saveAsObjectFile
和SparkContext.objectFile
支持,用序列化的 Java 对象,这种简单格式来组成RDD,并用来保存RDD。虽然这不如 Avro 之类的专用格式有效,但它提供了一种保存任何 RDD 的简单方法。
RDD 操作
RDD 支持两种类型的操作:
transforms(转换)它从现有的数据集创建一个新的数据集,
actions(行动),它在对数据集运行
这篇关于Spark官方文档-SparkCore的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!