spark大数据的学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_26566137/article/details/82670206

(1)spark.rdd的处理
https://spark.apache.org/examples.html

spark.sql非常精辟:
https://github.com/apache/spark/blob/master/examples/src/main/python/sql/basic.py

An example demonstrating aft survival regression.
Run with:
  bin/spark-submit examples/src/main/python/ml/aft_survival_regression.py
"""
from __future__ import print_function

# $example on$
from pyspark.ml.regression import AFTSurvivalRegression
from pyspark.ml.linalg import Vectors
# $example off$
from pyspark.sql import SparkSession

if __name__ == "__main__":
    spark = SparkSession \
        .builder \
        .appName("AFTSurvivalRegressionExample") \
        .getOrCreate()

    # $example on$
    training = spark.createDataFrame([
        (1.218, 1.0, Vectors.dense(1.560, -0.605)),
        (2.949, 0.0, Vectors.dense(0.346, 2.158)),
        (3.627, 0.0, Vectors.dense(1.380, 0.231)),
        (0.273, 1.0, Vectors.dense(0.520, 1.151)),
        (4.199, 0.0, Vectors.dense(0.795, -0.226))], ["label", "censor", "features"])
    quantileProbabilities = [0.3, 0.6]
    aft = AFTSurvivalRegression(quantileProbabilities=quantileProbabilities,
                                quantilesCol="quantiles")

    model = aft.fit(training)

    # Print the coefficients, intercept and scale parameter for AFT survival regression
    print("Coefficients: " + str(model.coefficients))
    print("Intercept: " + str(model.intercept))
    print("Scale: " + str(model.scale))
    model.transform(training).show(truncate=False)
    # $example off$

    spark.stop()

(2)大数据架构的一些资料
《前言 :一个典型的大数据平台架构》
https://my.oschina.net/wangjiankui/blog/661705

头条的数据传输以 Kafka 作为数据总线,所有实时和离线数据的接入都要通过 Kafka,包括日志、binlog 等。这里值得注意的是:尽早引入消息队列,与业务系统解耦。

Kafka 数据通过 Dump 落地到 HDFS,供后续离线处理使用。随着数据规模的增加,Dump 的实现也经历了几个阶段。最初实现用的是类似 Flume 模式的单机上传,很快遇到了瓶颈,实现改成了通过 Storm 来实现多机分布式的上传,支持的数据吞吐量大幅增加。

头条的数据源很复杂,直接拿来做分析并不方便。但是到数据仓库这一层级,会通过数据处理的过程,也就是 ETL,把它建设成一个层次完备的适合分析的一个个有价值的数仓。在数仓之上,就可以让数据分析师和数据 RD 通过 SQL 和多维分析等更高效的手段使用数据。

数据仓库中数据表的元信息都放在 Hivemetastore 里,数据表在 HDFS 上的存储格式以 Parquet 为主,这是一种列式存储格式,对于嵌套数据结构的支持也很好。

头条有多种 ETL 的实现模式在并存,对于底层数据构建,一种选择是使用 Python 通过 HadoopStreaming 来实现 Map Reduce 的任务,但现在更倾向于使用 Spark 直接生成 Parquet 数据,Spark 相比 MapReduce 有更丰富的处理原语,代码实现可以更简洁,也减少了中间数据的落地量。对于高层次的数据表,会直接使用 HiveSQL 来描述 ETL 过程。

今日头条数据平台架构师

2014 年加入今日头条,目前负责头条基础数据平台的技术架构,解决海量数据规模下推荐系统和用户产品的统计分析问题,并见证了头条数据平台从无到有、从小到大的历程。加入头条前,曾就职于豆瓣负责 Antispam 系统的研发。

基础数据平台的建设理念是通过提供整体解决方案,降低数据使用门槛,方便各种业务接入。互联网产品的数据分析模式也是相对固定的,比如事件多维分析、留存分析、漏斗分析等,把这些分析模式抽象出工具,也能覆盖住大部分常用需求。

扫描二维码关注公众号,回复: 3525213 查看本文章

同时,期望参与业务的人比如 PM 等能更直接的掌握数据,通过相关工具的支持自行实现数据需求,尽量解放业务部门工程师的生产力,不至于被各种临时跑数需求困扰。而对于更专业的数据分析师的工作,也会提供更专业的工具支持。

http://www.infoq.com/cn/articles/qiniu-big-data-platform-evolution-and-analysis

https://zhuanlan.zhihu.com/p/38527834

如何设计实时数据平台(上篇)

https://juejin.im/post/5b014a756fb9a07ab5092de1

https://blog.csdn.net/np4rHI455vg29y2/article/details/78954866

超级推荐:
https://zhuanlan.zhihu.com/p/26545566
一文读懂大数据平台——写给大数据开发初学者的话!

https://blog.csdn.net/yeruby/article/details/51448188

SparkSQL与Hive on Spark的比较
它主要用于结构化数据处理和对Spark数据执行类SQL的查询。通过Spark SQL,可以针对不同格式的数据执行ETL操作(如JSON,Parquet,数据库)然后完成特定的查询操作。一般来说,Spark每支持一种新的应用开发,都会引入一个新的Context及相应的RDD,对于SQL这一特性来说,引入的就是SQLContext和SchemaRDD。注意:在Spark1.3之后,SchemaRDD已经更名为DataFrame,但它本质就类似一个RDD,因为可以将DataFrame无缝的转换成一个RDD。

结构上Hive On Spark和SparkSQL都是一个翻译层,把一个SQL翻译成分布式可执行的Spark程序。比如一个SQL:

SELECT item_type, sum(price)
FROM item
GROUP item_type;
1
2
3
上面这个SQL脚本交给Hive或者类似的SQL引擎,它会“告诉”计算引擎做如下两个步骤:读取item表,抽出item_type,price这两个字段;对price计算初始的SUM(其实就是每个单独的price作为自己的SUM)因为GROUP BY说需要根据item_type分组,所以设定shuffle的key为item_type从第一组节点分组后分发给聚合节点,让相同的item_type汇总到同一个聚合节点,然后这些节点把每个组的Partial Sum再加在一起,就得到了最后结果。不管是Hive还是SparkSQL大致上都是做了上面这样的工作。

需要理解的是,Hive和SparkSQL都不负责计算,它们只是告诉Spark,你需要这样算那样算,但是本身并不直接参与计算。

流式计算:
https://www.zhihu.com/question/19919196

还有一个名词是“大数据处理引擎”,那么这个“引擎”和我们说的“框架”又有什么关系呢?其实并没有区分他们的权威的定义,但一般来说,前者是实际负责处理操作的组件,而后者可以理解为用来完成同样工作的一系列组件。比如Apache Hadoop可以看做是以MapReduce为默认处理引擎的处理框架。

大数据处理框架的类型、比较和选择
大数据系统的基本需求与传统系统并没有本质上的不同。但大数据系统虽然具有海量的数据规模,但是对数据的接入和处理速度上也有较高的要求,而且在每个阶段都要对数据进行处理。这些特点还是为设计解决方案时提供了新的挑战。

作者:佚名来源:36大数据|2017-09-06 17:05 收藏 分享
9月15日技术沙龙 | 与东华软件、AWS、京东金融、饿了么四位大咖探讨精准运维!
大数据处理框架的类型、比较和选择

前言

说起大数据处理,一切都起源于Google公司的经典论文:《MapReduce:Simplied Data Processing on Large Clusters》。在当时(2000年左右),由于网页数量急剧增加,Google公司内部平时要编写很多的程序来处理大量的原始数据:爬虫爬到的网页、网页请求日志;计算各种类型的派生数据:倒排索引、网页的各种图结构等等。这些计算在概念上很容易理解,但由于输入数据量很大,单机难以处理。所以需要利用分布式的方式完成计算,并且需要考虑如何进行并行计算、分配数据和处理失败等等问题。

针对这些复杂的问题,Google决定设计一套抽象模型来执行这些简单计算,并隐藏并发、容错、数据分布和均衡负载等方面的细节。受到Lisp和其它函数式编程语言map、reduce思想的启发,论文的作者意识到许多计算都涉及对每条数据执行map操作,得到一批中间key/value对,然后利用reduce操作合并那些key值相同的k-v对。这种模型能很容易实现大规模并行计算。

事实上,与很多人理解不同的是,MapReduce对大数据计算的最大贡献,其实并不是它名字直观显示的Map和Reduce思想(正如上文提到的,Map和Reduce思想在Lisp等函数式编程语言中很早就存在了),而是这个计算框架可以运行在一群廉价的PC机上。MapReduce的伟大之处在于给大众们普及了工业界对于大数据计算的理解:它提供了良好的横向扩展性和容错处理机制,至此大数据计算由集中式过渡至分布式。以前,想对更多的数据进行计算就要造更快的计算机,而现在只需要添加计算节点。

话说当年的Google有三宝:MapReduce、GFS和BigTable。但Google三宝虽好,寻常百姓想用却用不上,原因很简单:它们都不开源。于是hadoop应运而生,初代Hadoop的MapReduce和HDFS即为Google的MapReduce和GFS的开源实现(另一宝BigTable的开源实现是同样大名鼎鼎的HBase)。自此,大数据处理框架的历史大幕正式的缓缓拉开。

一、基础

  1. 大数据的定义

“大数据”一词的确切定义其实是很难给出的,因为不同的人(供应商、从业者、商业公司等)对它的理解也并不完全一致。通常来讲,大数据是:

  1. 大数据集

  2. 用于处理大数据集的某类技术

此处的“大数据集”是指一个数据集的数据量太大以至于无法使用传统工具或单机方式来处理和存储,而处理技术包括数据接入、数据持久化存储、数据计算和分析、数据展示(可视化)等等。

  1. 大数据的特征

大数据系统的基本需求与传统系统并没有本质上的不同。但大数据系统虽然具有海量的数据规模,但是对数据的接入和处理速度上也有较高的要求,而且在每个阶段都要对数据进行处理。这些特点还是为设计解决方案时提供了新的挑战。

在2001年,美国Gartner公司的Doug Laney首先提出了“3V”模型来描述大数据处理系统与传统数据处理系统的不同:

Volume

待处理数据的规模在很大程度决定了系统是否为大数据系统。大数据系统中的数据规模可能比传统处理系统中的数据集大几个数量级,这也为数据处理和存储带来了更多的挑战。由于数据处理和存储等工作超出了单台计算机所能达到的性能极限,所以大数据系统通常采用集群方式。集群方式更加考验资源的分配和协调,集群管理和任务分配算法变得越来越重要。

Velocity

大数据与其他数据系统另一个显著的差异体现在数据的“流动”速度。在大数据系统中,数据经常从多种数据源流入系统,并且以一种近实时的方式进行处理。数据被持续不断的接入、修改、处理和分析以便能够跟得上新数据的接入速度。由于近实时处理可以尽早的提供有价值的信息,目前很多商业公司更加青睐于实时处理系统而不是传统的批处理系统。

Variety

大数据系统的问题通常是其他系统所不具备的,因为它所处理的数据来源广泛。数据源可以是应用程序的日志信息,也可以是社交媒体的用户信息,甚至是物理设备传感器的采集数据。不论何种数据,大数据系统的目标都是在海量数据中寻找有用的数据。

  1. 大数据处理流程

那么大数据系统实际上是如何处理数据的呢?虽然不同公司的架构设计不尽相同,但我们可以总结出一个基本的流程。下面介绍的流程虽然不是适用于所有情况,但它们确实被广泛使用。大数据处理的基本流程是:

接入数据到系统中
将数据持久化到存储系统
计算和分析数据
展示结果(可视化)
4. 大数据处理框架的定义

说完了大数据,我们来说说本文的重点——大数据处理框架。大数据处理框架负责对大数据系统中的数据进行计算。数据包括从持久存储中读取的数据或通过消息队列等方式接入到系统中的数据,而计算则是从数据中提取信息的过程。除了大数据处理框架,有些同学可能还听到过“大数据计算框架”、“大数据框架”,这些术语没有严格的区分,但基本可以理解为是一种东西,只不过是对“big data processing framework”不同的翻译(大数据框架是“big data framework”的翻译)。

还有一个名词是“大数据处理引擎”,那么这个“引擎”和我们说的“框架”又有什么关系呢?其实并没有区分他们的权威的定义,但一般来说,前者是实际负责处理操作的组件,而后者可以理解为用来完成同样工作的一系列组件。比如Apache Hadoop可以看做是以MapReduce为默认处理引擎的处理框架。

二、数据处理框架分类

不论是系统中存在的历史数据,还是持续不断接入系统中的实时数据,只要数据是可访问的,我们就可以对数据进行处理。按照对所处理的数据形式和得到结果的时效性分类,数据处理框架可以分为两类:

1、批处理系统

2、流处理系统

批处理是一种用来计算大规模数据集的方法。批处理的过程包括将任务分解为较小的任务,分别在集群中的每个计算机上进行计算,根据中间结果重新组合数据,然后计算和组合最终结果。当处理非常巨大的数据集时,批处理系统是最有效的。

典型的批处理系统就是Apache Hadoop。而流处理则对由连续不断的单条数据项组成的数据流进行操作,注重数据处理结果的时效性。典型的流处理系统有Apache Storm,Apache Samza。还有一种系统,同时具备批处理与流处理的能力,这种称为混合处理系统,比如Apache Spark,Apache Flink。接下来我们来详细介绍这三种处理系统。

三、批处理系统

批处理系统在大数据世界中有着悠久的历史。批处理系统主要操作大量的、静态的数据,并且等到全部处理完成后才能得到返回的结果。批处理系统中的数据集一般符合以下特征:

有限: 数据集中的数据必须是有限的(无限的数据一批就处理不完了啊。连续不断的数据一般会使用流处理系统来进行处理,我们后面会讲到)

持久: 批处理系统处理的数据一般存储在持久存储系统上(比如硬盘上、数据库中)

海量: 极海量的数据通常只能使用批处理系统来处理。批处理系统在设计之初就充分的考虑了数据量巨大的问题,实际上批处理系统也是为此而生的。

由于批处理系统在处理海量的持久数据方面表现出色,所以它通常被用来处理历史数据,很多OLAP(在线分析处理)系统的底层计算框架就是使用的批处理系统。但是由于海量数据的处理需要耗费很多时间,所以批处理系统一般不适合用于对延时要求较高的场景。

Apache Hadoop

说起大数据处理框架,永远也绕不开Hadoop。Hadoop是首个在开源社区获得极大关注的大数据处理框架,在很长一段时间内,它几乎可以作为大数据技术的代名词。在2.0版本以后,Hadoop由以下组件组成:

Hadoop分布式文件系统HDFS:HDFS是一种分布式文件系统,它具有很高的容错性,适合部署在廉价的机器集群上。HDFS能提供高吞吐量的数据访问,非常适合在大规模数据集上使用。它可以用于存储数据源,也可以存储计算的最终结果。

资源管理器YARN:YARN可以为上层应用提供统一的资源管理和调度,它可以管理服务器的资源(主要是CPU和内存),并负责调度作业的运行。在Hadoop中,它被设计用来管理MapReduce的计算服务。但现在很多其他的大数据处理框架也可以将YARN作为资源管理器,比如Spark。

MapReduce:即为Hadoop中默认的数据处理引擎,也是Google的MapReduce论文思想的开源实现。使用HDFS作为数据源,使用YARN进行资源管理。

从今天的眼光来看,MapReduce作为Hadoop默认的数据处理引擎,存在着很多的不足。比如:编程模型抽象程度较低,仅支持Map和Reduce两种操作,需要手工编写大量的代码;Map的中间结果需要写入磁盘,多个MR之间需要使用HDFS交换数据,因此不适合迭代计算(机器学习、图计算);任务的启动和调度开销较大等。随着更多高性能处理引擎的发展,目前在企业中使用MapReduce进行计算的应用已经呈下降趋势(HDFS及YARN仍然被广泛使用),但虽然如此,MapReduce作为最早的大数据处理引擎,仍然值得被我们铭记。

四、流处理系统

批处理系统好理解,那什么是流处理系统呢?小学的时候我们都做过这么一道数学题:一个水池有一个进水管和一个出水管,只打开进水管8个小时充满水,只打开出水管6个小时流光水,那么同时打开进水管和出水管,水池多长时间充满水?

好吧,这道题的答案是永远也充不满……因为出水管出水比较快嘛。流处理系统就相当于这个水池,把流进来的水(数据)进行加工,比如加盐让它变成盐水,然后再把加工过的水(数据)从出水管放出去。这样,数据就像水流一样永不停止,而且在水池中就被处理过了。所以,这种处理永不停止的接入数据的系统就叫做流处理系统。

流处理系统与批处理系统所处理的数据不同之处在于,流处理系统并不对已经存在的数据集进行操作,而是对从外部系统接入的的数据进行处理。流处理系统可以分为两种:

逐项处理: 每次处理一条数据,是真正意义上的流处理。

微批处理: 这种处理方式把一小段时间内的数据当作一个微批次,对这个微批次内的数据进行处理。

不论是哪种处理方式,其实时性都要远远好于批处理系统。因此,流处理系统非常适合应用于对实时性要求较高的场景,比如日志分析,设备监控、网站实时流量变化等等。由于很多情况下,我们想要尽快看到计算结果,所以近些年流处理系统的应用越来越广泛。下面我们来了解两种流处理系统。

Apache Storm

Apache Storm是一种侧重于低延迟的流处理框架,它可以处理海量的接入数据,以近实时方式处理数据。Storm延时可以达到亚秒级。Storm含有如下关键概念:

Topology:Storm topology中封装了实时应用程序的逻辑。Storm topology类似于MapReduce作业,但区别是MapReduce最终会完成,而topology则会一直运行(除非被强制停止)。Topology是由spouts和bolts组成的DAG(有向无环图)。

Stream:Stream是一种不断被接入Storm中的无界的数据序列。

Spout:Spout是topology中Stream的源。Spout从外部数据源读取数据并接入到Strom系统中

Bolt:Bolt用于Storm中的数据处理,它可以进行过滤、聚合、连接等操作。将不同的bolt连接组成完整的数据处理链条,最后一个bolt用来输出(到文件系统或数据库等)。

Storm的基本思想是使用spout拉取stream(数据),并使用bolt进行处理和输出。默认情况下Storm提供了“at least once”的保证,即每条数据被至少消费一次。当一些特殊情况(比如服务器故障等)发生时,可能会导致重复消费。为了实现“exactly once”(即有且仅有一次消费),Storm引入了Trident。Trident可以将Storm的单条处理方式改变为微批处理方式,但同时也会对Storm的处理能力产生一定的影响。

值得一提的是,一些国内的公司在Storm的基础上进行了改进,为推动流处理系统的发展做出了很大贡献。阿里巴巴的JStorm参考了Storm,并在网络IO、线程模型、资源调度及稳定性上做了改进。而华为的StreamCQL则为Storm提供了SQL查询语义。

Apache Samza

提到Apache Samza,就不得不提到当前最流行的大数据消息中间件:Apache Kafka。Apache Kafka是一个分布式的消息中间件系统,具有高吞吐、低延时等特点,并且自带了容错机制。以下是Kafka的关键概念:

Broker:由于Kafka是分布式消息中间件,所以需要多个节点来存储数据。Broker即为Kafka集群中的单个节点。

Topic:用于存储写入Kafka的数据流。如同它的字面含义——主题,不同主题的数据流最好写入不同的topic,方便后续的处理。

Partition:每个topic都有1到多个partition,便于分散到不同的borker中。多个partition的数据合并在一起组成了topic完整的数据。

Producer:消息的生产者,用来将消息写入到Kafka集群。

Consumer:消息的消费者,用来读取Kafka中的消息并进行处理。

虽然Kafka被广泛应用于各种流处理系统做数据源,但Samza可以更好的发挥Kafka架构的优势。根据官网的解释,Samza由三个层次组成:

数据流层
执行层
处理层
支持三个层次的组件分别为:

Kafka
YARN
Samza API
也就是说,Samza使用Kafka提供了数据流,使用YARN进行资源管理,自身仅提供了操作数据流的API。Samza对Kafka和YARN的依赖在很多方面上与MapReduce对HDFS和YARN的依赖相似。

如果已经拥有Hadoop集群和Kafka集群环境,那么使用Samza作为流处理系统无疑是一个非常好的选择。由于可以很方便的将处理过的数据再次写入Kafka,Samza尤其适合不同团队之间合作开发,处理不同阶段的多个数据流。

五、混合处理系统:批处理和流处理

一些处理框架既可以进行批处理,也可以进行流处理。这些框架可以使用相同或相关的API处理历史和实时数据。当前主流的混合处理框架主要为Spark和Flink。

虽然专注于一种处理方式可能非常适合特定场景,但是混合框架为数据处理提供了通用的解决方案。

http://bigdata.51cto.com/art/201709/550663.ht
大数据处理框架的类型、比较和选择
Apache Spark

如果说如今大数据处理框架处于一个群星闪耀的年代,那Spark无疑就是所有星星中最闪亮的那一颗。Spark由加州大学伯克利分校AMP实验室开发,最初的设计受到了MapReduce思想的启发,但不同于MapReduce的是,Spark通过内存计算模型和执行优化大幅提高了对数据的处理能力(在不同情况下,速度可以达到MR的10-100倍,甚至更高)。相比于MapReduce,Spark具有如下优点:

提供了内存计算模型RDD(Resilient Distributed Dataset,弹性分布式数据集),将数据读入内存中生成一个RDD,再对RDD进行计算。并且每次计算结果可以缓存在内存中,减少了磁盘IO。因此很适用于迭代计算。

不同于MapReduce的MR模型,Spark采用了DAG编程模型,将不同步骤的操作串联成一个有向无环图,可以有效减少任务间的数据传递,提高了性能。

提供了丰富的编程模型,可以轻松实现过滤、连接、聚合等操作,代码量相比MapReduce少到令人发指,因此可以提高开发人员的生产力。

支持Java、Scala、Python和R四种编程语言,为不同语言的使用者降低了学习成本。

而Spark的流处理能力,则是由Spark Streaming模块提供的。Spark在设计之初与MapReduce一样是用于批处理系统,为了适应于流处理模式,Spark提出了微批次(Micro-Batch)的概念,即把一小段时间内的接入数据作为一个微批次来处理。这样做的优点是在设计Spark Streaming时可以很大程度上重用批处理模块(Spark Core)的代码,开发人员也不必学习两套编程模型。但缺点就是,与Storm等原生的流处理系统相比,Spark Streaming的延时会相对高一些。

除了最初开发用于批处理的Spark Core和用于流处理的Spark Streaming,Spark还提供了其他编程模型用于支持图计算(GraphX)、交互式查询(Spark SQL)和机器学习(MLlib)。

但Spark也不是没有缺点。在批处理领域,由于内存是比硬盘更昂贵的资源,所以Spark集群的成本比MapReduce集群更高。而在流处理领域,微批次的架构使得它的延时要比Storm等流处理系统略高。不过瑕不掩瑜,Spark依然是如今最炙手可热的数据处理框架。

该架构包括以下组件:
»Stream / Event Processing
» Oracle Stream Explorer 持续处理传入数据、分析和完善模式,并在检测到情况时引发事件。Stream
Explorer 在开放服务网关 (OSGi) 容器中运行,可在任何 Java 运行时环境中工作。它提供了一个业务级
用户界面,允许在不掌握底层事件技术特征的情况下解释数据流。.它可以在内部部署,也可以在
Oracle 公有云中部署(物联网云服务)。

猜你喜欢

转载自blog.csdn.net/sinat_26566137/article/details/82670206