RDD编程指引(一)(部分翻译Spark官网文章RDD Programming Guide)

本人刚开始入门学习Spark,打算先将Spark文档看一遍,顺便做点笔记,就进行一些翻译和记录。由于本人只会python,所以翻译都是以python部分代码进行。以下并非完全100%官网翻译,更多是个人理解+笔记+部分个人认为重要的内容的翻译,新手作品,请各位大神多多指正。
官网原文链接:http://spark.apache.org/docs/latest/rdd-programming-guide.html

Overview(综述)


从高层面来看,每一个spark应用包含了一个运行用户main函数的驱动程序以及在集群中的各种并行操作。
RDD,resilient distributed dataset,弹性分布式数据集,spark的主要抽象,能够在集群中被分区进行并行运算的元素集合。可以通过hadoop文件系统(或者hadoop支持的文件系统)或者是scala集合转换而来。用户能够让RDD保留在内存中,以便让其在并行操作中多次重复使用。最后RDD还支持故障恢复。

第二个抽象,shared variables,共享变量,其能够在不同任务和程序间共享。类型一:广播变量,broadcast variables,能够在集群所有节点内存中缓存。类型二:累加器,accumulators,用于累加和计数。

Linking with Spark(连接到spark)


可以通过pip安装pyspark或直接在shell中运行Pyspark(需要配置$SPARKHOME),也可以通过spark-submit直接提交py应用。

如果需要在Python中直接引用,首先需要通过pip安装pyspark(python3.x则用pip3安装),同时配置好PYSPARK_PYTHON路径。例如我的MacOs的python3路径配置为

export PYSPARK_PYTHON=/usr/local/bin/python3

上述配置好以后,就可以导入SparkContext, SparkConf了

from pyspark import SparkContext, SparkConf

Initializing Spark(初始化)


首先需要创建一个SparkContext对象,告知spark如何访问集群。在创建SparkContext之前,首先需要创建SparkConf对象

conf = SparkConf().setAppName(appName).setMaster(master)
sc = SparkContext(conf=conf)

其中appName为在clusterUI显示的应用名字,例如为’myapp’,master可以为spark,Mesos,YARN集群的URL,本地测试最简单的可以为’local’。

Using the Shell(使用shell)


如果想在PySpark交互式 shell中进行应用开发,就需要先配置好SPARK_HOME。
PySpark已经默认创建好sc,不需要重新创建。
可以通过下面命令启动pyspark

./bin/pyspark --master local[4]

Resilient Distributed Datasets (RDDs)

有两种方式获取RDD:并行化处理已有的collection,或者引用外部数据源创建,例如共享文件系统,HDFS, HBase,或者任何能够提供hadoop输入格式的数据源。

Parallelized Collections(支持并行的数据集)

通过在collection调用SparkContext’s parallelize方法,将collection的元素拷贝到分布式数据集中

data = [1, 2, 3, 4, 5]
distData = sc.parallelize(data)

distDate就是一个RDD,可以进行RDD的转换操作和处理动作

默认情况下,spark对于一个partition会运行一个任务,每个CPU承担2-4个分区任务。一般情况下,spark可以自动设置partition数量。

External Datasets(外部数据集)

hadoop支持的外部数据源,spark都支持,例如本地文件,HDFS, Cassandra, HBase, Amazon S3等。也支持text文件,序列文件等。

textfile可以通过SparkContext’s textFile方法创建RDD。方法接受一个URL,可以是本地文件路径,也可以是hdfs://,s3a://等

>>> distFile = sc.textFile("data.txt")

读取文件注意事项:

  1. 如果采用本地文件路径,需要确保worker通过相同的文件路径能够访问该文件,你需要将文件都拷贝到各个worker相同路径下。或者采用NFS的方式确保能够共同访问。
  2. spark基于文件的输入方法,能够运用在目录,压缩文件,以及使用通配符。
  3. textfile方法也支持设置第二个参数,控制partition的数量。默认情况下,spark为一个block(hadoop hdfs默认的128M)配置一个partition,也可以配置更多的partititon数量。但partition数量不能少于block数量。

