当前位置:   article > 正文

Flink 内容分享(一):Fink原理、实战与性能优化(一)_flink原理、实战与性能优化(1)

flink原理、实战与性能优化

分治法在大数据处理中的应用不仅有助于提高处理效率,还可以充分利用分布式计算和存储资源,从而更好地应对大数据量和复杂性。然而,在应用分治法时需要考虑合适的数据分割策略、任务调度、结果合并等问题,以确保分治法的正确性和性能。

然而,分布式计算也带来了一些挑战,如数据一致性、通信开销、任务调度等问题,需要综合考虑各种因素来设计和优化分布式系统。同时,分布式计算也需要开发者具备分布式系统设计和调优的知识和技能,以确保系统的性能和稳定性。

分布式存储

当数据量巨大且单机存储已无法满足需求时,分布式存储和分布式文件系统成为处理大数据的关键技术。下面我会详细介绍分布式存储和分布式文件系统的概念、特点和常见的实现。

分布式存储:

分布式存储是将数据分散存储在多个节点上,以提供高容量、高性能、高可靠性和可扩展性的数据存储解决方案。每个节点都可以通过网络访问数据,并且多个节点协同工作来处理数据请求。分布式存储的核心目标是解决单机存储的瓶颈,同时提供高可靠性和可用性。

分布式存储的特点包括:

  • 横向扩展性: 可以通过增加节点来扩展存储容量和性能,适应不断增长的数据量和负载。
  • 高可靠性和容错性: 数据在多个节点上冗余存储,当某个节点出现故障时,数据依然可用,不会丢失。
  • 数据分布和复制: 数据按照一定策略分布在不同节点上,数据的复制确保了数据的可用性和容错性。
  • 并发访问和高性能: 支持多个客户端同时访问数据,实现高并发和更好的性能。
  • 灵活的数据模型: 支持多种数据类型和访问方式,如文件系统、对象存储、键值存储等。
分布式文件系统:

分布式文件系统是一种特殊类型的分布式存储,主要用于存储和管理文件数据。它提供了类似于传统单机文件系统的接口,但是在底层实现上,数据被分散存储在多个节点上。分布式文件系统能够自动处理数据的分布、复制、一致性和故障恢复等问题。

常见的分布式文件系统特点包括:

  • 命名空间和路径: 分布式文件系统通过路径来访问文件,类似于传统文件系统的目录结构。
  • 数据分布和复制: 文件被切分成块并分散存储在多个节点上,同时进行数据复制以实现冗余和高可用性。
  • 一致性和数据一致性模型: 分布式文件系统需要保证数据的一致性,不同节点上的数据副本需要保持同步。
  • 访问控制和权限管理: 提供用户和应用程序访问控制和权限管理功能,确保数据安全性。
  • 高性能: 分布式文件系统通常优化了数据的读写性能,以满足大数据场景的需求。
  • 扩展性: 可以通过增加节点来扩展存储容量和性能。

常见的分布式文件系统包括:

  • Hadoop HDFS(Hadoop Distributed File System): Hadoop生态系统中的分布式文件系统,适用于大数据存储。
  • Ceph: 开源的分布式存储系统,提供块存储、文件系统和对象存储。
  • GlusterFS: 开源的分布式文件系统,可以线性扩展存储容量和性能。

总之,分布式存储和分布式文件系统在大数据时代扮演着重要角色,帮助我们存储、管理和访问海量的数据,解决了传统单机存储无法应对的挑战。

批处理和流处理

批处理和流处理是大数据处理领域中常见的两种数据处理模式,用于不同类型的数据处理需求。下面将详细介绍这两种模式,并给出相关的应用场景示例。

批处理(Batch Processing):

批处理是指将一批数据集合在一起,在一个固定的时间间隔内对这批数据进行处理和分析。批处理通常适用于数据量较大、处理周期较长、要求高一致性的场景。

特点:

  • 数据被集中处理,适合周期性分析和报告生成。
  • 数据被切分成小块,每个小块在一个作业中被处理。
  • 数据处理时间较长,不适合实时性要求高的场景。

应用场景示例:

  1. 离线数据分析: 对历史数据进行分析,从中发现趋势、模式和规律,用于业务决策。例如,销售数据分析、用户行为分析。
  2. 批量推荐系统: 基于用户历史行为数据,定期生成推荐结果。例如,电影推荐、商品推荐。
  3. 数据清洗和预处理: 对大规模数据进行清洗、过滤和预处理,提高数据质量和可用性。例如,清理无效数据、填充缺失值。
  4. 大规模ETL(Extract, Transform, Load): 将数据从源系统中抽取出来,经过转换和加工后加载到目标系统。例如,数据仓库的构建。
流处理(Stream Processing):

