• spark杂记2


    #######################################################
    Ctrl+Alt+T:生成try catch

    Ctrl+N:查找类(enter class name);Ctrl+shift+N:查找文件(enter file name);Ctrl+shift+alt+N:查找文件(enter file name);

    Ctrl + F:当前文件查找特定文字、代码等内容

    Ctrl + shift + F:当前项目中查找特定的文字、代码等内容。(edit—find—find in path)
    #######################################################
    spark[源码]-sparkContext详解[一]
    https://www.cnblogs.com/chushiyaoyue/p/7468952.html


    Spark :Master、Worker、Driver、Executor工作流程详解
    https://blog.csdn.net/weixin_38750084/article/details/83025172

    大量数据去重:Bitmap和布隆过滤器(Bloom Filter)
    https://blog.csdn.net/zdxiq000/article/details/57626464
    BloomFilter(大数据去重)+Redis(持久化)策略
    https://blog.csdn.net/qq_18495465/article/details/78500472

    Spark核心技术原理透视一(Spark运行原理)
    https://www.jianshu.com/p/1b5f97d5a22a

    Spark 核心篇-SparkContext
    https://www.cnblogs.com/xia520pi/p/8609602.html

    大数据技术,Spark核心技术之运行原理
    https://blog.51cto.com/13854477/2347535?source=dra

    Spark基本架构及运行原理
    https://blog.csdn.net/zxc123e/article/details/79912343

    Spark运行原理【史上最详细】
    https://blog.csdn.net/lovechendongxing/article/details/81746988

    Spark Mllib
    https://www.cnblogs.com/dadadechengzi/p/6993757.html

    Spark MLlib机器学习算法、源码及实战详解 书籍及代码.zip
    https://download.csdn.net/download/zjm362/10205368


    基于spark和sparkstreaming的word2vec
    https://www.cnblogs.com/ulysses-you/p/6863585.html


    基于spark word2vec实践
    https://blog.csdn.net/hjj974834257/article/details/79089686

    word2vec学习 spark版
    https://www.cnblogs.com/aezero/p/4586605.html

    spark Word2Vec+LSH相似文本推荐(scala)
    https://blog.csdn.net/u013090676/article/details/82716911

    Spark MLlib 机器学习
    https://www.cnblogs.com/swordfall/p/9456222.html

    http://www.r66r.net/(hadoop笔记本【真心赞】)
    http://leezk.com/  (有推荐书籍和一些不错的文章)

    #######################################################
    RDD(Resilient Distributed Datasets)弹性分布式数据集:
        分区,只读,不可变,并行

        RDD[T]
        RDD[(t,s)]

    有向无环图(DAG)

    窄依赖:一个父分区只有一个子分区(可以多个父对应一个子)
    宽依赖:一个父分区有多个子分区
    Shuffle:含义就是洗牌,将数据打散,父RDD一个分区中的数据如果给了子RDD的多个分区(只要存在这种可能),就是shuffle。Shuffle会有网络传输数据,但是有网络传输,并不意味着就是shuffle。

    join可能是宽依赖也可能是窄依赖

    #######################################################
    sparkContext构建的顶级三大核心:
        ①DAGScheduler:面向Job的Stage的高层调度器   
        ②TaskScheduler:一个接口,是低层调度器,根据具体的ClusterManager的不同会有不同的实现。Standalone模式下具体实现的是TaskSchedulerlmpl  
        ③SchedulerBackend:一个接口,根据具体的ClusterManger的不同会有不同的实现,Standalone模式下具体的实现是SparkDeloySchedulerBackend



    #######################################################
    transformation/转换

    action/行动




    #######################################################
    ################面试题总结##########################
    1.rdd有几种操作类型?
        ①transformation 转换操作 (rdd →rdd)
        ②action 行动操作 (rdd →结果集)
        ③controller 控制算子 (对性能效率和容错方面的支持:persist,cache,checkpoint)

    2.宽窄依赖的区别?
        宽依赖:多个子RDD的Partition会依赖同一个父RDD的Partition
        窄依赖:每一个父RDD的Partition最多被子RDD的一个Partition使用

    3.cache和persist的区别?
        cache:缓存数据,默认是缓存在内存中,本质是调用persist
        persist:缓存数据,可以指定缓存策略(MEMORY_ONLY,MEMORY_AND_DISK,等等)

    4.spark的有几种部署模式?
        ①本地模式
        ②standalone模式
        ③spark on yarn模式:
            分布式部署集群,资源和任务监控交给yarn管理,cluster和client
        ④mesos模式:
            粗粒度模式(Coarse-grained Mode)
            细粒度模式(Fine-grained Mode)

    5.Spark为什么比mapreduce快?
        ①基于内存计算,减少低效的磁盘交互;
        ②高效的调度算法,基于DAG;
        ③容错机制Linage;


    6.spark有哪些组件?
        ①master:管理集群和节点,不参与计算
        ②worker:计算节点,进程本身不参与计算,和master汇报
        ③Driver:运行程序的main方法,创建sparkContext对象
        ④sparkContext: 控制整个Application的生命周期,包括dagscheduler和taskscheduler
        ⑤client:客户端,用户提交程序的入口
        ⑥Executor:执行器,在worker上执行任务的组件,用于启动线程池运行任务
        ⑦RDD: spark基本计算单元
        ⑧DAG Scheduler: 根据job构建基于stage的DAG,并提交stage给TaskScheduler
        ⑨TaskScheduler: 将任务(task)分发给Executor
        ⑩SparkEnv: 线程级别的上下文,存储运行时的重要组件的引用
        (11)BlockManager:负责存储管理,创建和查找块
        (12)SparkConf:负责存储配置信息




    ################面试题总结##########################
    #######################################################


    #######################################################
    ################hbase##########################
    hbase(main):005:0> scan 'label_event_index_table',{LIMIT=>1}
    ROW                                   COLUMN+CELL
     10H20190701101233N0                  column=6:1092078ccf0604e3b49abfdfb2b5b46d681, timestamp=1561947156974, value=0.027:1:1561614000000:1092078ccf
                                          0604e3b49abfdfb2b5b46d681:6:{"sourceIDName":"109_|_|YesxE5xA8xB1xE4xB9x90xE7x8ExB0xE5x9CxBA","org
                                          Categ":"xE5xA8xB1xE4xB9x90"}
     10H20190701101233N0                  column=6:1098aca82c9389f39b8afe70099b18107cd, timestamp=1561947156974, value=0.027:3:1561633525000:1098aca82c
                                          9389f39b8afe70099b18107cd:6:{"sourceIDName":"109_|_|xE5xA2xA8xE5x85xAExE7x9Ax84xE7x88xB1xE6x84
                                          x8F","orgCateg":"xE5xA8xB1xE4xB9x90"}

    hbase(main):006:0> get 'label_event_index_table','10H20190701101233N0'
    COLUMN                                CELL
     6:1092078ccf0604e3b49abfdfb2b5b46d681 timestamp=1561947156974, value=0.027:1:1561614000000:1092078ccf0604e3b49abfdfb2b5b46d681:6:{"sourceIDName":"1
                                           09_|_|YesxE5xA8xB1xE4xB9x90xE7x8ExB0xE5x9CxBA","orgCateg":"xE5xA8xB1xE4xB9x90"}
     6:1098aca82c9389f39b8afe70099b18107cd timestamp=1561947156974, value=0.027:3:1561633525000:1098aca82c9389f39b8afe70099b18107cd:6:{"sourceIDName":"1
                                           09_|_|xE5xA2xA8xE5x85xAExE7x9Ax84xE7x88xB1xE6x84x8F","orgCateg":"xE5xA8xB1xE4xB9x90"}


    hbase存储结构:
        RowKey:是Byte array,是表中每条记录的“主键”,方便快速查找,Rowkey的设计非常重要;
        Column Family:列族,拥有一个名称(string),包含一个或者多个相关列;
        Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加;
        Version Number:类型为Long,默认值是系统时间戳,可由用户自定义;
        Value(Cell):Byte array。


    ################hbase##########################
    #######################################################

    #######################################################
    ################redis##########################
    NoSQL(Not Only SQL):泛指非关系型数据库

    CAP定理:
        Consistency(一致性), 数据一致更新,所有数据变动都是同步的;
        Availability(可用性), 好的响应性能;
        Partition tolerance(分区容错性) 可靠性;
    定理:任何分布式系统只可同时满足二点,没法三者兼顾
        CA:传统Oracle数据库
        AP:大多数网站架构的选择
        CP:Redis、Mongodb

    DCS,即一种分布式缓存数据库服务,将现在很火的几类内存数据库Redis、Memcached和内存数据网格进行包装,提供即开即用、安全可靠、弹性扩容、便捷管理的在线分布式缓存能力

    1.redis:
        redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库(非关系性数据库)

    2.优点:
        ①速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

        ②支持丰富数据类型,支持string,list,set,sorted set,hash

        ③支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

        ④丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

    3.redis数据类型:
        ①字符串(string)
            set key value
            get key
            exists  key   //key是否存在
        ②哈希(hash)
            hset hashKey  key1 value1 key2 value2
            hget hashkey  key1
        ③集合(set)
            sadd setKey value
            scard setKey    //返回集合中元素数量
            sismember setKey value   //查看value是否在集合setKey中
            srem setKey value    //从集合setKey中删除value
        ④列表(list)
            lpush list  value
            rpop  list
            llen  list
        ⑤有序集合(sort set)
            zadd zset1 key1 value1
            zcard zset1   //统计zset1下key的个数
            zrank zset1 value2   //查看value2在zset1中排名位置
            zrange zset1 0 2 withscores   //查看0到2的所有值和分数按照排名

    ################redis##########################
    #######################################################



    #####################################################################
    Spark运行模式:
        1. local: 本地线程方式,主要用于开发调试
        Hadoop YARN: 集群运行在Yarn资源管理器上,资源管理交给Yarn,spark只负责进行任务调度和计算
        2. 各Spark应用程序以相互独立的进程集合运行于集群之上,由SparkContext对象进行协调,SparkContext对象可以视为Spark应用程序的入口,被称为driver program,SparkContext可以与不同种类的集群资源管理器(Cluster Manager),例如Hadoop Yarn、Mesos等 进行通信,从而分配到程序运行所需的资源,获取到集群运行所需的资源后,SparkContext将得到集群中其它工作节点(Worker Node) 上对应的Executors (不同的Spark应用程序有不同的Executor,它们之间也是独立的进程,Executor为应用程序提供分布式计算及数据存储功能),之后SparkContext将应用程序代码分发到各Executors,最后将任务(Task)分配给executors执行。
        3. RDD操作包含 Transformations和Action;所有的transformation都是lazy的

        




    #######################################################
    application
    job
    stage
    task

    master
    worker
    executor
    driver


    碰到第一个action算子的时候,相当于触发了sc.runjob方法执行

    DAGScheduler工作:从action算子开始,到把stage变成TaskSet提交到taskScheduler中去执行结束

    ###########################################################
    distinct,groupByKey,reduceByKey,aggregateByKey,join,cogroup,repartition

    数据倾斜的解决方案:
        ①使用Hive ETL预处理数据
            从根源上提前处理好hive表中的数据;
            (缺点:治标不治本,spark程序没有解决数据倾斜的能力)
        ②过滤少数导致倾斜的key
        ③提高shuffle的并行度
            实现简单,增加shuffle read task数量
            (缺点:缓解倾斜)
        ④两阶段聚合(局部聚合+全局聚合)
            第一阶段随机打乱,比如key可以加上前缀,将其分开;第二步再将前缀去掉
            (对于聚合类的shuffle操作,最好的解决方案)
        ⑤将reduce join转为 map join
            //reduce join 通用的join实现;但容易产生数据倾斜
            rdd1.join(rdd2)
            //map join  完美的避开了shuffle阶段,所以没有数据倾斜;但适用场景有限,只适合大小表做关联
            val bc=sc.broadCast(rdd1.toList)
            rdd1.foreachPartition(data =>{
                val data2=bc.value
                val data1=data
                data1.join(data2)
            })        
        ⑥采样倾斜key并分拆join操作
            将出现数据倾斜的key的所有数据,形成单独的数据集
            
        ⑦使用随机前缀和扩容的RDD进行join
        ⑧多种方案组合使用
    #########################################################################
    sc.read.format("json").load("/test/")
    sc.read.json("test/")

    df.write.json("test/")
    df.write.format("json").save("/test/")

    sc.read.load("test/xxx.parquet") //默认parquet格式,等价下一
    sc.read.format("parquet").load("test/")

    #######################################################################

    ①rdd.toDF
    ②sqlContext.createDataFrame(rdd)








    #####################################################################
    Block
    输入可能以多个文件的形式存储在HDFS上,每个File都包含了很多块,称为Block。

    InputSplit
    当Spark读取这些文件作为输入时,会根据具体数据格式对应的InputFormat进行解析,一般是将若干个Block合并成一个输入分片,称为InputSplit,注意InputSplit不能跨越文件。
    随后将为这些输入分片生成具体的Task。InputSplit与Task是一一对应的关系。

    job
    在spark rdd中,有action、transform操作,当真正触发action时,才真正执行计算,此时产生一个job任务

    stage
    以shuffle为界,当在一个job任务中涉及shuffle操作时,会进行stage划分,产生一个或多个stage。
    Stage概念是spark中独有的。一般而言一个Job会切换成一定数量的stage。各个stage之间按照顺序执行。至于stage是怎么切分的,首选得知道spark论文中提到的narrow dependency(窄依赖)和wide dependency( 宽依赖)的概念。其实很好区分,看一下父RDD中的数据是否进入不同的子RDD,如果只进入到一个子RDD则是窄依赖,否则就是宽依赖。宽依赖和窄依赖的边界就是stage的划分点

    task
    一个stage可能包含一个或者多个task任务,task任务与partition、executor息息相关,即并行度。
    Task是Spark中最新的执行单元。RDD一般是带有partitions的,每个partition的在一个executor上的执行可以任务是一个Task。

    partition
    partition个数即rdd的分区数,不同的数据源读进来的数据分区数默认不同,可以通过repartition进行重分区操作。

    executor
    executor运行在work上,一个work可以运行一个或多个executor,一个executor可以运行一个或者多个task(取决于executor的core个数,默认是一个task占用一个core,即有多少个core就可以启动多少个task任务)


    Application
    application(应用)其实就是用spark-submit提交的程序。比方说spark examples中的计算pi的SparkPi。一个application通常包含三部分:从数据源(比方说HDFS)取数据形成RDD,通过RDD的transformation和action进行计算,将结果输出到console或者外部存储(比方说collect收集输出到console)。

    Driver
    Spark中的driver感觉其实和yarn中Application Master的功能相类似。主要完成任务的调度以及和executor和cluster manager进行协调。有client和cluster联众模式。client模式driver在任务提交的机器上运行,而cluster模式会随机选择机器中的一台机器启动driver。从spark官网截图的一张图可以大致了解driver的功能。



    ######################################################################

    schema: 表的字段的定义(名称,类型);当前这个表的数据存储目录
    data:真实数据



    离线计算   
    批任务
    实时处理   
    流式处理
    ################################

    storm  
        严格的一条数据计算一次,流式处理,但不一定是实时处理
        实时要求可以很高,吞吐量低
    sparkStreaming
        一批数据计算一次(每个批次的时间间隔用户自由设置)
        实时要求低一点,吞吐量高一点(折中一点)
        流式计算是离线计算的一个特例
        
    flink
        
    ################################
    mapreduce: 每隔一段时间,执行一次任务,对两次任务之间的数据进行累积

    storm: 一条一条的执行计算,(流式处理的核心思路);延迟低,亚秒级;数据消费至少一次(trident API 有且仅一次)

    sparkStreaming: 很小的一批批的取执行计算(常见在1s到5min);伪实时;基于sparkCore,基于离线处理;有且仅一次

    flink: 把离线处理看做是流式处理的一个特例,离散的批处理,基于流式处理;有且仅一次

    #################################################

     
              节点            进程         线程
    spark     worker          executor      task
    storm     supervisor      worker        executor

    ###################################################
    一站式通用解决方案

    DStream:
        离散的RDD组成
        
    UpdateStateByKey


    输入数据流 → (接收器) →结果输出


    有状态计算
    无状态计算

    #####################################################
    窗口长度
    滑动周期
    二者都要是时间片的整数倍
    每隔多长时间(滑动周期)计算过去多长时间(窗口长度)的数据

    ###################################################
    package com.huawei.rcm.newsfeed.test

    import org.apache.spark.rdd.RDD
    import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
    import org.apache.spark.sql.{DataFrame, SQLContext, SparkSession}


    object test38 {

      case class Fruit(name: String,age:Int,address:String)

      def main(args: Array[String]): Unit = {
        val ss = SparkSession.builder()
          .config("Spark SQL basic example","some-value")
          .master("local[2]")
          .appName("hello")
          //.enableHiveSupport()
          .getOrCreate()
        //enableHiveSupport,必须要有配置文件hive-site.xml
        val sc = ss.sparkContext
        val sqlContext =new SQLContext(sc)
        ss.sparkContext.setLogLevel("ERROR")


        val rdd=sc.parallelize(List(("apple",1,"China"),("strawberry",2,"China"),("banana",3,"America"),("orange",4,"France")))
        val fruitRDD: RDD[Fruit] = rdd.map(x=>Fruit(x._1,x._2,x._3))
        import ss.implicits._
        val fruitDF=fruitRDD.toDF("name","age","Address")
        fruitDF.show()
        //sql风格
        fruitDF.registerTempTable("fruitTable")

        val resutDF: DataFrame = sqlContext.sql("select * from fruitTable where age >2")
        resutDF.show()

        val resultDF2: DataFrame = ss.sql("select * from fruitTable where age >=2")
        resultDF2.show()


        sc.stop()
      }
    }

    ###################################################
    mapreduce  典型的离线处理计算引擎
    storm     流失处理计算引擎
    spark    离线处理+流式处理;基于离线处理的执行引擎来设计的;把流式处理看作是离线处理的特例
    flink   流式处理+批处理;基于流式处理的执行引擎来进行设计的; 把离线处理看作是流式处理的特例


    #############################################
    storm核心概念:
        topology   一个storm的应用程序
        spout   数据源
        bolt    数据处理组件
        tuple   一个消息一条记录
        StreamingGrouping   分组规则
        
    ##############################################
    实时流式处理的大致架构:
    tomcat → log4j → logFile(实时监听) → flume(实时收集)  → kafka(缓冲作用,上游收集和下游消费的速度调节) →计算引擎(实时计算/流式计算)  → redis/mysql/hbase

    离线:
    flume → hdfs → mapreduce/hive → hbase/mysql/hdfs/redis

    流式:
    flume → kafka → storm/sparkStreaming → redis/mysql/hbase


    flume既能做到监控文件的变化(tail -F exec),也能由事件进行驱动收集(spooldir)

    ##############################################
    connection 不能序列化
    所以connection在driver端,而写入数据在executor端,

    连接池:第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接


    ##########################################
    checkpoint
        1.checkpoint的数据类型:
            元数据
            RDD数据
        2.合适启用checkpoint
            有状态计算:updateStateByKey,window
            如果有需要对diver进行HA
        3.如何配置checkpoint
            streamingContext.checkpoint(hdfspath)
            def functionToCreateStreamingContext():StreamingContext
            StreamingContext.getOrCreate(chkDir,functionToCreateStreamingContext)

            
    ###############################################
    对数据的消费有三种语义:
    at most once  最多一次,有可能会漏消费
    at least once   最少一次,有可能重复消费
    exactly once    有且仅有一次,效率低


    #################################################
    每一个stage中的task数量,都是有这个stage中最后一个RDD的分区数巨鼎



    #####################################################
    Resilient Distributed Dataset
    弹性(可在内存/磁盘,分区可变)分布式数据集


    transformation/转换
        延迟计算,rdd → rdd
    action/行动
        触发sparkcontext提交job作业,rdd → 输出结果

    宽依赖:指的是多个子RDD的Partition会依赖同一个父RDD的Partition
    窄依赖:指的是每一个父RDD的Partition最多被子RDD的一个Partition使用

    #############################################
    在基于standalone的Spark集群,Cluster Manger就是Master。Master负责分配资源,在集群启动时,Driver向Master申请资源,Worker负责监控自己节点的内存和CPU等状况,并向Master汇报

    每个worker可以起一个或多个Executor
    每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task

    一个application通过action划分不同job,在job中最后一个算子往前推按宽依赖划分不同stage

    通过DAGScheduler划分阶段,形成一系列的TaskSet,然后传给TaskScheduler,把具体的Task交给Worker节点上的Executor的线程池处理。线程池中的线程工作,通过BlockManager来读写数据。
    ######################################################
    密集向量dense
    稀疏向量sparse







    ############################################
    需求:有两份数据集,一份是边,一份是点。求点的PageRank
    格式:
    边:sourceID destID
    点:name sourceID





















  • 相关阅读:
    替换html里面的 及解决记事本中的每个段落只有一行的情形
    关于 'list' object has no attribute 'select'
    python写爬虫的弯路
    将博客搬至CSDN
    转载:如何让spring mvc web应用启动时就执行
    java开发人员,最应该学习和熟练使用的工具类。google guava.(谷歌 瓜娃)
    解决svn问题:Wrong committed revision number: -1
    生产环境中,数据库升级维护的最佳解决方案flyway
    在JaveWeb项目中配置Spring 匿名访问时,匹配规则的变相实现/*
    nexus的使用
  • 原文地址:https://www.cnblogs.com/ShyPeanut/p/11159809.html
Copyright © 2020-2023  润新知