大数据开发之Spark篇----spark-core入门(2)

RDD Operation

官网阅读

这里我还是先给出RDD Operation的官网地址:http://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds

读取数据

There are two ways to create RDDs: parallelizing an existing collection in your driver program, or referencing a dataset in an external storage system, such as a shared filesystem, HDFS, HBase, or any data source offering a Hadoop InputFormat.
官网所给的信息中提示我们,我们要获取一个RDD可以在driver端中使用parallelize来读取一个序列的数据,或者从一个外部数据源中读取数据。
那如何在driver端获取一个数据呢?

val conf = new Sparkconf()
val sc = new SparkContext(conf)
val rdd = sc.parallelize(Array(1,2,3,4,5,6))

我们通过sc中的parallelize方法来构建一个RDD,而这个方法我们一般将一个数组或者一个集合作为参数传进入。在学习过程我们可以使用这种方法来构建自己的数据,但是我们在生产当中不可能只使用这么一点点的数据吧。所以一般我们都是从一个文件系统中读取一个数据文件来开发的。
所以我们就要使用到下面这个方法来读取外部文件了。

val rdd = sc.textFile("....")

Spark can create distributed datasets from any storage source supported by Hadoop, including your local file system, HDFS, Cassandra, HBase, Amazon S3, etc. Spark supports text files, SequenceFiles, and any other Hadoop InputFormat.
官网中告诉我们,我们可以使用这个方法从本地文件系统当中读取数据文件也可以从共享文件系统当中读取文件,只是我们要明确从不同地方读取数据的些许区别。
如果我们是从本地读取文件的话,我们的写法是:file://…;而如果我们从共享文件系统上读取数据的话,我们的写法是:hdfs://…(这里我只是用HDFS作为例子,如果是其他得文件系统的话,读者可以自行更改)
在这里插入图片描述
我们从源码当中可以看到,这个parallelize方法其实是要传入两个参数的,一个是数据集,一个是确定我们将要为这个RDD构建的分区数。但是numSlices这个参数是存在默认值的,一般是2。
在这里插入图片描述
同理,textFile这个方法也是一样的。其中我们要主要的是,一般情况下如果我们从HDFS上面读取数据的话,那么一个block将对应一个partition,也就是一个文件有多少个block,这个文件的数据进入到Spark中变成rdd后将会有多少个partition了。如果你使用更多的partition的话,在机器性能足够的前提下将会提高并行度。在官网当中,有这么一句话:Note that you cannot have fewer partitions than blocks. 说我们自定义的partition不能少于block的数量,但是这是可以的。但在什么时候使用这种方式,我们以后再说。

对RDD的操作

好了,我们现在已经有数据后,我们要怎么对rdd进行操纵呢?
这里,我们要先了解清楚对rdd的操作分为transformation和action两者。前者是返回值还是一个rdd,所以我们可以将其理解成这是一种rdd的转化操作,并且这是一种惰性操作,就是没有遇到一个action操作时,程序是没有真实操作所有的transformation,只是确定好一种依赖关系。而当执行action操作的时候,程序将会把计算出来的结果返回到driver端,所以一般的action方法都是返回其他的数据类型,而不再是rdd。并且每执行一次action那么就算是一个job,我们可以在Spark的UI界面(4040端口)看到有多少个job和task。

具体的transformations中的算子我们可以在:http://spark.apache.org/docs/latest/rdd-programming-guide.html#transformations这里看到。
而action操作在这里:http://spark.apache.org/docs/latest/rdd-programming-guide.html#actions

这里提示一点:如果我们是从本地文件系统中读取文件的话,同时我们有多个worker节点的话,那么我们必须要保证每个worker节点在相同的路径下都有这个文件。

一次对网站访问次数的统计

代码部分

我们有一个日志表格,每一条日志都是一次对某个域名的访问记录,其中记录了域名,时间,用户等信息。而我们只需要用的域名就好了。

import org.apache.spark.{SparkConf, SparkContext}

object webApp {
  def main(args: Array[String]): Unit = {
    //构建入口点,因为我们是提交到spark-submit上执行,所以这里就没有明文写定master模式和appName了
    val conf = new SparkConf()
    val sc = new SparkContext(conf)
    
    //读取一个文件的数据,文件名作为参数
    val table = sc.textFile(args(0))
    //我们这个表中域名的字段是第一个
    val lines = table.map(_.split("\t")).map(x => (x(0),1))
    val count = lines.reduceByKey(_+_)
    //上面我们已经有了每个字段的点击量的key-value对RDD了,现在我们来进行一次统计
    /**
      * 我来解释下这个方法的参数是什么,我选用了键值对的值进行排序的依据
      * 同时我使用降序的排序方式
      * 并且将partition重新定义为4个
      * 最后我们将这个rdd存储到一个文件中
      */
    count.sortBy(x => x(1),false,4).saveAsTextFile(args(1))
    sc.stop() 
  }
}

提交到spark-submit上运行

使用spark包下bin目录的spark-submit命令来执行,我这里只是使用local模式跑,如果读者要使用yarn模式跑的话,请先启动你机器上yarn的两个进程

$SPARK_HOME/bin/spark-submit \
--master local[2] \
--name webApp \
--class doudou.spark.webApp \
webApp.jar \
hdfs://doudou:8020/user/scala/webInfo hdfs://doudou:8020/user/scala/ouput
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值