流处理是指在数据生成的时候立即进行处理,实现数据的实时处理和分析。流处理通常适用于数据实时性要求高、需要快速响应的场景。

特点:

  • 数据是实时流动的,需要快速处理和响应。
  • 数据是持续不断地到达,需要实时计算和分析。
  • 可能会遇到延迟和数据乱序等问题。

应用场景示例:

  1. 实时监控和告警: 对实时数据进行监控和分析,及时发现异常并触发告警。例如,网络流量监控、系统性能监控。
  2. 实时数据分析: 对流式数据进行实时分析,从中提取有价值的信息。例如,实时点击流分析、实时市场行情分析。
  3. 实时推荐系统: 基于用户实时行为数据,实时生成推荐结果。例如,新闻推荐、广告推荐。
  4. 实时数据仓库: 构建实时数据仓库,将实时数据集成、加工和分析。例如,实时销售数据分析、实时用户行为分析。

总之,批处理和流处理分别适用于不同类型的数据处理需求,根据业务需求和实时性要求选择合适的处理模式。

开源大数据技术

当谈论大数据处理时,Hadoop、YARN、Spark和Flink都是重要的技术。它们都属于大数据领域的分布式计算框架,但在功能和使用方式上有所不同。

Hadoop:

Hadoop是一个开源的分布式存储和计算框架,最初由Apache开发,用于处理大规模数据集。Hadoop的核心组件包括:

  1. Hadoop Distributed File System(HDFS): HDFS是一种分布式文件系统,用于存储大规模数据。它将数据分成多个块,并将这些块分散存储在集群中的不同节点上。HDFS支持高可靠性、冗余存储和数据复制。
  2. MapReduce: MapReduce是Hadoop的计算模型,用于处理分布式数据。它将计算任务分成Map和Reduce两个阶段,分布在集群中的节点上并行执行。Map阶段负责数据的拆分和处理,Reduce阶段负责数据的汇总和计算。
YARN (Yet Another Resource Negotiator)

YARN是Hadoop的资源管理器,它负责集群资源的管理和分配。YARN将集群资源划分为容器(Containers),并分配给不同的应用程序。这种资源的隔离和管理允许多个应用程序同时在同一个Hadoop集群上运行,从而提高了资源利用率和集群的多租户能力。

Spark:

Apache Spark是一个通用的分布式计算引擎,旨在提供高性能、易用性和多功能性。与传统的Hadoop MapReduce相比,Spark具有更快的执行速度,因为它将数据加载到内存中并进行内存计算。Spark支持多种计算模式,包括批处理、交互式查询、流处理和机器学习。

Spark的主要特点和组件包括:

  1. RDD(Resilient Distributed Dataset): RDD是Spark的核心数据抽象,表示分布式的数据集。RDD支持并行操作和容错性,可以在计算过程中重新计算丢失的分区。
  2. Spark SQL: Spark SQL是用于处理结构化数据的组件,支持SQL查询和操作。它能够将RDD和传统的数据源(如Hive)无缝集成。
  3. Spark Streaming: Spark Streaming是用于处理实时流数据的模块,支持微批处理模式。它能够将实时数据流分割成小批次并进行处理。
  4. MLlib: MLlib是Spark的机器学习库,提供了常见的机器学习算法和工具,用于训练和评估模型。
  5. GraphX: GraphX是Spark的图计算库,用于处理图数据和图算法。
Flink:

Apache Flink是一个流式处理引擎和分布式批处理框架,具有低延迟、高吞吐量和容错性。Flink支持流批一体化,能够实现实时流处理和批处理作业的无缝切换。它的核心特点包括:

  1. DataStream API: Flink的DataStream API用于处理实时流数据,支持事件时间处理、窗口操作和状态管理。它能够处理高吞吐量的实时数据流。
  2. DataSet API: Flink的DataSet API用于批处理作业,类似于Hadoop的MapReduce。它支持丰富的操作符和优化技术。
  3. Stateful Stream Processing: Flink支持有状态的流式处理,可以在处理过程中保存和管理状态。这对于实现复杂的数据处理逻辑很有用。
  4. Event Time Processing: Flink支持事件时间处理,能够处理乱序事件并准确计算窗口操作的结果。
  5. Table API和SQL: Flink提供了Table API和SQL查询,使开发人员可以使用类似SQL的语法来查询和分析数据。
  6. 可以连接大数据生态圈各类组件,包括Kafka、Elasticsearch、JDBC、HDFS和Amazon S3
  7. 可以运行在Kubernetes、YARN、Mesos和独立(Standalone)集群上。

