分布式数据集
编辑Spark围绕的核心概念,是弹性分布式数据集(RDD),一个有容错机制,可以被并行操作的集合。目前有两种类型的RDD: 并行集合(Parrallelized Collections),接收一个已经存在的Scala集合,在它上面运行各种并发计算; Hadoop数据集(Hadoop DataSets),在一个文件的每条记录上,运行各种函数。只要文件系统是Hdfs,或者hadoop支持的任意存储系统。这两种RDD都可以通过相同的方式进行操作。
并行集合
并行集合是通过调用SparkContext的parallelize方法,在一个已经存在的Scala集合(只要是seq对象就可以)上创建而来。集合的对象将会被拷贝来创建一个分布式数据集,可以被并行操作。下面通过spark解释器的例子,展示如何从一个数组创建一个并发集合
scala> val data = Array(1, 2, 3, 4, 5)
data: Array[Int] = Array(1, 2, 3, 4, 5)
scala> val distData = sc.parallelize(data)
distData: spark.RDD[Int] = spark.ParallelCollection@10d13e3e
一旦被创建,分布数据集(distData)可以被并行操作。例如,我们可以调用distData.reduce(_ +_) 来将数组的元素相加。我们会在后续的分布式数据集做进一步描述。
创建并行集合的一个重要参数,是slices的数目,它指定了将数据集切分为几份。在集群模式中,Spark将会在一份slice上起一个Task。典型的,你可以在集群中的每个cpu上,起2-4个Slice (也就是每个cpu分配2-4个Task)。一般来说,Spark会尝试根据集群的状况,来自动设定slices的数目。然而,你也可以手动的设置它,通过parallelize方法的第二个参数(例如:sc.parallelize(data, 10)).
Hadoop 数据集
Spark可以创建分布式数据集,从任何存储在HDFS文件系统或者Hadoop支持的其它文件系统(包括本地文件,Amazon S3, Hypertable, HBase等等)上的文件。 Spark可以支持Text File, SequenceFiles 及其它任何Hadoop输入格式
文本文件的RDDs可以通过SparkContext的textFile方法创建,该方法接受文件的URI地址(或者机器上的文件本地路径,或者一个hdfs://, sdn://,kfs://,其它URI).这里是一个调用例子:
scala> val distFile = sc.textFile(“data.txt”)
distFile: spark.RDD[String] = spark.HadoopRDD@1d4cee08
一旦被创建,distFile可以进行数据集操作。例如,我们可以使用如下的map和reduce操作将所有行数的长度相加:
distFile.map(_.size).reduce(_ + _ )
方法也接受可选的第二参数,来控制文件的分片数目。默认来说,Spark为每一块文件创建一个分片(HDFS默认的块大小为64MB),但是你可以通过传入一个更大的值来指定更多的分片。注意,你不能指定一个比块个数更少的片值(和hadoop中,Map数不能小于Block数一样)
对于SequenceFiles,使用SparkContext的sequenceFile[K, V]方法,K和V是文件中的key和values类型。他们必须是Hadoop的Writable的子类,例如IntWritable和Text。另外,Spark允许你指定几种原生的通用Writable类型,例如:sequencFile[Int, String]会自动读取IntWritable和Texts
最后,对于其他类型的Hadoop输入格式,你可以使用SparkContext.hadoopRDD方法,它可以接收任意类型的JobConf和输入格式类,键类型和值类型。按照对Hadoop作业一样的方法,来设置输入源就可以了。