月光族必学讨饭技巧,超实用后悔没早点发现

 Linux基础命令

pwd 命令

格式:pwd

功能:显示当前所在目录(即工作目录)。 

 ls 命令

格式:ls [选项] [文件|目录]

功能:显示指定目录中的文件或子目录信息。当不指定文件或目录时,显示 当前工作目录中的文件或子目录信息。

命令常用选项如下: -a :全部的档案,连同隐藏档( 开头为 . 的档案) 一起列出来。 -l :长格式显示,包含文件和目录的详细信息。 -R :连同子目录内容一起列出来。 说明:命令“ls –l”设置了别名:ll,即输入 ll 命令,执行的是 ls –l 4 命令。

 cd 命令

格式:cd

功能:用于切换当前用户所在的工作目录,其中路径可以是绝对路径也可以 是相对路径。

  

mkdir 命令

格式: mkdir [选项] 目录

功能:用于创建目录。创建目录前需保证当前用户对当前路径有修改的权 限。参数 -p 用于创建多级文件夹。 

  

rm 命令

格式: rm [选项]

功能:用于删除文件或目录,常用选项-r -f,-r 表示删除目录,也可以用于 删除文件,-f 表示强制删除,不需要确认。删除文件前需保证当前用户对当 前路径有修改的权限。  

 cp 命令

格式: cp [选项]

功能:复制文件或目录。

 mv 命令

格式:mv [选项]

功能:移动文件或对其改名。常用选项-i -f -b,-i 表示若存在同名文件,则向用户 询问是否覆盖;-f 直接覆盖已有文件,不进行任何提示;-b 当文件存在时,覆盖 前为其创建一个备份。

cat 命令

格式:cat [选项] [文件]

功能:查看文件内容。

常用选项:-n 显示行号(空行也编号)。 

tar 命令

格式:tar [选项] [档案名] [文件或目录]

功能:为文件和目录创建档案。利用 tar 命令,可以把一大堆的文件和目录 全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便 于网络传输是非常有用的。该命令还可以反过来,将档案文件中的文件和目 录释放出来。

常用选项: -c 建立新的备份文件。 -C 切换工作目录,先进入指定目录再执行压缩/解压缩操作,可用于 仅压缩特定目录里的内容或解压缩到特定目录。 -x 从归档文件中提取文件。 -z 通过 gzip 指令压缩/解压缩文件,文件名为*.tar.gz。 -f 指定备份文件。 -v 显示命令执行过程。  

 useradd 命令

格式:useradd 用户名 10

功能:创建新用户,该命令只能由 root 用户使用。

passwd 命令

格式:passwd 用户名

功能:设置或修改指定用户的口令。 

 chown 命令

格式:chown [选项]

功能:将文件或目录的拥有者改为指定的用户或组,用户可以是用户名或者 用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件 列表支持通配符。选项“-R”表示对目前目录下的所有文件与子目录进行相同 的拥有者变更。

chmod 命令

格式:chmod [-R] 模式 文件或目录

功能:修改文件或目录的访问权限。选项“-R”表示递归设置指定目录下的所 有文件和目录的权限。 模式为文件或目录的权限表示,有三种表示方法。 (1) 数字表示 用 3 个数字表示文件或目录的权限,第 1 个数字表示所有者的权限,第 2个 数字表示与所有者同组用户的权限,第 3 个数字表示其他用户的权限。每类 用户都有 3 类权限:读、写、执行,对应的数字分别是 4、2、1。一个用户 的权限数字表示为三类权限的数字之和,如一个用户对 A 文件拥有读写权 限,则这个用户的权限数字为 6(4+2=6)。 

 (2)字符赋值 用字符 u 表示所有者,用字符 g 表示与所有者同组用户,用字符 o 表示其他 用户。用字符 r、w、x 分别表示读、写、执行权限。用等号“=”来给用户赋 权限。

(3)字符加减权限 用字符 u 表示所有者,用字符 g 表示与所有者同组用户,用字符 o 表示其他 用户。用字符 r、w、x 分别表示读、写、执行权限。用加号“+”来给用户加 权限,加号“-”来给用户减权限。 

su 命令

格式:su [-] 用户名

功能:将当前操作员的身份切换到指定用户。如果使用选项“-”,则用户切换 后使用新用户的环境变量,否则环境变量不变。 

命令模式

用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被 vi 识别为命令,而非输入字符。以下是常用的几个命令: i 切换到输入模式,以输入字符。 x 删除当前光标所在处的字符。 : 切换到末行模式,用以在最底一行输入命令 

输入模式 13

在输入模式下可以对文件执行写操作,编写完成后按 Esc 键即可返回命令模式。

末行模式

如果要保存、查找或者替换一些内容等,就需要进入末行模式。