Flink在流处理上的几个主要优势如下:

  1. 真正的流计算引擎:Flink具有更好的streaming计算模型,可以进行非常高效的状态运算和窗口操作。Spark Streaming仍然是微批处理引擎。
  2. 更低延迟:Flink可以实现毫秒级的低延迟处理,而Spark Streaming延迟较高。
  3. 更好的容错机制:Flink支持更细粒度的状态管理和检查点机制,可以实现精确一次的状态一致性语义。Spark较难做到确保exactly once。
  4. 支持有限数据流和无限数据流:Flink可处理有开始和结束的有限数据流,也能处理无限不断增长的数据流。Spark Streaming更适合有限数据集。
  5. 更易统一批处理和流处理:Flink提供了DataStream和DataSet API,可以轻松统一批处理和流处理。Spark需要联合Spark SQL使用。
  6. 更优秀的内存管理:Flink具有自己的内存管理,可以根据不同查询优化内存使用。Spark依赖Hadoop YARN进行资源调度。
  7. 更高性能:在部分场景下,Flink拥有比Spark Streaming更高的吞吐和低的延迟。

总体来说,Flink作为新一代流处理引擎,在延迟、容错、易用性方面优于Spark Streaming。但Spark生态更加完善,也在努力减小与Flink的差距。需要根据具体场景选择最优的框架。

总的来说,Flink在流处理领域的优势主要体现在事件时间处理、低延迟、精确一次语义和状态管理等方面。这些特性使得Flink在处理实时流数据时能够更好地满足复杂的业务需求,特别是对于需要高准确性和可靠性的应用场景。

Flink 部署

Apache Flink在1.7版本中进行了重大的架构重构,引入了Master-Worker架构,这使得Flink能够更好地适应不同的集群基础设施,包括Standalone、Hadoop YARN和Kubernetes等。下面会详细介绍一下Flink 1.7版本引入的Master-Worker架构以及其在不同集群基础设施中的适应性。

Master-Worker架构:

Flink 1.7版本中引入的Master-Worker架构是为了解决之前版本中存在的一些问题,如资源管理、高可用性等。在这个架构中,Flink将任务管理和资源管理分离,引入了JobManager和ResourceManager两个主要角色。

  • JobManager: 负责接受和调度任务,维护任务的状态和元数据信息,还负责处理容错机制。JobManager分为两种:JobManager(高可用模式)和StandaloneJobManager(非高可用模式)。
  • ResourceManager: 负责管理集群中的资源,包括分配任务的资源、维护资源池等。

这种架构的优势在于解耦任务的管理和资源的管理,使得Flink能够更好地适应不同的集群环境和基础设施。

兼容性:

Flink的Master-Worker架构设计使其能够兼容几乎所有主流信息系统的基础设施,包括:

  • Standalone集群: 在Standalone模式下,Flink的JobManager和ResourceManager都运行在同一个进程中,适用于简单的开发和测试场景。
  • Hadoop YARN集群: Flink可以部署在现有的Hadoop YARN集群上,通过ResourceManager与YARN ResourceManager进行交互,实现资源管理。
  • Kubernetes集群: Flink还支持在Kubernetes集群中部署,通过Kubernetes提供的资源管理能力来管理任务和资源。

这种兼容性使得Flink可以灵活地在不同的集群环境中运行,满足不同场景下的需求。

总之,Flink在1.7版本中引入的Master-Worker架构使其在资源管理、高可用性等方面有了更好的表现,同时也使得Flink能够更好地适应各种不同的集群基础设施,包括Standalone、Hadoop YARN和Kubernetes等。这为Flink的部署和使用带来了更多的灵活性和选择性。

Standalone集群是Apache Flink中一种简单的部署模式,适用于开发、测试和小规模应用场景。下面我将详细介绍Standalone集群的特点以及部署方式。

Standalone集群的特点:

  1. 简单部署: Standalone集群是Flink的最简单部署模式之一,不需要依赖其他集群管理工具,可以在单个机器上部署。
  2. 资源共享: Standalone集群中的JobManager和TaskManager共享同一份资源,例如内存和CPU。这使得资源管理相对简单,但也可能在资源竞争时影响任务的性能。
  3. 适用于开发和测试: Standalone集群适用于开发和测试阶段,可以在本地机器上模拟Flink集群环境,方便开发人员进行调试和测试。
  4. 不支持高可用性: Standalone集群默认情况下不支持高可用性,即不具备故障恢复和任务迁移的能力。如果需要高可用性,可以通过运行多个JobManager实例来实现。
Standalone集群的部署方式:
  1. 安装Flink: 首先,需要下载并安装Flink。可以从官方网站下载预编译的二进制文件,解压到指定目录。也可以从以下网站下载:

