月度归档:2015年12月

Scala初入

何为Scala物

  Scala为基于JVM虚拟机中的面向对象与函数式编程思想并且完全兼容Java的混合编程语言,可以是Scala与Java是同根同源的,既然Scala与JAVA都是基于JVM之上的编程语言那么Scala的特色又在哪呢 Scala最大的特色就是他是支持函数式编程的,函数式编程风格使得Scala语法远比Java简洁、优雅、易读懂得多,又因为Scala支持函数式编程所以Scala也具有函数式编程中很重要的特性:不可变,所以使用Scala编写 并发程序会比在Java中简单得多;Scala原生支持REPL(Read-Eval Print Loop),在REPL中就可以很好的学习与调试程序;
  Scala的并发编程与Java有很大不通Scala社区强调的是不可变性,这就导致Scala很容易开发出高并发的程序,Scala使用了Actor模型作为并发的模型,这也是他的一大特色之一;

scala初入

  由于Scala是基于Java虚拟机的所以要使用Scala首先要配置好Java,下载Scala配置好环境变量后即可,在终端输入scala进入REPL环境;
Scala启动
            1、Scala启动

第一个Scala程序:

scala> def hello()={  
        println("hello world")  
        }  
scala> hello()  
hello world  

  这里定义了一个函数hello,然后调用函数,函数打印hello world,非常简单但是他与Java的差别还是很大的不需要定义一个类函数可以单独使用,可以没有冒号结尾;

scala生态

  Scala经过十多年的发展已经很成熟,当前scala生态中最出名的莫过于Spark、Akka、Kafka;Spark在大数据领域正在火爆的发展,Spark提供了全面、统一适用与不同场景的大数据处理需求(批量数据处理、交互式数据查询、实时数据流处理、机器学习);Akka使用了Actor模型比Scala的actor站在了更高的抽象程度 并提供了很好的可扩展性,使用了let it crash的容错原则使得Akka可构建出可自愈的高性能分布式系统;Kafka为高性能分布式消息系统由LinkedIn贡献出来,Kafka被誉为下一代分布式消息系统;
  除了上面所说的非常出名的外Scala社区还有如:持久化、HTTP、Web框架等等各方面的轮子;

Spark概述

背景

  目前按照大数据处理类型来分大致可以分为:批量数据处理、交互式数据查询、实时数据流处理,这三种数据处理方式对应的业务场景也都不一样;
  关注大数据处理的应该都知道Hadoop,而Hadoop的核心为HDFSMapReduce,HDFS分布式文件系统在Hadop中是用来存储数据的;MapReduce为Hadoop处理数据的核心,接触过函数式编程的都知道函数式语言中也存在着Map、Reduce函数其实这两者的思想是一致的;也正是因为Hadoop数据处理核心为MapReduce奠定了它注定不是适用场景广泛的大数据框架;
  可以这么说Hadoop适用于Map、Reduce存在的任何场景,具体场景比如:WordCount、排序、PageRank、用户行为分析、数据统计等,而这些场景都算是批量数据处理,而Hadoop并不适用于交互式数据查询、实时数据流处理;
  这时候就出现了各种数据处理模型下的专用框架如:Storm、Impala、GraphLab等;
  1、Storm:针对实时数据流处理的分布式框架;
  2、Impala:适用于交互式大数据查询的分布式框架;
  3、GraphLab:基于图模型的机器学习框架;

MapReduce简单模型
        1、MapReduce简单模型
  
  这时候如果一个团队或一个公司中同时都有设计到大数据批量处理、交互式查询、实时数据流处理这三个场景;这时候就会有一些问题:
  1、学习成本很高,每个框架都是不同的实现语言、不同的团队开发的;
  2、各个场景组合起来代价必然会很大;
  3、各个框架中共享的中间数据共享与移动成本高;
  

Spark

  就在这时候UC Berkeley AMP推出了全新的大数据处理框架:Spark提供了全面、统一适用与不同场景的大数据处理需求(批量数据处理、交互式数据查询、实时数据流处理、机器学习);Spark不仅性能远胜于Hadoop而却还兼容Hadoop生态系统,Spark可以运行在Hadoop HDFS之上提供争强 功能,可以说Spark替代了Hadoop MapReduce,但Spark依然兼容Hadoop中的YARN与Apache Mesos组件,现有Hadoop用户可以很容易就迁移到Spark;
  Spark提出了RDD(Resilient Distributed Datasets)这么一个全新的概念,RDD弹性分布式数据集是并行、容错的分布式数据结构;RDD可以持久化到硬盘或内存当中,为一个分区的数据集,分区的多少决定了并行计算的粒度;并且提供了一系列的操作RDD中的数据:
  1、创建操作(Creation Operation):RDD由SparkContext通过内存数据或外部文件系统创建;
  2、转换操作(Transformation Operation):将RDD通过转换操作变为另一个RDD,Spark提供了map、flatMap、filter等一系列的转换操作;
  3、控制操作(Control Operation):将RDD持久化到内存或硬盘当中,如cache将filterRDD缓存到内存;
  4、行动操作:(Action Operation):Spark采用了惰性计算,对于任何行动操作都会产生Spark Job运行产生最终结果;提供了join、groupBy、count等操作,Spark中存在两种操作产生的结果为Scala集合或者标量与RDD保存到文件或数据库;

Spark结构
                2、Spark结构图
  Spark RDD:Spark RDD提供了一系列的操作接口,为不变的数据存储结构并存储与内存中使用DAG进行任务规划使更好的处理MapReduce类似的批处理;
  Shark/Spark SQL:分布式SQL引擎,兼容Hive性能远比Hive高很多;
  Spark Streaming:将数据流分解为一系列批处理作业使用Spark调度框架更好的支持数据流操作,支持的数据输入源有:Kafka、Flume等;
  GraphX:兼容Pregel、GraphLab接口为基于Spark的图计算框架;
  MLlib:为Spark的机器学习算法库,支持常用的算法有:分类算法、推荐算法、聚类算法等等;

  性能卓越、支持多种大数据处理模型、支持多种编程语言接口:Java、Scala、Python,许多大公司如IBM等大力支持推广Spark的发展;