以下是常用的几个命 令: Set nu:每一行显示行号 r 文件名:读取指定的文件。 w 文件名:将编辑内容保存到指定的文件内。 q:退出 vi wq:保存文件并退出 vi q!:强制退出 vi,不管是否保存文档内容。

clear 命令

格式:clear

功能:清除屏幕。实质上只是让终端显示页向后翻了一页,如果向上滚动屏 幕还可以看到之前的操作信息。 

 hostname 命令

格式:hostname [选项]

功能:用于显示和设置系统的主机名称。在使用 hostname 命令设置主机名 后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机 名。如果需要永久修改主机名,需要同时修改/etc/hostname 的相关内容。 常用选项: -a 显示主机别名,-i 显示主机的 ip 地址。

hostnamectl 命令

格式 1:hostnamectl 功能:显示当前主机的名称和系统版本。

格式 2:hostnamectl set-hostname 功能:永久设置当前主机的名称。

ip 命令

CentOS 7 已不使用 ifconfig 命令,其功能可通过 ip 命令代替。

格式 1:ip link dev 功能:对网络设备(网卡)进行操作,选项 add、delete、show、set 分别对 应增加、删除、查看和设置网络设备。

格式 2:ip address dev 功能:对网卡的网络协议地址(IPv4/IPv6)进行操作,选项 add、change、 del、show 分别对应增加、修改、删除、查看 IP 地址。 示例: #这里将 address 缩写为 addr  

 步骤五:systemctl 命令 格式:systemctl service_name.service 功能:管理系统中的服务,“.service”表示管理的服务均包含了一个 以 .service 结尾的文件,存放于 /lib/systemd/目录中,可以省略。命令选项 有 start、restart、reload、stop、status,分别对应服务的启动、重启、重 新加载、停止和显示状态。另外选项 enable 表示开机时启动,disable 表示 撤销开机启动。

#启动网络服务 

#关闭防火墙,注意 CentOS 7 的防火墙服务名称改为 firewalld 

#查看 ssh 服务的状态

 #设置 ssh 服务开机启动

reboot 命令

格式: reboot

功能:用于重新启动计算机,但是机器重启必须要 root 用户才有权限。 注意:本操作无需在平台系统执行

poweroff 命令

格式:poweroff

功能:用来关闭计算机操作系统并且切断系统电源。如果确认系统中已经没 有用户存在且所有数据都已保存,需要立即关闭系统,可以使用 poweroff 命令。 注意:本操作无需在平台系统执行

export 命令

格式:export [选项] [变量名]

功能:用于将 Shell 变量输出为环境变量,或者将 Shell 函数输出为环境变 量。一个变量创建时,它不会自动地为在它之后创建的 Shell进程所知,而 命令export 可以向后面的 Shell 传递变量的值。当一个Shell 脚本调用并执行 时,它不会自动得到父脚本(调用者)里定义的变量的访问权,除非这些变 量已经被显式地设置为可用。export 命令可以用于传递一个或多个变量的值 到任何子脚本。 

常用选项: -f 代表[变量名称]中为函数名称。 -n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行 环境中。 -p 列出所有的 Shell 赋予程序的环境变量。

echo 命令

格式:echo [字符串]

功能:用于在终端设备上输出字符串或变量提取后的值。一般使用在变量前 加上$符号的方式提取出变量的值,例如:$PATH然后再用 echo 命令予以 出。 

示例: #输出一段字符串 LinuxCool.com

 示例: #输出一段字符串 LinuxCool.com

source 命令

格式:source [文件]

功能:用于重新执行刚修改的初始化文件,使之立即生效,而不必注销用 户,重新登录。 

Hadoop 生态圈

Hadoop是目前应用最为广泛的分布式大数据处理框架,其具备可靠、高效、可伸缩等特点。
Hadoop的核心组件是HDFS、MapReduce。随着处理任务不同,各种组件相继出现,丰富Hadoop生态圈,目前生态圈结构大致如图所示:

 根据服务对象和层次分为:数据来源层、数据传输层、数据存储层、资源管理层、数据计算层、任务调度层、业务模型层。

1、HDFS(分布式文件系统)

HDFS是整个hadoop体系的基础,负责数据的存储与管理。HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。

client:切分文件,访问HDFS时,首先与NameNode交互,获取目标文件的位置信息,然后与DataNode交互,读写数据

NameNode:master节点,每个HDFS集群只有一个,管理HDFS的名称空间和数据块映射信息,配置相关副本信息,处理客户端请求。

DataNode:slave节点,存储实际数据,并汇报状态信息给NameNode,默认一个文件会备份3份在不同的DataNode中,实现高可靠性和容错性。

Secondary NameNode:辅助NameNode,实现高可靠性,定期合并fsimage和fsedits,推送给NameNode;紧急情况下辅助和恢复NameNode,但其并非NameNode的热备份。

Hadoop 2为HDFS引入了两个重要的新功能 ——Federation和高可用(HA):

