zoukankan      html  css  js  c++  java
  • 大数据应用开发

    1.大数据的概念

    维基百科的定义: 大数据是指利用常用软件工具捕获、管理和处理数据所耗时间超过可容忍时间的数据集。

    2.大数据主流技术

    数据采集:

    • 使用Flume,可进行流式日志数据的收集。
    • 使用Sqoop可以交互关系型数据库,进行导入导出数据。
    • 使用爬虫技术,可在网上爬取海量网页数据。

    数据存储与管理:

          大数据利用分布式文件系统HDFS、HBase、Hive,实现对结构化、半结构化和非结构化数据的存储和管理。

    数据处理与分析:

          利用分布式并行编程模型和计算框架,结合机器学习和数据挖掘算法,实现对海量数据的处理和分析。

    3.场景化解决方案

    在面对不同的场景时,会使用不同的大数据组件去解决处理,主要有如下大数据场景化解决方案。

    • 离线批处理
    • 实时检索
    • 实时流处理
    • 融合数仓

    3.1 离线批处理

          离线批处理,是指对海量历史数据进处理和分析,生成结果数据,供下一步数据应用使用的过程。离线批处理对数据处理的时延要求不高,但是处理的数据量较大,占用的计算存储资源较多,通常通过MR作业、Spark作业或者HQL作业实现。

    离线批处理的特点:

    • 处理时间要求不高
    • 处理数据量巨大
    • 处理数据格式多样
    • 占用计算存储资源多

    离线处理常用的组件:

    • HDFS:分布式文件系统,为各种批处理引擎提供数据存储,可以存储各种文件格式数据。
    • YARN:资源调度引擎,为各种批处理引擎提供资源调度能力。
    • MapReduce:大数据批处理引擎,用于处理海量数据,但是处理速度较慢。
    • Hive:大数据SQL批处理引擎,用于处理SQL类批处理作业,但是处理速度较慢。
    • Spark:基于内存的数据处理引擎,适合海量数据,处理速度高效。
    • Spark SQL:Spark处理结构化数据的一个模块。

    HDFS介绍

    HDFS(Hadoop Distributed File System)基于Google发布的GFS论文设计开发。 其除具备其它分布式文件系统相同特性外,HDFS还有自己特有的特性:

    • 高容错性:认为硬件总是不可靠的。
    • 高吞吐量:为大量数据访问的应用提供高吞吐量支持。
    • 大文件存储:支持存储TB-PB级别的数据。

    HDFS适合:大文件存储与访问 流式数据访问

    HDFS不适合:大量小文件存储 随机写入 低延迟读取

    HDFS回收站机制:

    • 在HDFS里,删除文件时,不会真正的删除,其实是放入回收站,回收站里的文件可以用来快速恢复误删文件。
    • 可以设置一个时间阀值(单位:分钟),当回收站里文件的存放时间超过这个阀值或是回收站被清空时,文件才会被彻底删除,并且释放占用的数据块。
    • Hadoop回收站trash,默认是关闭的,若开启需要修改配置文件core-site.xml。

    Hive概述

    Hive是基于Hadoop的数据仓库软件,可以查询和管理PB级别的分布式数据。

    Hive特性:

    • 灵活方便的ETL (Extract/Transform/Load)。
    • 支持MapReduce、Tez、Spark多种计算引擎。
    • 可直接访问HDFS文件以及HBase。
    • 易用易编程。

    Hive函数:

    查看系统函数的用法:show functions;

    显示函数的用法:desc function upper;

    详细显示函数的用法:desc function extended upper;

    当Hive提供的内置函数无法满足业务处理需要时,此时就可以考虑使用用户自定义函数,编写处理代码并在查询中使用。

    • UDF(User-Defined-Function) 用于接收单个数据行,并产生一个数据行作为输出。
    • UDAF(User-Defined Aggregation Function) 用于接收多个数据行,并产生一个数据行作为输出。
    • UDTF(User-Defined Table-Generating Functions) 用于接收单个数据行,并产生多个数据行作为输出。

    Hive调优

    数据倾斜

        数据倾斜指计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。

        日常使用过程中,容易造成数据倾斜的原因可以归纳为如下几点:

    • group by
    • distinct count(distinct xx)
    • join

    调优参数:

    在map中会做部分聚集操作,效率更高但需要更多的内存。

    set hive.map.aggr=true;

    此时生成的查询计划会有两个MRJob,可实现数据倾斜时负载均衡。

    set hive.groupby.skewindata=true;

    当连接一个较小和较大表的时候,把较小的表直接放到内存中去,然后再对较大的表进行map操作。

    set hive.auto.convert.join=true;

    每个查询会被Hive转化为多个阶段,当有些阶段关联性不大时,可以并行化执行,减少整个任务的执行时间。

    开启任务并行执行:

    set hive.exec.parallel=true;

    设置同一个sql允许并行任务的最大线程数(例如设置为8个):

    set hive.exec.parallel.thread.number=8;

    数据集市和数据仓库的区别:

    数据集市

         数据集市(Data Mart) ,也叫数据市场,数据集市就是满足特定的部门或者用户的需求,按照多维的方式进行存储,包括定义维度、需要计算的指标、维度的层次等,生成面向决策分析需求的数据立方体。

    数据仓库

          为满足各类零散分析的需求,通过数据分层和数据模型的方式,并以基于业务和应用的角度将数据进行模块化的存储。

    数据仓库分层:

    • ODS层:原始数据层。
    • DWD层:结构和粒度与原始表保持一致,简单清洗。
    • DWS层:以DWD为基础,进行轻度汇总。
    • ADS层:为各种统计报表提供数据。

    分层的优点:

    • 复杂问题简单化,将任务分解成多个步骤完成,每一层只处理单一的步骤,比较简单,并且方便定位问题。
    • 减少重复开发,规范数据分层,通过中间层数据,减少最大的重复计算,增加一次计算结果的复用性。
    • 隔离原始数据,避免数据异常或者数据敏感,使真实数据与统计数据解耦。

    Spark简介

        Spark是基于内存的分布式批处理系统,它把任务拆分,然后分配到多个的CPU上进行处理,处理数据时产生的中间产物(计算结果)存放在内存中,减少了对磁盘的I/O操作,大大的提升了数据的处理速度,在数据处理和数据挖掘方面比较占优势。

    Spark应用场景

    • 数据处理(Data Processing):可以用来快速处理数据,兼具容错性和可扩展性。
    • 迭代计算(Iterative Computation):支持迭代计算,有效应对复杂的数据处理逻辑。
    • 数据挖掘(Data Mining):在海量数据基础上进行复杂的挖掘分析,可支持多种数据挖掘和机器学习算法。
    • 流式处理(Streaming Processing):支持秒级延迟的流处理,可支持多种外部数据源。
    • 查询分析(Query Analysis):支持SQL的查询分析,同时提供领域特定语言(DSL)以方便操作结构化数据,并支持多种外部数据源。

    Spark对比MapReduce

    • 性能上提升了100倍。
    • Spark的中间数据放在内存中,对于迭代运算的效率更高;进行批处理时更高效,同时有着更低的延迟。
    • Spark提供更多的数据集操作类型,编程模型比MapReduce更灵活,开发效率更高。
    • 更高的容错能力(血统机制)。

    RDD

    RDD是分布式弹性数据集,可以理解一个存储数据的数据结构。Spark会把所要操作的数据,加载到RDD上,即RDD所有操作都是基于RDD来进行的。RDD是只读和可分区。要想对RDD进行操作,只能重新生成一个新的RDD。

    • 从HDFS输入创建,或从与Hadoop兼容的其他存储系统中输入创建。
    • 从父的RDD转换的到新的RDD。
    • 从数据集合转换而来,通过编码实现。

    RDD的存储:

    • 用户可以选择不同的存储级别缓存RDD以便重用。
    • 当前RDD默认是存储于内存,但当内存不足时,RDD会溢出到磁盘中。

    Shuffle

    Shuffle 是划分 DAG 中 stage 的标识,同时影响 Spark 执行速度的关键步骤

    • RDD 的 Transformation 函数中,分为窄依赖(narrow dependency)和宽依赖(wide dependency)的操作.
    • 窄依赖跟宽依赖的区别是是否发生Shuffle(洗牌) 操作。

    窄依赖

    窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用。 表现为: 一个父RDD的每一个分区对应于一个子RDD分区。

    宽依赖

    宽依赖是指父RDD的每个分区都可能被多个子RDD分区所使用。 表现为: 父RDD的每个分区都被多个子RDD分区使用

    Transformation

    Transformation是RDD的算子类型,它的返回值还是一个RDD。

    Transformation操作属于懒操作(算子),不会真正触发RDD的处理计算。

    变换方法的共同点:

    • 不会马上触发计算。
    • 每当调用一次变换方法,都会产生一个新的RDD。

    例如:map(func),flatMap(func)

    Action

    Action是RDD的算子,它的返回值不是一个RDD。Action操作是返回结果或者将结果写入存储的操作。Action是Spark应用启动执行的触发动作,得到RDD的相关计算结果或将RDD保存到文件系统中。

    SparkConf

    SparkConf是用来对Spark进行任务参数配置的对象。 是通过键值对的形式,设置Spark任务执行时所需要的参数。 Spark读取任务参数的优先级是: 代码配置>动态参数>配置文件。

    SparkContext

    SparkContext是Spark的入口,相当于应用程序的main函数。

    SparkContext表示与Spark集群的连接,可用于在该集群上创建RDD,记录计算结果和环境配置等信息。

    SparkSession

    Spark2.0中引入了SparkSession的概念,为用户提供了一个统一的切入点来使用Spark的各项功能。

    封装了SparkConf和SparkContext对象,方便用户使用Spark的各种API。

    SparkSQL简介

    SparkSQL是Spark用来处理结构化数据的一个模块,可以在Spark应用中直接使用SQL语句对数据进行操作。

    SQL语句通过SparkSQL模块解析为RDD执行计划,交给SparkCore执行。

    通过SparkSession提交SQL语句。任务像普通Spark应用一样,提交到集群中分布式运行。

    JDBC:

    • 应用加载JDBC驱动,然后统一提交到集群的JDBCServer执行。
    • JDBCServer是单点服务,会成为任务执行的瓶颈,不能处理海量数据和高并发任务。

    DataSet:

    • DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象
    • DataSet以Catalyst逻辑执行计划表示,并且数据以编码的二进制形式存储,不需要反序列化就可以执行sort、filter、shuffle等操作。
    • Dataset是“懒惰”的,只在执行action操作时触发计算。当执行action操作时,Spark用查询优化程序来优化逻辑计划,并生成一个高效的并行分布式的物理计

    SparkSQL使用场景

    适合: 结构化数据处理。 对数据处理的实时性要求不高的场景 需要处理PB级的大容量数据。

    不适合: 实时数据查询。

    3.2 实时检索

          实时检索简而言之就是对系统内的一些信息根据关键词进行即时、快速搜索,实现即搜即得的效果。强调的是实时低延迟。

    实时检索的特点:

    • 检索性能要求高,基于主键的检索需要在1秒内响应,基于非主键的检索需要在3秒内响应,不承担复杂查询和统计类查询
    • 高并发查询,通常有大于100的并发查询
    • 数据量大,PB级数据量,集群规模在1000节点以上。对图数据库的场景,点个数在10亿以上,边个数在100亿以上
    • 支持结构化和非结构化,需要同时保存结构化数据和非结构化数据,经常用来对图片等小文件进行检索
    • 高效的数据加载,数据加载要求高,每小时可以加载TB级数据
    • 支持图检索,支持检索图数据,支持图标准查询接口

     3.3 实时流处理

          实时流处理,通常是指对实时数据源进行快速分析,迅速触发下一步动作的场景。实时数据对分析处理速度要求极高,数据处理规模巨大,对CPU和内存要求很高,但是通常数据不落地,对存储量要求不高。实时处理,通常通过Structured Streaming或者Flink任务实现。

    实时流处理的特点:

    • 处理速度快:端到端处理需要达到秒级,流处理平台负责的数据采集和数据处理要在1秒内完成。如风控项目要求单条数据处理时间达到秒级,单节点TPS大于2000。
    • 吞吐量高:需在短时内接收并处理大量数据记录,吞吐量需要达到数十兆/秒/节点。
    • 抗震性强:为应对数据源端业务数据产生速度会突然出现峰值的情形,需提供数据缓存机制。
    • 可靠性高:网络、软件等故障发生时,需保证每条数据不丢失,数据处理不遗漏、不重复。
    • 水平扩展:当系统处理能力出现瓶颈后,可通过节点的水平扩展提升处理性能。
    • 多数据源支持:支持网络流、文件、数据库表、IOT等格式的数据源。对于文件数据源,可以处理增量数据的加载。
    • 数据权限和资源隔离:消息处理、流处理需要有数据权限控制,不同的作业、用户可以访问、处理不同的消息和数据。多种流处理应用之间要进行资源控制和隔离,防止发生资源争抢。
    • 第三方工具对接:支持与第三方规则引擎、决策系统、实时推荐系统等对接。

     3.4 融合数仓

  • 相关阅读:
    python实例
    date命令
    unbuntu禁用ipv6
    Oracle学习(一)
    深入浅出区块链笔记
    sqlserver索引
    Go学习(16):网络编程
    Go学习(15):并发与包
    Go学习(14):defer
    Go学习(13):异常
  • 原文地址:https://www.cnblogs.com/xiao02fang/p/14253532.html
Copyright © 2011-2022 走看看