简单介绍第一个程序"Hello World!",就是存储于HDFS的Log文件中计算出"Hello World!"的行数,存储路径为hdfs://root/Log,计算代码如下:
1
2
3
4
5
|
var
sc
=
new
SparkContext(
"spark://localhost:6030"
,
"Hello world!"
,
"YOUR_SPARK_HOME"
,
"YOUR_APP_JAR"
)
var
file
=
sc.textFile(
"hdfs:root/Log"
)
var
filterRDD
=
file.filter(
_
.contains(
"Hello World!"
))
filterRDD.cache()
filterRDD.count()
|
行1对于所有的Spark的程序而言,要进行任何操作前需要创建一个Spark的上下文,在创建上下文的过程中,程序会向集群申请资源以及构建相应的运行环境。一般来说,创建SparkContext对象需要传入四个变量如下:
1
2
3
4
|
1
、变量就是Spark程序运行的集群地址,如“spark
:
//localhost:6030”(假设集群在本地启动监听6030端口);
2
、参数是Spark程序的标识;
3
、参数需要指明Spark安装的路径;
4
、参数需要传入Spark程序的jar包路径。
|
行2通过sc变量利用textFile接口从HDFS文件系统中读取Log文件,返回一个变量file。
行3对于file变量进行过滤操作,传入的参数是一个function对象,function的原型p:(A) => Boolean,对于file中的每行字符串判断是否含有“Hello World!”字符串的文本行数。
行4对filterRdd进行cache操作,以便后续操作重用filterRdd此变量。
行5对filterRdd进行count计数曹总,最后返回包含“Hello World!”字符串的文本行数。
此五行代码涉及了Spark重要的概念,如下:
1、弹性分布式数据集RDD(Resilient Distributed DataSets);
2、创建操作(creation operation):RDD的初始创建都是由SparkContext来负责的,将内存中的集合或者外部文件系统作为输入源;
3、转换操作(transformation operation):将一个RDD通过一定的操作变换成另一个RDD,如file这个RDD通过一个filter操作变换成filterRDD,因此filter就是一个转换操作;
4、控制操作(control operation):对RDD进行持久化,可以让RDD保存在磁盘或者内存中,以便后续重复使用。如cache接口默认将filterRDD缓存在内存中;
5、行动操作(action operation):由于Spark是惰性计算(lazy computing)的,所以对于任何RDD进行行动操作,都会触发Spark作业的运行,从而产生最终的结果。如我们队filterRDD进行的count操作就是一个行动操作。
Spark中的行动操作基本分为两类,一类操作结果变为Scala集合或者标量,另一个就是将RDD报错到外部文件或者数据库中。
转载地址:http://blog.yoodb.com/yoodb/article/detail/216