Federation允许集群中出现多个NameNode,之间相互独立且不需要互相协调,各自分工,管理自己的区域。 DataNode 被用作通用的数据块存储设备。每个 DataNode 要向集群中所有NameNode 注册,并发送心跳报告,执行所有 namenode的命令。

HDFS中的高可用性消除了Hadoop 1中存在的单点故障,其中,NameNode故障将导致集群中断。HDFS的高可用性提供故障转移功能(备用节点从失败的主NameNode接管工作的过程)以实现自动化。

2、MapReduce(分布式计算框架)

MapReduce是一种基于磁盘的分布式并行批处理计算模型,用于处理大数据量的计算。其中Map对应数据集上的独立元素进行指定的操作,生成键-值对形式中间,Reduce则对中间结果中相同的键的所有值进行规约,以得到最终结果。

Jobtracker:master节点,只有一个,管理所有作业,任务/作业的监控,错误处理等,将任务分解成一系列任务,并分派给Tasktracker。

Tacktracker:slave节点,运行 Map task和Reduce task;并与Jobtracker交互,汇报任务状态。

Map task:解析每条数据记录,传递给用户编写的map()函数并执行,将输出结果写入到本地磁盘(如果为map—only作业,则直接写入HDFS)。

Reduce task:从Map 它深刻地执行结果中,远程读取输入数据,对数据进行排序,将数据分组传递给用户编写的Reduce()函数执行。

3、Spark(分布式计算框架)

Spark是一种基于内存的分布式并行计算框架,不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

Cluster Manager:在standalone模式中即为Master主节点,控制整个集群,监控worker。在YARN模式中为资源管理器

Worker节点:从节点,负责控制计算节点,启动Executor或者Driver。

Driver: 运行Application 的main()函数

Executor:执行器,是为某个Application运行在worker node上的一个进程

Spark将数据抽象为RDD(弹性分布式数据集),内部提供了大量的库,包括Spark Core、Spark SQL、Spark Streaming、MLlib、GraphX。 开发者可以在同一个应用程序中无缝组合使用这些库。

Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的

Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。

Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据,通过短时批处理实现的伪流处理。

MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。

GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作

4、Flink(分布式计算框架)

Flink是一个基于内存的分布式并行处理框架,类似于Spark,但在部分设计思想有较大出入。对 Flink 而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个极限特例而已。

Flink VS Spark

Spark中,RDD在运行时是表现为Java Object,而Flink主要表现为logical plan。所以在Flink中使用的类Dataframe api是被作为第一优先级来优化的。但是相对来说在spark RDD中就没有了这块的优化了。

Spark中,对于批处理有RDD,对于流式有DStream,不过内部实际还是RDD抽象;在Flink中,对于批处理有DataSet,对于流式我们有DataStreams,但是是同一个公用的引擎之上两个独立的抽象,并且Spark是伪流处理,而Flink是真流处理。

5、Yarn/Mesos(分布式资源管理器)

YARN是下一代MapReduce,即MRv2,是在第一代MapReduce基础上演变而来的,主要是为了解决原始Hadoop扩展性较差,不支持多计算框架而提出的。

Mesos诞生于UC Berkeley的一个研究项目,现已成为Apache项目,当前有一些公司使用Mesos管理集群资源,比如Twitter。与yarn类似,Mesos是一个资源统一管理和调度的平台,同样支持比如MR、steaming等多种运算框架。

6、Zookeeper(分布式协作服务)

解决分布式环境下的数据管理问题:统一命名,状态同步,集群管理,配置同步等。

Hadoop的许多组件依赖于Zookeeper,它运行在计算机集群上面,用于管理Hadoop操作。

7、Sqoop(数据同步工具)

Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之前传输数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。

Sqoop利用数据库技术描述数据架构,用于在关系数据库、数据仓库和Hadoop之间转移数据。

8、Hive/Impala(基于Hadoop的数据仓库)

Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务在Hadoop上执行。通常用于离线分析。

HQL用于运行存储在Hadoop上的查询语句,Hive让不熟悉MapReduce开发人员也能编写数据查询语句,然后这些语句被翻译为Hadoop上面的MapReduce任务。

Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎。 它是一个用C ++和Java编写的开源软件。 与Apache Hive不同,Impala不基于MapReduce算法。 它实现了一个基于守护进程的分布式架构,它负责在同一台机器上运行的查询执行的所有方面。因此执行效率高于Apache Hive。

9、HBase(分布式列存储数据库)

HBase是一个建立在HDFS之上,面向列的针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。

HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。

HBase提供了对大规模数据的随机、实时读写访问,同时,HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。

10、Flume(日志收集工具)

Flume是一个可扩展、适合复杂环境的海量日志收集系统。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。

同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。此外,Flume还具有能够将日志写往各种数据目标(可定制)的能力。