apache-flink安装包下载_开源镜像站-阿里云 (aliyun.com)(https://mirrors.aliyun.com/apache/flink/)

图片

  1. 配置Flink: 进入Flink的安装目录,修改conf/flink-conf.yaml配置文件。主要配置项包括jobmanager.rpc.addresstaskmanager.numberOfTaskSlots等。
  2. 启动JobManager: 打开终端,进入Flink安装目录,执行以下命令启动JobManager:
./bin/start-cluster.sh

  • 1
  • 2
  1. 启动TaskManager: 打开终端,进入Flink安装目录,执行以下命令启动TaskManager:
./bin/taskmanager.sh start

  • 1
  • 2
  1. 提交作业: 使用Flink客户端工具提交作业。可以使用以下命令提交JAR文件中的作业:
./bin/flink run -c your.main.Class ./path/to/your.jar

  • 1
  • 2
  1. 停止集群: 可以使用以下命令停止整个Standalone集群:
./bin/stop-cluster.sh

  • 1
  • 2

总之,Standalone集群是一个简单且易于部署的Flink集群模式,适用于开发、测试和小规模应用场景。然而,由于其资源共享和不支持高可用性的特点,不适合部署在生产环境中。

下面提供利用Docker部署flink standalone简单集群。

Docker部署flink简单集群

Flink程序可以作为集群内的分布式系统运行,也可以以独立模式或在YARN、Mesos、基于Docker的环境和其他资源管理框架下进行部署。

1、在服务器创建flink目录
mkdir flink

  • 1
  • 2

目录的结构如下:

2、docker-compose.yml脚本创建

docker 容器的编排文件,具体如下

3、启动flink

(1)后台运行

一般推荐生产环境下使用该选项。

docker-compose up -d

  • 1
  • 2

(2)前台运行

控制台将会同时打印所有容器的输出信息,可以很方便进行调试。

docker-compose up

  • 1
  • 2
4、浏览器上查看页面dashboard

访问web界面

http://cdh1:8081/

  • 1
  • 2

Flink快速应用

通过一个单词统计的案例,快速上手应用Flink,进行流处理(Streaming)和批处理(Batch)

实操1:单词统计案例(批数据)
1.1 需求

统计一个文件中各个单词出现的次数,把统计结果输出到文件

步骤:1、读取数据源 2、处理数据源

a、将读到的数据源文件中的每一行根据空格切分

b、将切分好的每个单词拼接1

c、根据单词聚合(将相同的单词放在一起)

d、累加相同的单词(单词后面的1进行累加)

3、保存处理结果

1.2 代码实现
  • 引入依赖
<!--flink核心包-->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-java</artifactId>
    <version>1.7.2</version>
</dependency>
<!--flink流处理包-->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java_2.12</artifactId>
    <version>1.7.2</version>
    <scope>provided</scope>
</dependency> 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • Java程序
package com.crazymaker.bigdata.wordcount.batch;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.operators.FlatMapOperator;
import org.apache.flink.api.java.operators.UnsortedGrouping;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

/**
   * 1、读取数据源
   * 2、处理数据源
   *  a、将读到的数据源文件中的每一行根据空格切分
   *  b、将切分好的每个单词拼接1
   *  c、根据单词聚合(将相同的单词放在一起)
   *  d、累加相同的单词(单词后面的1进行累加)
   * 3、保存处理结果
   */
public class WordCountJavaBatch {
    public static void main(String[] args) throws Exception {
        String inputPath="D:\\data\\input\\hello.txt";
        String outputPath="D:\\data\\output\\hello.txt";

        //获取flink的运行环境
        ExecutionEnvironment executionEnvironment = ExecutionEnvironment.getExecutionEnvironment();
        DataSet<String> text = executionEnvironment.readTextFile(inputPath);
        FlatMapOperator<String, Tuple2<String, Integer>> wordOndOnes = text.flatMap(new SplitClz());

        //0代表第1个元素
        UnsortedGrouping<Tuple2<String, Integer>> groupedWordAndOne = wordOndOnes.groupBy(0);
        //1代表第1个元素
        AggregateOperator<Tuple2<String, Integer>> out = groupedWordAndOne.sum(1);

        out.writeAsCsv(outputPath, "\n", " ").setParallelism(1);//设置并行度
        executionEnvironment.execute();//人为调用执行方法

    }

    static class SplitClz implements FlatMapFunction<String,Tuple2<String,Integer>>{

        public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
            String[] s1 = s.split(" ");
            for (String word:s1) {
                collector.collect(new Tuple2<String,Integer>(word,1));//发送到下游

            }

        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

源文件的内容

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

String,Integer>(word,1));//发送到下游

}

}
    }
}


源文件的内容


![](https://img-blog.csdnimg.cn/direct/dfd1aa3d24dc4d2b81e16f1a37a12611.png)





[外链图片转存中...(img-78xIT9Zn-1714230263165)]
[外链图片转存中...(img-NObikc0Q-1714230263166)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/607514
推荐阅读
相关标签
  

闽ICP备14008679号