Spark介绍背景介绍起源于美国加州大学伯克利分校AMPLab的大数据计算平台目前是Apache软件基金会的顶级项目Spark是一个分布式计 算框架,专注于分布式计算Why spark架构先进采用scala编写,代码简洁高效基于DAG(有向无环图)的执行引擎,减少了多次计 算中间结果写入hdfs的开销建立在统一抽象的RDD之上,使得可以以基本一致的方式应对不同的大数据处理场景执行高效提供Cache机制 来支持需要反复迭代的计算,或多次数据共享,减少数据读取的IO开销与Hadoop的MapReduce相比,Spark基于内存的运算, 比MR要快100倍;而基于硬盘的运算也要快10倍!Why Spark简洁易用提供了广泛的数据操作类型(20+种),不像MapRed uce只有map和reduce两种支持java、scala、python api, 支持交互式的scala、python shel l整体解决方案以RDD强大的表现能力,逐渐形成了一套自己的生态圈,提供了full-statck的解决方案主要包括Spark内存中批 处理,Spark SQL交互式查询、Spark Streaming流式计算,GraphX和MLlib提供的常用图计算和机器学习算法 与Hadoop无缝衔接Spark可以使用YARN作为它的集群资源管理器读取HDFS、HBase等数据源Spark结构Spark解决 的问题Spark 批处理弹性分布数据集RDDSpark中对数据和计算的抽象,它表示已被分片(partition)、不可变的、并能被 并行执行的数据集合每个RDD包含5个主要的特性: a、一组分片(partitions) b、一个计算 分片的函数 c、依赖(lineage,谱系,怎么来的) d、位置偏好(可选,如何就近拉数据)RDD Operation操作作用于R DD上的Operation分为转换(transformation)和动作(action)。spark的所有“转换”都是惰性的,在执 行“转换”操作,并不会提交Job,只有在执行“动作”操作,所有的operation才会真正的被执行Operation转换动作从现有 的数据集创建一个新的数据集在数据集上运算后,返回一个值给client程序RDD操作--transformationRDD操作--a ction共享变量1)广播变量Broadcast broadcastVar = sc.broadcast(new int[] {1, 2, 3});System.out.println(broadcastVar.value());注:广播变量应 该可以序列化,并且应该是小数据,大数据建议使用rdd join方式2)累加器Accumulator accum = sc.accumulator(0);sc.parallelize(Arrays.asList(1, 2, 3, 4)).for each(x -> accum.add(x));System.out.println(accum.value());注:一般是In teger或Long批处理演示--WordCountJava Democluster mode 运行模式localStandalo ne Deploy Mode: simplest way to deploy Spark on a private cluster Apache MesosHadoop YARNKubernetes目前我们项目组用的是Hadoop Yarn,后续介绍都是主要基于 这种模式进行介绍Spark SQLSpark SQL发展为了给不理解Mapreducer的人员快速上手,Hive应运而生,但是基于 Mapreducer计算过程中大量的I/O消耗,效率低下为了提高效率伯克利实验室基于Hive进行改进,比如引进缓存管理,改进和优化 等,推出了Shark,从而使得SQL的查询速度得到了10-100倍的提升Shark对Hive依赖太多,制约了spark各个组件的相 互集成,所以提出了SparkSQL项目Why so fast 内存列存储(In-Memory Columnar Storage)字 节码生成技术(bytecode generation,即CG)Scala代码优化SparkSQL运行架构Spark SQL结构化数 据模块,提供DataFrame作为分布式SQL查询引擎DataFrame来源可以是rdd,json、jdbc等Spark SQL可 以直接读取hive metastore,从而直接使用spark sqlDataFrame1、从rdd转化过来JavaRDD ing> lineRdd = sc.textFile("examples/src/main/resources/people.t xt");JavaRDD peopleRdd = lineRdd.map( new Function g, Person>() { public Person call(String line) throws Excep tion { String[] parts = line.split(","); Person person = ne w Person(); person.setName(parts[0]); person.setAge(Integer .parseInt(parts[1].trim())); return person; }});DataFrame peop leDataFrame =sqlContext.createDataFrame(people, Person.class);peo pleDataFrame.registerTempTable("people");DataFrame teenagers = sq lContext.sql("SELECT name FROM people WHERE age >= 13 AND age<= 1 9");注:建议能快速判断的条件放在前面Json、Jdbc2、通过json文件获得DataFrame df = sqlContex t.read().json("examples/src/main/resources/people.json");3、从其他数据库 中读取(Jdbc)Map options = new HashMap >();options.put("url", "jdbc:postgresql:dbserver");options.put("d btable", "schema.tablename");DataFrame jdbcDF = sqlContext.load(" jdbc", options);DataFrame操作df.groupBy("department").agg(col("depa rtment"), max("age"), sum("expense"));df.groupBy("department").ag g(max("age"), sum("expense"));df.select("name", "age").write().pa rquet("people.parquet");Spark StreamingSpark StreamingSpark Strea ming是一个对实时数据流进行高吞吐、容错处理的流式处理系统,可以对多种数据源(如Kafka、Flume、Twitter、Zero 和TCP 套接字)进行类似Map、Reduce和Join等复杂操作结果可以保存到外部文件系统、数据库或应用到实时仪表盘Spark Streaming 编程模型编程模型DStream作为Spark Streaming的基础抽象,它代表持续性的数据流在内部实现上, DStream由一组时间序列上连续的RDD来表示。每个RDD都包含了自己特定时间间隔内的数据流,如下图所示Spark Stream ing 操作编程模型DStream对DStream中数据的各种操作也将映射到内部的RDD上Spark Streaming 操作普通 转换操作和RDD操作类似,主要有:flatMap、map、groupByKey等窗口转换操作Streaming特有,主要有wind ow,countByWindow、reduceByWindow、countByKeyAndWindow、reduceByKeyAn dWindow输出操作print、saveAsTextFiles、saveAsHadoopFiles、foreachRDD实时性其 最小的Batch Size的选取在0.5~2秒钟之间(Storm目前最小的延迟是100ms左右)能满足除对实时性要求非常高(如高频实时交易)之外的所有流式准实时计算场景扩展性与吞吐量Spark目前在EC2上已能够线性扩展到100个节点(每个节点4Core),可以以数秒的延迟处理6GB/s的数据量(60M records/s),其吞吐量也比流行的Storm高2~5倍MLlib 和 Graphxspark 与 mapreduce的区别 |
|