Flume以Agent为最小的独立运行单位,一个Agent就是一个JVM。单个Agent由Source、Sink和Channel三大组件构成

 Source:从客户端收集数据,并传递给Channel。

Channel:缓存区,将Source传输的数据暂时存放。

Sink:从Channel收集数据,并写入到指定地址。

Event:日志文件、avro对象等源文件。

11、Kafka(分布式消息队列)

Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。实现了主题、分区及其队列模式以及生产者、消费者架构模式。

生产者组件和消费者组件均可以连接到KafKa集群,而KafKa被认为是组件通信之间所使用的一种消息中间件。KafKa内部氛围很多Topic(一种高度抽象的数据结构),每个Topic又被分为很多分区(partition),每个分区中的数据按队列模式进行编号存储。被编号的日志数据称为此日志数据块在队列中的偏移量(offest),偏移量越大的数据块越新,即越靠近当前时间。生产环境中的最佳实践架构是Flume+KafKa+Spark Streaming。

12、Oozie(工作流调度器)

Oozie是一个可扩展的工作体系,集成于Hadoop的堆栈,用于协调多个MapReduce作业的执行。它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现。

Oozie工作流是放置在控制依赖DAG(有向无环图 Direct Acyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。

Oozie使用hPDL(一种XML流程定义语言)来描述这个图。

Spark及其生态圈

一、 Spark简介

Spark是加州大学伯克利分校AMP实验室开发的通用大数据处理框架。其生态系统也称为BDAS,力图在算法(Algorithms)、机器(Machines)和人(People)三者之间通过大规模集成来展现大数据应用的一个开源平台。

Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集。Spark具有运行速度快、易用性好、通用性强和随处运行等特点。

运行速度快:Spark基于内存计算,相对于Hadoop性能提高了几十倍,而其主要原因正是因为Spark基于内存计算和引入DAG执行引擎。
易用性好:Spark不仅支持Scala编写应用程序,而且支持Java和Python等语言进行编写。(Scala是一种高效、可扩展的语言,能够用简介的代码处理较为复杂的工作。)
通用性强:Spark生态圈中的组件:Spark Core提供内存计算框架,Spark SQL的即席查询,Spark Streaming的实时处理,MLlib的机器学习和GraphX的图处理。它们都是有AMP实验室提供,能够无缝地集成,并提供一站式解决平台。
随处运行:Spark具有很强的适应性,能够读取HDFS,HBase,S3和Tachyon为持久层读写原生数据;能够以Mesos,YARN和自身携带的Standalone作为资源管理器调度作业来完成Spark应用程序的计算。

二、Spark生态系统

Spark 生态系统以Spark Core 为核心,能够读取传统文件(如文本文件)、HDFS、Amazon S3、Alluxio 和NoSQL 等数据源,利用Standalone、YARN 和Mesos 等资源调度管理,完成应用程序分析与处理。这些应用程序来自Spark 的不同组件,如Spark Shell 或Spark Submit 交互式批处理方式、Spark Streaming 的实时流处理应用、Spark SQL 的即席查询、采样近似查询引擎BlinkDB 的权衡查询、MLbase/MLlib 的机器学习、GraphX 的图处理和SparkR 的数学计算等,如下图所示,正是这个生态系统实现了“One Stack to Rule Them All”目标。 (在这里只介绍Spark Core、Spark SQL以及Spark Streaming)

1、Spark Core

Spark Core 是整个Spark生态系统的核心组件,是一个分布式大数据处理框架。Spark Core提供了多种资源调度管理,通过内存计算、有向无环图(DAG)等机制保证分布式计算的快速,并引入了RDD 的抽象保证数据的高容错性,其重要特性描述如下:

Spark Core提供了多种运行模式,不仅可以使用自身运行模式处理任务,如本地模式、Standalone,而且可以使用第三方资源调度框架来处理任务,如YARN、MESOS等。相比较而言,第三方资源调度框架能够更细粒度管理资源。
Spark Core提供了有向无环图(DAG)的分布式并行计算框架,并提供内存机制来支持多次迭代计算或者数据共享,大大减少迭代计算之间读取数据的开销,这对于需要进行多次迭代的数据挖掘和分析性能有极大提升。另外在任务处理过程中移动计算而非移动数据(数据本地性),RDDPartition 可以就近读取分布式文件系统中的数据块到各个节点内存中进行计算。
在Spark 中引入了RDD的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”对它们进行重建,保证了数据的高容错性。

2、Spark SQL

Spark SQL 的前身是Shark,它发布时Hive 可以说是SQL on Hadoop 的唯一选择(Hive 负责将SQL 编译成可扩展的MapReduce 作业),鉴于Hive 的性能以及与Spark 的兼容,Shark 由此而生。 
  Shark 即Hive on Spark,本质上是通过Hive 的HQL 进行解析,把HQL 翻译成Spark 上对应的RDD 操作,然后通过Hive 的Metadata 获取数据库里的表信息,实际为HDFS 上的数据和文件,最后由Shark 获取并放到Spark 上运算。Shark 的最大特性就是速度快,能与Hive 的完全兼容,并且可以在Shell 模式下使用rdd2sql 这样的API,把HQL 得到的结果集继续在Scala环境下运算,支持用户编写简单的机器学习或简单分析处理函数,对HQL 结果进一步分析计算。 
  在2014 年7 月1 日的Spark Summit 上,Databricks 宣布终止对Shark 的开发,将重点放到Spark SQL 上。在此次会议上,Databricks 表示,Shark 更多是对Hive 的改造,替换了Hive 的物理执行引擎,使之有一个较快的处理速度。然而,不容忽视的是,Shark 继承了大量的Hive代码,因此给优化和维护带来大量的麻烦。随着性能优化和先进分析整合的进一步加深,基于MapReduce 设计的部分无疑成为了整个项目的瓶颈。因此,为了更好的发展,给用户提供一个更好的体验,Databricks 宣布终止Shark 项目,从而将更多的精力放到Spark SQL 上。 
  Spark SQL 允许开发人员直接处理RDD,同时也可查询在 Hive 上存在的外部数据。SparkSQL 的一个重要特点是能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL 命令进行外部查询,同时进行更复杂的数据分析。其特点如下:

引入了新的RDD 类型SchemaRDD,可以像传统数据库定义表一样来定义SchemaRDD。 SchemaRDD由定义了列数据类型的行对象构成。SchemaRDD 既可以从RDD 转换过 来,也可以从Parquet 文件读入,还可以使用HiveQL从Hive 中获取。
内嵌了Catalyst 查询优化框架,在把SQL 解析成逻辑执行计划之后,利用Catalyst 包里的一些类和接口,执行了一些简单的执行计划优化,最后变成RDD 的计算。
为什么Spark SQL 的性能会得到这么大的提升呢?主要是Spark SQL 在以下几点做了优化。 

字节码生成技术(Bytecode Generation):Spark 1.1.0 在Catalyst 模块的Expressions 
增加了Codegen 模块,使用动态字节码生成技术,对匹配的表达式采用特定的代码动态编译。另外对SQL 表达式都做了CG 优化。CG优化的实现主要还是依靠Scala 2.10运行时的反射机制(Runtime Reflection)。
Scala 代码优化:Spark SQL 在使用Scala编写代码的时候,尽量避免低效的、容易GC的代码;尽管增加了编写代码的难度,但对于用户来说接口统一。
内存列存储(In-Memory Columnar Storage):Spark SQL 的表数据在内存中存储不是采用原生态的JVM对象存储方式,而是采用内存列存储。

3、Spark Streaming

Spark Streaming 是一个对实时数据流进行高吞吐、高容错的流式处理系统,可以对多种数据源(如Kafka、Flume、Twitter 和ZeroMQ 等)进行类似Map、Reduce 和Join 等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘,如下图:

相比其他的处理引擎要么只专注于流处理,要么只负责批处理(仅提供需要外部实现的流处理API 接口),而Spark Streaming 最大的优势是提供的处理引擎和RDD 编程模型可以同时进行批处理与流处理。 
  对于传统流处理中一次处理一条记录的方式而言,Spark Streaming 使用的是将流数据离散化处理(Discretized Streams),通过该处理方式能够进行秒级以下的数据批处理。在SparkStreaming 处理过程中,Receiver 并行接收数据,并将数据缓存至Spark 工作节点的内存中。经过延迟优化后,Spark 引擎对短任务(几十毫秒)能够进行批处理,并且可将结果输出至其他系统中。与传统连续算子模型不同,其模型是静态分配给一个节点进行计算,而Spark 可基于数据的来源以及可用资源情况动态分配给工作节点。

mapreduce的运行框架

1、框架图

Input→Mapper→shuffle→Reducer→Output

2、Input数据输入

2.1概念

(1)数据块(Block),物理存储,Block是HDFS物理上把文件分成一块一块。数据块是HDFS存储数据单位。

(2)数据切片,逻辑存储,数据切片是MapReduce程序j最小计算输入数据的单位。一个切片会启动一个MapTask

2.2数据切片与MapTask并行度

(1)一个Job的Map阶段并行度由客户端在提交job时的切片数决定;

(2)每一个split切片分配一个MapTask并行实例片

(3)切片是针对每一个文件单独切片

(4)默认情况下,切片大小等于Block Size块大小

        MapTask数据=输入文件切片数据

2.3切片过程

(1)程序先找到数据存储目录

(2)开始遍历处理目录下的每一个文件

        A、按每个文件进行切片

        B、判断文件是否可以切片(snappy、Gzip压缩不能切)

(3)遍历第一个文件

获取文件大小→计算切片大小→开始切片→将切片信息写入切片规划文件中→提交切片规划文件到yarn

        A、获取文件大小:fs.size(文件)

        B、计算切片大小:设置minsize、maxsize、blocksize

mapreduce.input.fileinputformat.split.minsize=1 默认值为1
mapreduce.input.fileinputformat.split.maxsize=Long.MAXValue 默认值Long.MAXValue

1️⃣计算公式 :computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))
        最大取最小,最小取最大。因此切片大小默认与 HDFS 的 block 保持一致。

