其他分享
首页 > 其他分享> > 来点八股文(一) 分布式理论及应用

来点八股文(一) 分布式理论及应用

作者:互联网

6.824和Hadoop技术资料整理,持续更新中

文章目录

6.824

WHILE TRUE:
    IF CREATE("f", data, ephemeral=TRUE): RETURN
    IF EXIST("f", watch=TRUE):
        WAIT

将exist函数加上watch=true来监测文件的删除

CREATE("f", data, sequential=TRUE, ephemeral=TRUE)
WHILE TRUE:
    LIST("f*")
    IF NO LOWER #FILE: RETURN
    IF EXIST(NEXT LOWER #FILE, watch=TRUE):
        WAIT
     val lines = spark.read.textFile("in").rdd
     //map并转换tuple
     val links1 = lines.map{ s =>
       val parts = s.split("\\s+")
       (parts(0), parts(1))
     }
     //去重
     val links2 = links1.distinct()
     //
     val links3 = links2.groupByKey()
     val links4 = links3.cache()
     var ranks = links4.mapValues(v => 1.0)

     for (i <- 1 to 10) {
           val jj = links4.join(ranks)
           val contribs = jj.values.flatMap{
                case (urls, rank) =>
                urls.map(url => (url, rank / urls.size))
            }
            ranks = contribs.reduceByKey(_ + _).mapValues(0.15 + 0.85 * _)
    }

     val output = ranks.collect()
     output.foreach(tup => println(s"${tup._1} has rank:  ${tup._2} ."))

Spark

架构

  1. 内部创建:parallelize() makeRDD(数据,分区数量)
  2. 文件创建:textFile() wholeTextFile()(读取结果是一个元组,包括文件路径,文件内容)

RDD算子

转换算子

RDD之间转换
map() 类型或值的映射转换 对于单个分区内执行是有序的,不同分区是无序的,对每一个分区的每一个数据每次运行一次
map后的元素数量不会改变
mapPartitions() 类型或值的映射转换 取出单个分区的所有数据之后,进行转换 存在对象的引用,不能用于内存较小的情况
可以增减元素个数,传递一个迭代器并且返回一个迭代器
mapPartitionsWithIndex() 对特定分区做操作,参数为迭代器以及分区数
flatMap() 对每个元素进行操作之后扁平化,进行操作之后的结果只要是可以迭代的集合即可
glom() 将同一分区的数据转换为内存进行处理
groupby()会将数据会被打乱重新组合,一个组的数据放在同一个分区中,称之为shuffle
filter() 数据过滤
sample
从数据源中抽取数据
参数(是否放回,每条数据可能被抽取的概率,种子)
distinct
去重
coalesce
用于缩减数据后,减少分区数量
第二个参数是shuffle,用于将分区数据打乱重新组合
repartition
扩大分区
相当于更大的coalesce+shuffle
mkstring 将集合转化为字符串
交集,并集,补集
拉链(产生两个数据的区间)
reducebykey
分组后,对kv两两聚合
存在shuffle,能够预聚合,性能较高
经过预聚合(shuffle之前在内存中聚合),之后shuffle能够提高性能
groupbykey
只能分组,不能聚合
也存在shuffle,不能预聚合,性能较低
aggregatebykey
柯里化函数
用于界定分区内和分区间不同的数据
第一个参数列表:
当碰见第一个key的时候,和value做分区内计算
第二个参数列表:
第一个参数表示分区内计算规则,第二个参数表示分区间计算规则
foldbykey
柯里化函数
用于分区内和分区间相同时计算
combinebykey
三个参数,第一个用于类型转换
join leftjoin rightjoin
将相同key的value结合成tuple
不交的key去掉
多个相同,两两匹配
cogroup
先分组再连接

执行算子

collect()方法
reduce
collect
会将不同分区的数据按照分区顺序采集到driver内存中
count
数据源中数据的数量
first
数据源中数据的第一个
take
取n个数据
aggregate
定义分区内和分区间计算并且获取值
foreach
发送给executor端执行
注意此处有序列化的问题,要使用kryo进行轻量级序列化

rdd容错机制?
rdd记录算子操作的关系并且保存起来,用于数据容错和恢复

rdd依赖分类?
宽依赖(shuffle依赖)
窄依赖(onetoone依赖)

窄依赖时分区数=任务数
宽依赖时任务数=操作数*分区数

application
job:一个action算子就会生成一个job
stage:stage等于宽依赖(shuffle次数)的个数+1
task:一个stage中最后一个rdd分区的个数就是task

SparkSQL

标签:事务,副本,八股文,log,应用,服务器,spark,数据,分布式
来源: https://blog.csdn.net/treblez/article/details/122660888