另外,spark api还支持其他几种数据格式:

  1. SparkContext.wholeTextFiles ,能够读取包含多个小文件的文件夹,返回(文件名,内容)的键值对。对于textfile来说,则返回文件中的每行,对应一对记录
  2. RDD.saveAsPickleFile and SparkContext.pickleFile,将包含着python对象的RDD存储起来,通过批处理程序处理pickle序列化
  3. 序列文件以及hadoop输入输出格式(实验功能,后续可能会在spark sql实现)

Writable Support

pyspark序列化文件支持将RDD的java的K-V对,转换为可读写的java类型,并用Pyrolite来对java对象进行pickle(pickle为Python的序列化叫法)。逆过程为,unpickle python对象为java类型,在转换为writable。但arrays对象需要进行自行转换。

Saving and Loading SequenceFiles

序列化文件能够被保存和读取,key和value 类都可以指定,但对于标准writable来说就没有必要

>>> rdd = sc.parallelize(range(1, 4)).map(lambda x: (x, "a" * x))
>>> rdd.saveAsSequenceFile("path/to/file")
>>> sorted(sc.sequenceFile("path/to/file").collect())
[(1, u'a'), (2, u'aa'), (3, u'aaa')]

Saving and Loading Other Hadoop Input/Output Formats

pyspark支持读取hadoop 输入格式或者写入hadoop输出格式,hadoop配置可以传递至python字典。

$ ./bin/pyspark --jars /path/to/elasticsearch-hadoop.jar
>>> conf = {"es.resource" : "index/type"}  # assume Elasticsearch is running on localhost defaults
>>> rdd = sc.newAPIHadoopRDD("org.elasticsearch.hadoop.mr.EsInputFormat",
                             "org.apache.hadoop.io.NullWritable",
                             "org.elasticsearch.hadoop.mr.LinkedMapWritable",
                             conf=conf)
>>> rdd.first()  # the result is a MapWritable that is converted to a Python dict
(u'Elasticsearch ID',
 {u'field1': True,
  u'field2': u'Some Text',
  u'field3': 12345})

对于某些二进制序列化数据(例如Cassandra / HBase),就必须先通过java/scale转换为pyrolite的picker可以处理的对象。

个人原创,欢迎转载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark Streaming RDD 编程主要涉及到以下几个方面: 1. 创建 StreamingContext 对象:首先需要创建一个 StreamingContext 对象,设置应用程序名称、批处理间隔等参数。 ```scala val conf = new SparkConf().setAppName("Streaming example") val ssc = new StreamingContext(conf, Seconds(1)) ``` 2. 创建输入 DStream:使用 StreamingContext 对象创建一个输入 DStream。这个 DStream 可以从多个数据源创建,如 Kafka、Flume、Kinesis、HDFS 等。 ```scala val lines = ssc.socketTextStream("localhost", 9999) ``` 3. 转换操作:通过对输入 DStream 进行一系列转换操作,得到需要的结果。转换操作包括 map、filter、reduceByKey、window 等。 ```scala val words = lines.flatMap(_.split(" ")) val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _) ``` 4. 输出操作:对转换后的 DStream 进行输出操作,输出结果可以写入 HDFS、Kafka、Cassandra 等存储系统,或者直接打印在控制台。 ```scala wordCounts.print() ``` 5. 启动 StreamingContext:最后需要启动 StreamingContext,并等待程序运行结束。 ```scala ssc.start() ssc.awaitTermination() ``` 完整的 Spark Streaming RDD 编程示例代码如下: ```scala import org.apache.spark.SparkConf import org.apache.spark.streaming.{Seconds, StreamingContext} object SparkStreamingRDD { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("Streaming example") val ssc = new StreamingContext(conf, Seconds(1)) val lines = ssc.socketTextStream("localhost", 9999) val words = lines.flatMap(_.split(" ")) val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _) wordCounts.print() ssc.start() ssc.awaitTermination() } } ``` 这个例子从本地 9999 端口读取输入数据,将输入数据拆分成单词,并计算每个单词出现的次数。最后将结果打印在控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值