2️⃣maxsize(切片最大值): 参数如果调到比 blocksize 小,则会让切片变小,而且就等于配置的这个参数的值。
3️⃣minsize(切片最小值): 参数调的比 blockSize 大,则可以让切片变得比 blocksize 还大。
        C、开始切片:getSplit()

        每次切片时,都要判断剩下的是否大于块的1.1倍,不大于1.1倍就切分成一块切片        

        D、将切片信息写入切片规划文件中:job.split

        记录起始位置、长度、所在切点列表等

        E、提交切片规划文件到yarn

        yarn上MRAppMaster根据切片规划计算MapTask数

        三个文件:切片规则文件(job.split)、参数配置文件(job.xml)、程序jar包

 2.4类图
2.5TextInputFormat

(1)是FileInputFormat默认的实现类

(2)按行读取每条记录,Key为该行在整个文件的超始字节偏移量,LongWritable型。Value为行内容,不包括任何终止符(换行符、回车符),Text型。

 2.6CombineTextInputFormat

(1)应用场景:用于小文件过多的场景,将多个小文件从逻辑上规划到一个切片中, 这样多个小文件交给一个MapTask处理;

(2)虚拟存储切片最大值默认4M,最好根据实际的小文件大小来设置

        CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);

2.7Read阶段

MapTask通过InputFormat获得RecordReader,从输入InputSplit中解析出一个个Key/Value

