spark core基础

Spark是一个很有意思的东西.今天花了一些时间整理了最近的笔记,在这里也贴出来.再过两天就该走了.比较期待在北京的日子.

Spark-Shell常用

启动:

 ./bin/spark-shell
 ./bin/spark-shell --master
 ./bin/spark-shell --master local[2] //使用2个CPU核运行
 ./bin/spark-shell --master local[2] --jar testcode.jar 
 //指定Jar包路径,可以用逗号分割,添加多个包
[会自动创建一个SparkContext对象(sc)]

加载文件:
创建sc后,可以加载本地文件创建RDD,返回一个MapPartitionRDD

val textFile=sc.textFile("file:///home/hadoop/read.txt")
[hdfs://hadoop:9000/datas/]

Transformation操作:
textFile.first()
textFile.count()
val textRDD=textRDD.filter(line=>line.contains("spark"))
textFile.filter(line=>line.contatins("spark")).count()
textFile.filter(line=>line.split(" ").size).reduce((a,b)=>if(a>b)a else b)
[词频统计]
val wordcount=textFile.flatMap(line=>line.split(" ")).map(word=>(word,1)).reduceByKey((x,y)=>x+y)
wordcount.collect()
[升级版]
val wordcount=textFile.flatMap(_.split(" ")).map(_.1).reduceByKey(_+_).map(m=>(m._2,M._1)).sortByKey(false).map(m=>(m._2,m._1))
[sortByKey 按key进行排序,false为降序]
wordcount.savaAsTextFile("hdfs://hadoop:9000/out/wc.txt")
[保存结果,支持将结果缓存在内存中]
textFile.cache() //缓存
[spark版的wordcount]
package sparkDemo1
import org.apache.spark.{SparkContext, SparkConf}
/**
 * Created by yxy on 2017/2/1 0001.
 */
object wordcount {
  def main(args: Array[String]) {
    val conf=new SparkConf().setAppName("wordcount").setMaster("local")
    val sc=new SparkContext(conf)
    val data=sc.textFile("file:///home/yxy/datas/read.md")
    val words=data.flatMap(_.split(" "))
      .map(word=>(word,1))
      .reduceByKey(_+_)
    .saveAsTextFile("hdfs://hadoop:9000/out/data/word.txt")
  }
}

spark部署模式
本地模式:
standalone独立模式:spark自己管理集群资源.只需要 HDFS启动
**YRAN模式:**spark自己不管理资源,而是向yarn申请.

IDEA中生成Jar包,使用IDEA编译class文件,同时将class打包成Jar文件。

1.File——Project Structure,弹性“Project Structure”的设置对话框
2.选择左边的Artifacts,点击上方的“+”按钮
3.在弹出的对话框中选择“Jar”——“from moduls with dependencies”
4.选择要启动的类,然后确定
5.应用之后选择菜单“Build”——“Build Artifacts”,选择“Build”或“Rebuild”即可生成


RDD弹性分布式数据集

RDD是spark提供的核心抽象.(resillient distributed dataset)即弹性分布式数据集.
RDD在抽象上来说是一种元素集合.包含了数据.它是被分区的,每个分区分布在集群的不同节点上,从而让RDD中的数据可以被并行操作.

RDD最重要的特性是提供了不错的容错性.可以自动从节点失败中恢复过来.

RDD的数据默认是存放在内存中的,但内存资源不足时候,也会自动将RDD写入磁盘.

一个RDD对象包含如下5个核心特性:

一个分区列表:每个分区里是RDD的一部分数据
一个计算函数,用于计算RDD各分区的值
一个依赖列表,存储依赖它的其他RDD
一个分区器(可选),用于键值类型的RDD
一个计算各分区时优先的位置列表(可选)


创建RDD
初始化RDD,该RDD通常也包含了输入的源数据,创建了初始RDD后,才可进行接下来的操作.

三种创建方式:

使用程序中的集合创建RDD
使用本地文件创建RDD或者HDFS文件创建RDD
RDD通过其他算子形成新的RDD

使用程序中的集合创建RDD,主要用于进行测试,可以在实际部署到集群运行之前,自己使用集合构造测试数据,来测试后面的Spark应用的流程。
使用本地文件创建RDD,主要用于临时性地处理一些存储了大量数据的文件。
使用HDFS文件创建RDD,应该是最常用的生产环境处理方式,主要可以针对HDFS上存储的大数据,进行离线批处理操作


使用集合创建RDD
[parallelize]
import org.apache.spark.{SparkContext, SparkConf}

/**
 * Created by yxy on 2017/2/1 0001.
 */
object creatDemos {
  def main(args: Array[String]) {
    val arr=Array(1,2,3,4,5,6)
    val conf=new SparkConf().setAppName("ceshi").setMaster("local")
    val sc=new SparkContext(conf)
    val rdd=sc.parallelize(arr)
     rdd.map(m=>{
       m+2
     })
    .foreach(println(_))
  }
}

使用文件创建RDD

Spark是支持使用任何Hadoop支持的存储系统上的文件创建RDD的,比如说HDFS、Cassandra、HBase以及本地文件。
通过调用SparkContext的textFile()方法,可以针对本地文件或HDFS文件创建RDD。
有几个事项是需要注意的:
如果是针对本地文件的话,如果是在windows上本地测试,windows上有一份文件即可;如果是在spark集群上针对linux本地文件,那么需要将文件拷贝到所有worker节点上。
Spark的textFile()方法支持针对目录、压缩文件以及通配符进行RDD创建。
Spark默认会为hdfs文件的每一个block创建一个partition,但是也可以通过textFile()的第二个参数手动设置分区数量,只能比block数量多,不能比block数量少。

文件字数统计
val rdd = sc.textFile("data.txt")
val wordCount = rdd.map(line => line.length).reduce(_ + _)

Spark的textFile()除了可以针对上述几种普通的文件创建RDD之外,还有一些特列
的方法来创建RDD:

SparkContext.wholeTextFiles()方法,可以针对一个目录中的大量小文件,返回

map
将RDD中的每个元素传入自定义函数,获取一个新的元素,然后用新的元素组成新的RDD

filter 
对RDD中每个元素进行判断,如果返回true则保留,返回false则剔除。

flatMap 
与map类似,但是对每个元素都可以返回一个或多个新元素。

gropuByKey 
根据key进行分组,每个key对应一个Iterable<value>

reduceByKey 
对每个key对应的value进行reduce操作。

sortByKey 
对每个key对应的value进行排序操作。

join
对两个包含<key,value>对的RDD进行join操作,每个key join上的pair,都会传入自定义函数进行处理。

cogroup
 同join,但是是每个key对应的Iterable<value>都会传入自定义函数进行处理。

常用action算子

reduce
将RDD中的所有元素进行聚合操作。第一个和第二个元素聚合,值与第三个元素聚合,值与第四个元素聚合,以此类推。

collect 将RDD中所有元素获取到本地客户端。

count 获取RDD元素总数。

take(n) 获取RDD中前n个元素。

saveAsTextFile 将RDD元素保存到文件中,对每个元素调用toString方法

countByKey 对每个key对应的值进行count计数。

foreach 遍历RDD中的每个元素。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白日与明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值