Spark入门实战指南——Spark生态圈+第一个Spark程序

一、Spark及其生态圈简介

1.目前大数据处理场景有以下几个类型:

1.  复杂的批量处理(BatchData Processing),偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时;

2.  基于历史数据的交互式查询(Interactive Query),通常的时间在数十秒到数十分钟之间

3. 基于实时数据流的数据处理(Streaming Data Processing),通常在数百毫秒到数秒之间

目前对以上三种场景需求都有比较成熟的处理框架,第一种情况可以用Hadoop的MapReduce来进行批量海量数据处理,第二种情况可以Impala进行交互式查询,对于第三中情况可以用Storm分布式处理框架处理实时流式数据。以上三者都是比较独立,各自一套维护成本比较高,而Spark的出现能够一站式平台满意以上需求。

2.生态系统

2.1 Spark Core

2.2 SparkStreaming

2.3 Spark SQL

SharkHive on Spark,本质上是通过HiveHQL解析,把HQL翻译成Spark上的RDD操作,然后通过Hivemetadata获取数据库里的表信息,实际HDFS上的数据和文件,会由Shark获取并放到Spark上运算。Shark的最大特性就是快和与Hive的完全兼容,且可以在shell模式下使用rdd2sql()这样的API,把HQL得到的结果集,继续在scala环境下运算,支持自己编写简单的机器学习或简单分析处理函数,对HQL结果进一步分析计算。

2.4 BlinkDB

和传统关系型数据库不同,BlinkDB是一个很有意思的交互式查询系统,就像一个跷跷板,用户需要在查询精度和查询时间上做一权衡;如果用户想更快地获取查询结果,那么将牺牲查询结果的精度;同样的,用户如果想获取更高精度的查询结果,就需要牺牲查询响应时间。用户可以在查询的时候定义一个失误边界。

2.5 MLBase/MLlib

MLBase分为四部分:MLlibMLIML OptimizerMLRuntime

l  MLOptimizer会选择它认为最适合的已经在内部实现好了的机器学习算法和相关参数,来处理用户输入的数据,并返回模型或别的帮助分析的结果;

l  MLI 是一个进行特征抽取和高级ML编程抽象的算法实现的API或平台;

l MLlib是Spark实现一些常见的机器学习算法和实用程序,包括分类、回归、聚类、协同过滤、降维以及底层优化,该算法可以进行可扩充; MLRuntime 基于Spark计算框架,将Spark的分布式计算应用到机器学习领域。

总的来说,MLBase的核心是他的优化器,把声明式的Task转化成复杂的学习计划,产出最优的模型和计算结果。与其他机器学习Weka和Mahout不同的是:

l  MLBase是分布式的,Weka是一个单机的系统;

l  MLBase是自动化的,Weka和Mahout都需要使用者具备机器学习技能,来选择自己想要的算法和参数来做处理;

l  MLBase提供了不同抽象程度的接口,让算法可以扩充

l  MLBase基于Spark这个平台

2.6 GraphX

GraphX是Spark中用于图和图并行计算的API

2.7 SparkR

SparkR是AMPLab发布的一个R开发包,使得R摆脱单机运行的命运,可以作为Spark的job运行在集群上,极大得扩展了R的数据处理能力

2.8 Tachyon

Tachyon是一个高容错的分布式文件系统,允许文件以内存的速度在集群框架中进行可靠的共享,就像Spark和 MapReduce那样。通过利用信息继承,内存侵入,Tachyon获得了高性能。

二、SparkWordCount程序

安装:安装Idea、安装本地JAVA 8 和Scala 2.10.4、为IDEA安装Scala
①新建项目,指定JDK1.80.X和Scala2.10.4
②设置工程的Libraries核心是添加Spark的jar
(File-->Project Structure-->libraries-->加号(java)-->spark-1.6.0-bin-hadoop2.6-->lib-->spark-assembly-1.6.0-hadoop2.6.0.jar--apply-->ok)

 

package idea.dt.spark

import org.apache.spark.{SparkConf, SparkContext}

/**
  * (本地测试的程序)
  * 统计一个文件中出现的单词计数
  * @author zzh
  * @time	 2016/8/23
  */

object WordCount {
  def main(args: Array[String]) {

    /*
     * 第一步:创建Spark的配置对象SparkConf,设置Spark程序运行时的配置信息
     * 例如说通过setMaster来设置程序焰莲劫的Spark集群的Master的URL,如果设置为
     * LOCAL,则代表Spark程序在本地运行,特别适合与机器配置条件差的初学者
     */
    val conf = new SparkConf() //创建SparkConf对象
    conf.setAppName("Wow,My First Spark App") //设置程序的名称,在程序运行的监控界面可以看到名称
    conf.setMaster("local") //程序本地运行不需要Spark集群

    /*
     *第二步:创建SparkContext对象<——Spark程序所有功能唯一的入口(无论是Scala、Java、Python、R都有一个SparkContext)
     * SparkContext的核心作用:初始化spark应用程序运行搜徐的核心组件,包括DAGScheduler、TaskScheduler、schedulerBackend
     * 同时还会负责Spark程序往Master注册程序等
     */
    val sc = new SparkContext(conf) //创建SparkContext对象,通过传入的SparkConf实例来定制Spark运行的具体参数和配置信息

    /*
     * 第三步:根据具体的数据来源(HDFS、Hbase、Local FS、DB、S3等)通过SparkContext来创建RDD
     * RDD的创建基本三种方式:通过外部的数据源(例如:HDFS)、根据Scala集合、由其他的RDD操作
     * 数据会被RDD划分成一系列的Partitions,分配到没法Partition的数据与一个数据Task的处理范畴
     */
    //并行度只有一个
    //    val lines:RDD[String] = sc.textFile("F:\\深入理解大数据Software\\大数据压缩文件\\spark-1.6.0-bin-hadoop2.6\\spark-1.6.0-bin-hadoop2.6\\README.md", 1)
    val lines = sc.textFile("F:\\深入理解大数据Software\\大数据压缩文件\\spark-1.6.0-bin-hadoop2.6\\spark-1.6.0-bin-hadoop2.6\\README.md", 1)

    /*
     * 第四步:对初始的RDD进行Transformation级别的处理,例如map、filter等高阶函数等的编程,来进行具体数据计算
     */
    //4.1对每一行进行拆分
    val words = lines.flatMap { line => line.split(" ") }
    //4.2对每个单词计数为1,
    val pairs = words.map { word => (word, 1) }
    //4.3统计每个单词在文件中的总数
    val wordCountsByOrder = pairs.reduceByKey(_ + _).map(pair=>(pair._2,pair._1)).sortByKey(false).map(pair=>(pair._2,pair._1))//对相同的Key,进行Value的累积(包括Local和Reduce级别的同时Reduce)

    wordCountsByOrder.foreach(wordNumberPair => println(wordNumberPair._1 + " : " + wordNumberPair._2) )
    wordCountsByOrder.saveAsTextFile()

    sc.stop()
  }
}

 

你可能感兴趣的:(saprk,idea)