3、Map阶段

将解析出来的Key/Value交给用户编写的map()函数处理,并产生一系列新的Key/Value

4、Collect收集阶段

(1)map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果

(2)在该函数内部,它会将生成的Key/Value分区(调用Partitioner),并写入一个环形内存缓冲区中

5、Shuffle阶段

(1)map方法之后 ,reduce方法之前的数据处理过程称之为Shuffle;

(2)环形内存缓冲区

(3)Partition分区-默认分区

        A、根据需求按照条件输出到不同分区

        B、默认分区:根据key的hashcode对ReduceTask数理取模

        C、默认的ReduceTask的数量为1,对应参数mapreduce.job.reduces

(4)Partition分区-自定义Partitioner

        A、自定义类继承Partitioner<key,value>,重写getPartition()方法 

   B、在job驱动中,设置自定义partitioner,job.setPartitionerClass(自定义分区类.class)

   C、自定义Partition后,要根据自定义Partitioner的逻辑设置相应的数量的ReduceTask:job.setNumReduceTasks(数量)

(5)Partition分区总结

        A、如果ReduceTask数量 > getPartition()结果数,则会多产生几个空的输出文件

        B、如果 1 < ReduceTask数量 < getPartition()结果数,则有一部分分区数据无处安放,会异常       

        C、如果ReduceTask数量=1,则不管MapTask输出多少个分区文件,最终结果只有一个ReduceTask,只会产生一个结果文件。(分区数不大于1,不会走默认hash分区器和自定义分区器,直接返回)

        D、分区号必须从0开始,逐一累加

(6)排序

        A、排序是MapReduce框架中最重要的操作之一 

        B、MapTask和ReduceTask均会对数据按key进行排序,该 操作属于Hadoop的默认行为 。任务应用程序中的数据均会被排序,而不管逻辑上是否需要。

        C、默认排序是按照字典顺序排序,排序的方法为快速排序

        D、排序分类:部分排序、全排序、辅助排序、二次排序

(7)溢写

        A、当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件

(8)Combiner

        A、Combiner是MR程序中Mapper和Reducer之外的一种组件

        B、Combiner的父类是Reducer

        C、Combiner与Reducer区别:在于运行的位置 ,Combiner是在每一个MapTask所在节点运行,即在分区、排序后准备溢写前可以进行combiner。Reducer是接收全局所有MapTask输出结果。

        D、Combiner的意义是对每一个MapTask的输出进行局部汇总,以减少网络传输量

        E、Combiner应用前提是不影响最终的业务逻辑 

(9)Meger

        A、MapTask以分区为单位进行合并,对所有临时文件合并成一个大文件(output/file.out),同时生成相应索引文件(output/file.out.index)

        B、对某个分区采用多轮递归合并的方式,每次合并默认10个文件,每个MapTask最终得到一个大文件

6、ReduceTask

(1)Copy阶段

        ReduceTask从各个MapTask上远程拷贝一片数据,如大小超过阀值,则写到磁盘上,否则直接放在内存中

(2)Sort阶段

        由于各个MapTask已经实现了对自己处理结果进行了局部排序,因此ReduceTask只需要对所有数据进行一次归并排序即可

(3)Reducer阶段

        reduce()函数将计算结果写到HDFS上

(4)其他

        A、ReduceTask数量默认是1,可手动设置job.setNumReduceTasks(数量)

        B、ReduceTask=0,表示没有reduce阶段,输出文件个数和Map个数一致

        C、如果数据分布不均匀,就会在reduce阶段产生数据倾斜

        D、ReduceTask数量并不能任意设置,要考虑业务逻辑需求,具体多少个ReduceTask,需要根据集群性能确定

        E、如果分区数不是1,但ReduceTask为1,不执行分区过程(执行分区的前提是判断ReduceNum个数是否大于1)

MapReduce与spark的区别 

1、运行环境

        MR运行在YARN上

        Spark支持多种运行模式:

​​​​​​​

2、计算速度

MR与Spark的根本区别(关键优化)在于:Spark除了需要shuffle的计算,其他都是将结果/中间结果持久化在内存中,而MR是都需要落地到磁盘(map,reduce 落地都写),因此Spark格外适用于频繁读写中间结果的迭代计算。

而MR最终落地HDFS,Spark如果落地,会落地节点磁盘,因此如果只是简单的非迭代计算,MR组最终只会比Spark多消耗一部分(HDFS不同DataNode间的)网络IO。

 2.1 磁盘I/O

因此,速度区别之一在于磁盘I/O,即:

MR的map端将中间输出和结果存储在磁盘中,reduce端又需要从磁盘读写中间结果,势必造成磁盘IO成为瓶颈。

Spark允许将map端的中间输出和结果存储在内存中,reduce端在拉取中建结果时避免了大量的磁盘IO。

 2.2 并行度

此外,速度区别之二在于任务的并行度不同:

Spark会增加任务的并行度从而提高速度:由于将中间结果写到磁盘与从磁盘读取中建结果属于不同的环节,MR只是将他们简单的通过串行执行衔接起来。而Spark把不同的环节抽象为Stage,允许多个Stage既可以串行执行,也可以并行执行。

3、资源

MR是基于进程,Spark是基于线程。MR是多进程模型,而Spark是多线程模型。

Spark是粗粒度资源申请模式,而MR是细粒度资源申请模式。

3.1资源分配与共享

MapReduce每分到一个任务会启动一个进程,每个task相互独立,申请资源和申请数据,再到计算完成结果存储都是独立进行的。

而spark的所有任务都只在一个进程中,每来一个任务启动一个线程,线程可以理解成在进程的基础之上又细分的更小的任务。同节点的任务运行在一个进程中,也就是运行在一个JVM中,共享内存和资源,也就是数据和资源都可以共用,不必频繁的调用数据和申请注销资源,这就非常适合进行内存密集型任务和低延迟性作业。同节点中的多线程会存在资源争抢的现象,难以细粒度的控制每个任务所应用的资源。

在资源控制上自然mr的单线程做的更好,毕竟它不存在争抢和控制。

3.2资源申请与释放

多进程模型便于细粒度控制每个任务占用的资源,但会消耗较多的启动时间,不适合运行低延迟类型的作业,这是MapReduce广为诟病的原因之一。而多线程模型则相反,任务启动速度快,与之相反的是MapReduce Task进程的慢启动速度,通常需要1s左右。

简单说,Spark的多个task跑在同一个进程上,这个进程会伴随spark应用程序的整个生命周期,即使没有作业进行,进程也是存在的。MR的每一个task都是一个进程,当task完成时,进程也会结束。

所以,Spark比MR快的原因也在这,MR启动就会进行更细粒度的资源申请,即需要时申请资源,用完就销毁。缺点就是申请销毁都需要时间,并且不存在任务的并行。

但是spark把进程拿到以后,这个进程会一直存在,即使没有job在跑,所以后边的job可以直接启动,不需要再重新申请资源,但缺点也是Spark更加占用资源。

4、容错

Spark容错性更高,它通过弹性分布式数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读性质的数据集,这些集合是弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;MR的话也有容错,但是是以失败后重跑map task,reduce task的方式,成本相对较高。
Spark由于更细粒度的stage划分,也能够避免部分重复计算:当 Stage 中某个分区的 Task 执行失败后,Spark会重新对此 Stage 调度,但在重新调度的时候,会过滤已经执行成功的分区任务,所以不会造成重复计算和资源浪费。而MR如果task执行失败,就会重跑整个map/reduce task任务。

5、功能适用

Spark更加功能更加丰富:Spark提供了transformation和action(转换算子和行动算子)这两大类的多个功能的算子,另外还有流式处理Spark Streaming模块,离线计算Spark SQL、图计算GraphX等;MR只提供了map和reduce两种算子,流计算以及其他模块的支持比较缺乏。

6、生态

Spark框架和生态更为复杂,首先由RDD、血缘lineage、执行时的有向无环图DAG、stage划分等等。Spark作业都需要根据不同的业务场景的需要进行调优,以达到性能要求,MR框架及其生态相对较为简单,对性能的要求也相对较弱。

 结构化数据和非结构化数据

一、结构化数据

结构化的数据是指可以使用关系型数据库表示和存储,表现为二维形式的数据。一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。举一个例子:

所以,结构化的数据的存储和排列是很有规律的,这对查询和修改等操作很有帮助。

但是,它的扩展性不好。比如,如果字段不固定,利用关系型数据库也是比较困难的,有人会说,需要的时候加个字段就可以了,这样的方法也不是不可以,但在实际运用中每次都进行反复的表结构变更是非常痛苦的,这也容易导致后台接口从数据库取数据出错。你也可以预先设定大量的预备字段,但这样的话,时间一长很容易弄不清除字段和数据的对应状态,即哪个字段保存有哪些数据。

二、半结构化数据

半结构化数据是结构化数据的一种形式,它并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层。因此,它也被称为自描述的结构。

半结构化数据,属于同一类实体可以有不同的属性,即使他们被组合在一起,这些属性的顺序并不重要。

常见的半结构数据有XML和JSON,对于对于两个XML文件,第一个可能有

第二个可能为:

​​​​​​​

从上面的例子中,属性的顺序是不重要的,不同的半结构化数据的属性的个数是不一定一样的。有些人说半结构化数据是以树或者图的数据结构存储的数据,怎么理解呢?上面的例子中,<person>标签是树的根节点,<name>和<gender>标签是子节点。通过这样的数据格式,可以自由地表达很多有用的信息,包括自我描述信息(元数据)。所以,半结构化数据的扩展性是很好的。 

三、非结构化数据

非结构化数据是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据。包括所有格式的办公文档、文本、图片、各类报表、图像和音频/视频信息等等。

非结构化数据其格式非常多样,标准也是多样性的,而且在技术上非结构化信息比结构化信息更难标准化和理解。所以存储、检索、发布以及利用需要更加智能化的IT技术,比如海量存储、智能检索、知识挖掘、内容保护、信息的增值开发利用等。

四、应用场景

结构化数据,简单来说就是数据库。结合到典型场景中更容易理解,比如企业ERP、财务系统;医疗HIS数据库;教育一卡通;政府行政审批;其他核心数据库等。这些应用需要哪些存储方案呢?基本包括高速存储应用需求、数据备份需求、数据共享需求以及数据容灾需求。

非结构化数据,包括视频、音频、图片、图像、文档、文本等形式。具体到典型案例中,像是医疗影像系统、教育视频点播、视频监控、国土GIS、设计院、文件服务器(PDM/FTP)、媒体资源管理等具体应用,这些行业对于存储需求包括数据存储、数据备份以及数据共享等。

半结构化数据,包括邮件、HTML、报表、资源库等等,典型场景如邮件系统、WEB集群、教学资源库、数据挖掘系统、档案系统等等。这些应用对于数据存储、数据备份、数据共享以及数据归档 等基本存储需求。

冷备/热备/温备

热备(在线备份):在数据库运行时直接备份,对数据库操作没有任何影响。
冷备(离线备份):在数据库停止时进行备份。
温备:在数据库运行时加全局读锁备份,保证了备份数据的一致性,但对性能有影响。

 热备流程

  1. 备份开始时,记录重做日志的日志序号(LSN)。
  2. 复制共享表空间和独立表空间的文件。
  3. 复制完后,再次记录重做日志的日志序号(LSN)。
  4. 通过前面记录的日志序号来复制在备份时产生的重做日志

数据库热备与冷备的优缺点:

热备份的优点:

1.可在表空间或数据文件级备份,备份时间短。

2.备份时数据库依然可以使用。

3.可达到秒级恢复,能够恢复到某一个时间点上。

4.恢复的速度很快,在大多数情况下在数据库工作时就可恢复。

5.几乎所有的数据库实体都可以进行恢复。

热备份的缺点:

1.尽量不要出错,否则后果会很严重。

2.如果热备份不成功,所得结果不可用于时间点的数据恢复。

3.维护的工作比较困难。

冷备份的优点:

1.是非常快速的备份方法,因为只需要拷贝文件即可

2.容易归档,容易恢复到某个时间点上(只需将文件再拷贝回去即可)

3.能与归档方法相结合,作数据库(最新状态)的恢复。

4.容易维护,且比较安全。

冷备份的缺点:

1.单独使用时,只能提供到"某一时间点的上"的恢复。

2.再实施备份的全过程中,数据库必须是关闭状态。

3.不能按表或按用户恢复。

注意:

冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的。而且在恢复后一定要把数据库文件的属组和属主改为mysql。

  • 43
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值