Flink实时大数据处理技术 课件第1-3章 Apache Flink概述、Scala语言、环境搭建和应用部署_第1页
Flink实时大数据处理技术 课件第1-3章 Apache Flink概述、Scala语言、环境搭建和应用部署_第2页
Flink实时大数据处理技术 课件第1-3章 Apache Flink概述、Scala语言、环境搭建和应用部署_第3页
Flink实时大数据处理技术 课件第1-3章 Apache Flink概述、Scala语言、环境搭建和应用部署_第4页
Flink实时大数据处理技术 课件第1-3章 Apache Flink概述、Scala语言、环境搭建和应用部署_第5页
已阅读5页,还剩159页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章ApacheFlink概述Flink实时大数据处理技术教学内容第一节Flink是什么第二节Flink层次架构第三节大数据处理架构的发展第四节Flink应用场景第五节生态系统和社区第六节Flink与其他大数据框架的关系教学目标知识目标了解ApacheFlink核心概念了解ApacheFlink关键特性及发展历程技能目标无毕业要求 1.工程知识ApacheFlink概述–知识点预览#节知识点难点重点应用1C01-01Flink是什么1、Flink的起源√

2、Flink的发展过程和主要版本√3、Flink的定义√4、编程语言的选择√Flink的起源ApacheFlink最早由德国柏林工业大学的研究团队于2010年开始开发,最初名为StratoSphere,该团队致力于开发一种高性能、灵活的分布式数据处理框架,以便能够在大规模数据处理和复杂数据分析方面取得突破性进展。在Stratosphere项目的早期阶段,研究团队关注于设计一个可扩展且易于使用的分布式数据处理引擎。后期开发了一个基于PACT模型的分布式运行时系统Nephele。随着项目的发展,研究团队将重点放在了实时数据流处理上,在Nephele之上构建了DataStreamAPI,以便用户可以构建复杂的流处理应用程序。随着时间的推移,Stratosphere项目在开发和推广过程种获得了广泛的认可和用户支持。2014年6月,该项目被捐赠给Apache软件基金会,正式成为了ASF(ApacheSoftwareFoundation)的顶级项目,被命名为ApacheFlink。Flink的发展过程和主要版本ApacheFlink1.0.0(2016):这是Flink的第一个重要里程碑版本。ApacheFlink1.2.0(2017):此版本引入了对事件时间(EventTime)处理的改进,提供了更加强大的窗口函数支持,并改进了操作状态(OperatorState)的实现。ApacheFlink1.5.0(2018):此版本主要关注在大规模部署场景下的性能优化和稳定性改进。ApacheFlink1.9.0(2019):此版本提供了对TableAPI和SQLAPI的大量改进。ApacheFlink1.12.0(2020):此版本继续扩展了对SQL和TableAPI的支持。ApacheFlink1.13.0(2021):这个版本进一步增强了对SQL和TableAPI的支持,包括对SQLCLI的改进、对DDL语句的扩展支持,以及对长时间运行的作业的性能优化。Flink1.15-1.16:引入了更多的SQL内置函数、窗口操作和Join支持,通过优化查询计划、使用编译器技术等方式提高了SQL引擎的执行效率和稳定性。Flink的定义Flink是一款高性能、分布式、开源的流处理框架,它能够高效地处理无界和有界数据流。Flink最大的特点是流处理,与Spark不同的是,Spark是基于批处理思想的,将流处理视为批处理的一种特殊情况,即将数据流拆分为微批处理。相比之下,Flink提供了更低的延迟和更高的吞吐量,更好地适应实时流处理的需求。此外,Flink还提供了丰富的API和运行时组件,可支持更广泛的应用场景,使得开发人员能够更加灵活地使用Flink进行数据处理。图1-1ApacheFlink官方LogoFlink的定义Flink的创新性和技术优势:真正的流处理强大的状态管理精确的时间处理易用性和高扩展性良好的生态兼容性编程语言的选择Flink提供了多样化的编程语言API,涵盖了Java、Scala、Python和SQL等多种语言。对于Java和Scala开发人员,使用Flink提供的DataStream和DataSetAPI可以获得更好的性能和灵活性。。对于Python开发人员,Flink提供了PyFlinkAPI,可以使用Python进行Flink编程。但是相比Java和ScalaAPI,PyFlink的性能较低,并且不支持所有的FlinkAPI功能。对于SQL开发人员,Flink提供了SQLAPI和TableAPI。这两种API支持标准的SQL语法和表达式,并提供了一些扩展功能,例如窗口和聚合操作。综上所述,选择编写Flink程序应该根据具体项目需求和开发人员的技术背景来选择。对于大多数情况下,建议使用Java或ScalaAPI进行开发。如果需要更加简单的数据处理,可以考虑使用SQLAPI或TableAPI。对于Python开发人员,可以使用PyFlink进行开发,但需要注意性能和API支持的限制。Flink层次架构–知识点预览#节知识点难点重点应用1C01-02Flink层次架构1、架构设计√

2、API

&

Libraries层√3、Runtime核心层√4、物理部署层√架构设计Flink采用分层的架构设计,从而保证各层在功能和职责上的清晰。如图所示,由上而下分别是API&Libraries层、Runtime核心层以及物理部署层:图1-2Flink架构设计图API&Libraries层API&Libraries层可以进行如下划分(API&Libraries组件图):在SQL和TableAPI层,提供了SQL语句支持及表格处理相关函数。图1-3API&Libraries组件图DataStreamAPI层是Flink数据处理的核心API,提供了数据读取,数据转换和数据输出等一系列常用操作的封装。StatefulStreamProcessing是最低级别的抽象,它通过ProcessFunction函数内嵌到DataS-treamAPI中。Runtime核心层Runtime核心层是Flink分布式计算框架的核心实现层,包括作业转换,任务调度,资源分配,任务执行等功能,基于这一层的实现,可以在流式引擎下同时运行流处理程序和批处理程序。Runtime核心层包括以下几个主要组件:TaskManager:是Flink的核心执行引擎,负责运行用户编写的Flink程序。JobManager:JobManager是Flink集群的管理节点,它负责接收和处理Flink程序的提交请求,并将程序的执行计划分配给TaskManager进行执行。数据缓冲区(Buffer):负责在TaskManager之间传输数据。任务调度器:负责对任务进行调度,保证每个任务在执行时都有足够的计算资源和数据资源。运行时优化器:是Flink的一个核心功能,它能够在任务运行过程中实时地对任务执行计划进行优化,以提高任务的执行效率。物理部署层Flink的物理部署层提供了多种部署模式,以适应不同的应用场景和部署环境。具体来说,支持以下几种模式:Standalone模式:在一个独立的集群中部署Flink应用程序,通常使用Flink自带的Standalone模式来实现。YARN模式:将Flink应用程序部署到YARN集群上,可以利用YARN提供的资源管理和调度功能,同时也可以实现Flink集群的高可用性。Mesos模式:将Flink应用程序部署到Mesos集群上,可以利用Mesos提供的资源管理和调度功能。Kubernetes模式:将Flink应用程序部署到Kubernetes集群上,可以利用Kubernetes提供的资源管理和调度功能,同时也可以实现Flink集群的高可用性。大数据处理架构的发展–知识点预览#节知识点难点重点应用1C01-03大数据处理架构的发展1、Flink的起源√

2、Kappa架构√3、流处理架构的发展√Flink的起源Lambda架构是一种大数据处理架构,由Twitter的数据科学家NathanMarz首次提出。它旨在解决实时大数据处理中的延迟和容错性问题,通过结合批处理和实时处理两种方式,实现对大数据的低延迟和高可靠性处理。Lambda架构的主要组成部分包括三层:数据层(DataLayer)速度层(SpeedLayer)批处理层(BatchLayer)Lambda架构的优点:低延迟高容错性高扩展性Lambda架构的缺点:复杂性数据一致性技术选型Kappa架构Kappa架构是一种大数据处理架构,专注于实时数据流处理,旨在简化Lambda架构的复杂性。Kappa架构的主要组成部分包括两层:数据层(DataLayer)流处理层(StreamProcessingLayer)Kappa架构的优点:简化架构低延迟可扩展性Kappa架构的缺点:容错性适用性流处理框架的发展早期流处理框架:如ApacheS4和Yahoo!Storm,主要关注实时数据处理。这些框架为实时数据提供了低延迟处理能力,但相对较少关注数据处理的准确性和容错性。微批处理:为了解决实时处理中的准确性和容错性问题,微批处理模式应运而生。微批处理框架,如ApacheSparkStreaming,将实时数据划分为小批量(micro-batches),然后对这些小批量进行处理。这种方法提高了数据处理的准确性和容错性,但相对牺牲了一定的延迟。状态管理和容错处理:如ApacheFlink通过引入精确一次(exactly-once)处理语义和分布式状态管理,实现了高容错性和低延迟的实时数据处理。统一批处理和流处理:如ApacheFlink和ApacheBeam,为批处理和实时数据处理提供统一的API和数据处理模型。无服务器流处理:随着云计算和无服务器(Serverless)架构的普及,一些云服务提供商开始提供无服务器流处理解决方案。例如,AWSLambda、GoogleCloudDataflow和AzureStr-eamAnalytics等。Flink应用场景–知识点预览#节知识点难点重点应用1C01-04Flink应用场景1、事件驱动型应用√

2、数据分析应用√3、数据管道应用√4、行业应用√Flink数据处理流程ApacheFlink功能强大,支持开发和运行多种不同种类的应用程序,其主要应用主要可以分为三大类,包括:事件驱动型应用、数据分析应用、数据管道应用:除了这三大核心应用场景外,ApacheFlink还在不同行业领域中展现出了其强大的实时数据处理能力图1-4Flink数据处理流程图数据驱动型应用事件驱动型应用是一种具有状态的应用,它可以从一个或多个事件流中提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。如下图所示,传统应用和事件驱动型应用架构之间的区别:传统应用中,计算和存储是分离的,而事件驱动型应用中则是紧密耦合的。这种紧密的耦合关系能够为应用带来更高的性能和可靠性。事件驱动型应用无须查询远程数据库,本地数据访问使得它具有更高的吞吐和更低的延迟。典型的事件驱动型应用包括:反欺诈、异常检测、基于规则的报警、业务流程监控等。图1-5传统应用和事件驱动型应用架构图数据分析应用数据分析应用旨在从原始数据中提取有价值的信息和指标。借助流处理引擎,可以实时地进行数据分析。与传统查询不同,流式处理程序会接入实时事件流,并随着事件消费持续产生和更新结果。这些结果数据可以写入外部数据库系统或以内部状态的形式维护。实时报表或大屏应用可以相应地从外部数据库读取数据或直接查询应用的内部状态。ApacheFlink同时支持流式和批量分析应用,如下图所示(批量分析应用和流式分析应用图)。典型的数据分析应用包括:电信网络质量监控、移动应用中的产品更新及实验评估分析、消费者技术中的实时数据即席分析、大规模图分析。图1-6批量分析应用和流式分析应用图数据管道应用提取-转换-加载(ETL)是一种在存储系统之间进行数据转换和迁移的常用方法。数据管道和ETL作业的用途相似,都可以转换、丰富数据,并将其从某个存储系统移动到另一个。但数据管道是以持续流模式运行,而非周期性触发。因此它支持从一个不断生成数据的源头读取记录,并将它们以低延迟移动到终点。如下图所示(周期性ETL作业和持续数据管道的差异图)。和周期性ETL作业相比,持续数据管道可以明显降低将数据移动到目的端的延迟。典型的数据管道应用包括:电子商务中的实时查询索引构建、电子商务中的持续ETL。图1-7周期性ETL作业和持续数据管道的差异图行业应用在中国,许多领先的互联网公司都在使用Flink处理大量实时数据。以下是一些在中国和全球范围内使用Flink的知名互联网公司:阿里巴巴:阿里巴巴是Flink在中国最大的应用者之一。阿里巴巴在其各个业务领域,如电商、金融、物流等,广泛使用Flink进行实时数据处理和分析。还积极为Flink社区贡献代码,推动了Flink的发展和优化。腾讯:腾讯是另一个在中国大规模使用Flink的互联网巨头。腾讯在其广告、游戏、社交和金融等业务中使用Flink处理大量实时数据。腾讯还将Flink与其自身的技术栈相结合,以满足特定业务需求。百度:百度在搜索、推荐、安全等业务领域广泛应用Flink进行实时数据处理。百度将Flink与自家的大数据生态系统相结合,以提高数据处理效率和应用性能。网易:网易在游戏、电商和教育等业务领域使用Flink进行实时数据处理。网易利用Flink提供的实时数据处理能力,实现了对业务数据的实时监控、分析和优化。行业应用在全球范围内,有许多知名的互联网公司也在使用Flink处理大量实时数据,例如:Uber:Uber在其实时数据平台中大规模使用Flink,用于实时计费、实时调度、实时监控和实时分析等场景。Netflix:Netflix使用Flink进行实时数据处理,以提供实时推荐、实时监控和实时分析等服务。Lyft:Lyft使用Flink进行实时数据处理,以支持实时定价、实时调度和实时分析等场景。Yelp:Yelp利用Flink进行实时数据处理,用于实时搜索、实时推荐和实时监控等业务场景。Flink生态系统和社区–知识点预览#节知识点难点重点应用1C01-05Flink生态系统和社区1、Flink的生态系统和相关工具√

2、Flink的社区和贡献者√Flink的生态系统和相关工具Flink的生态系统由多个项目和工具组成,这些项目和工具提供了各种功能和扩展,让Flink在不同的场景下得以应用。FlinkCDCFlinkCDC支持多种常见的关系型数据库,如MySQL、PostgreSQL、Oracle、SQLServer等。采用binlog、WAL等技术,实现了高效、低延迟的数据捕获和传输。同时,FlinkCDC提供了丰富的数据源和Sink,可以与Flink的流处理引擎无缝集成,实现高效、实时的数据处理和分析。FlinkCDC在实际应用中具有广泛的应用场景,如实时数据同步、数据仓库更新、实时报表等。它可以与Flink的SQL、DataStreamAPI和TableAPI等组件无缝集成,为企业提供了一个高效、实时、可靠的数据处理和分析方案。Flink的生态系统和相关工具FlinkGellyFlinkGelly是Flink的图计算库,旨在提供一种高效的方式来进行大规模图计算。提供了许多图计算算法,如PageRank、ConnectedComponents、TrianglesCounting等,支持用户自定义算法。FlinkGelly提供了三种不同的图表示方式,分别是基于Edge的图表示、基于Vert-ex的图表示和基于Tuple的图表示。还提供了许多方便的API和工具来简化图计算的实现,如Vertex-centricIteration、Edge-centricIteration等。FlinkGelly与Flink的批处理和流处理API无缝集成,可以轻松地将图处理任务与其他处理任务组合起来实现更复杂的应用程序。ApacheKafkaApacheKafka是一种分布式流数据处理平台,由LinkedIn公司开发并捐赠给Apache基金会。它是一种高吞吐量、低延迟的消息队列,主要用于解决数据管道、流式处理等领域的问题。Kafka可以作为Flink的数据源或者数据目的地,用于数据的输入和输出。Flink提供了KafkaConnector来实现Kafka和Flink之间的数据交互,同时也支持使用Kafka作为状态后端存储Flink的状态信息。在实际应用中,Kafka和Flink通常被一起使用,实现流数据处理的全链路,可以处理各种规模的数据流。Flink的生态系统和相关工具FlinkCEP

(ComplexEventProcessing)FlinkCEP是Flink提供的一种用于处理复杂事件的工具,它基于流式数据处理和规则匹配技术,能够实时地处理来自多个数据源的事件流,并将事件序列转换为有用的信息。FlinkCEP可以用于监测、诊断和处理各种业务流程中发生的事件,例如金融交易、网络安全、物联网等。FlinkCEP与Flink的流式处理引擎紧密集成,能够高效地处理大规模的事件流,并支持事件的窗口和时间延迟处理等特性。FlinkMLFlinkML是Flink生态系统中的一个机器学习库,它为Flink应用程序提供了一些常见的机器学习算法,包括分类、聚类、回归、降维等。FlinkML通过Flink的分布式计算能力,可以在大规模数据集上进行机器学习,支持在线学习和批量学习模式,提供了一些机器学习算法的实现,例如逻辑回归、线性回归、K-Means、朴素贝叶斯等。Flink的生态系统和相关工具ApacheDruidApacheDruid是一个分布式、列存储、实时数据处理系统,旨在快速查询大型数据集并实时分析实时数据。它提供了快速的多维聚合、近实时查询和可扩展的数据处理能力,适用于实时分析、数据探索、指标监控和实时报警等场景。Druid的数据模型由数据源、维度、度量和时间戳组成。数据源可以是任何类型的数据源,包括数据库、日志文件和事件流等。维度和度量用于描述和量化数据,时间戳则指定数据的时间范围。与Flink的关系是,Flink提供了一个Kafka到Druid的Connector,称为ApacheFlinkDruidSink。这个Sink能够将Flink中的数据发送到Druid集群,实现数据的快速插入和实时查询。同时,Flink也可以从Druid中读取数据,进一步扩展了Flink在实时数据处理领域的应用场景。Flink的社区和贡献者Flink的社区是一个开放且充满活力的社区,由来自不同背景、不同地域、不同组织的贡献者组成。目前,Flink的社区包括了ApacheFlink社区、Ververica社区和DataArtisans社区,共同推动Flink的发展和应用。Flink的社区贡献者包括了来自全球的开发者、用户、学者、企业等不同背景的人员,他们通过提交代码、编写文档、报告Bug、解决问题等方式为Flink的发展和应用做出了重要的贡献。ApacheFlink社区:由来自全球的开发者、用户、贡献者和爱好者组成。Ververica社区:是由Flink的核心贡献者和开发者创建的社区,致力于推动Flink的应用和发展。DataArtisans社区:是Flink的创始人和核心开发者创建的社区,它为Flink提供了一些重要的功能和扩展,例如Flink的复杂事件处理引擎CEP,Flink的状态后端RocksDB和Flink的Kafka连接器。Flink与其他大数据框架的关系–知识点预览#节知识点难点重点应用1C01-06Flink与其他大数据框架的关系1、Flink与Hadoop√

2、Flink与Hive√3、Flink与SparkStreaming√4、Flink与Storm√Flink与HadoopFlink和Hadoop都是大数据处理领域的重要技术,但它们有一些本质的区别:Hadoop是一个分布式计算平台,它主要由HDFS和MapReduce两个核心组件组成,用于存储和处理大规模数据。Hadoop的处理方式是将数据分成块进行分布式处理,采用批量处理模式,对于数据流的实时处理不是很擅长。Flink则是一个实时计算引擎,它专注于流数据处理,提供了更为灵活的流处理模式。相比于Hadoop,Flink支持更为复杂的数据流处理操作,如窗口计算、状态管理和复杂事件处理等,且延迟更低,可以更快地处理实时数据。Flink在物理部署层面上可以支持多种资源管理框架,包括Hadoop的YARN,因此在实际使用中,Flink和Hadoop并不是完全互斥的关系,可以结合使用,比如使用Flink进行实时数据处理,再将处理结果存储在Hadoop的HDFS上进行批量处理和存储。Flink可以与HDFS集成使用,实现大数据处理的全流程。HDFS是一个可靠的大数据存储系统,而Flink则提供了快速的流处理能力,两者的结合可以使企业在大数据处理方面具有更强的竞争力。Flink与HiveFlink与Hive是两个在大数据领域广泛应用的开源项目,它们都可以用来处理和分析海量数据。它们的设计目标和应用场景不同:Hive是一个基于Hadoop的数据仓库系统,它提供了一种基于SQL的编程模型来进行数据查询和分析。Flink是一个开源的分布式流处理引擎,能够处理实时数据和流式数据。Flink在实时处理和低延迟数据分析方面的性能优势得到了广泛认可。Flink可以与Hadoop生态系统中的其他项目进行集成,如HDFS、HBase、Hive等。Flink支持在流处理和批处理任务中访问Hive表和数据。通过使用Flink的HiveCatalog和HiveInputFormat/HiveOutputFormat,可以在Flink程序中使用Hive表作为输入和输出。Flink与Hive在数据处理和分析的应用场景不同,它们各自有自己的优势和局限性。在处理流式数据和实时数据分析方面,Flink显然更具优势,而在传统的数据仓库和批量数据处理方面,Hive更适合。Flink与SparkStreamingFlink和SparkStreaming都是大数据流处理的框架,但它们的设计理念和架构不同:Flink的核心是流处理,支持对有界和无界的数据流进行高效处理,并且将批处理看成流处理的一种特殊情况。SparkStreaming则采用了微批处理的方式,将数据流拆分为一小段小的批处理作业进行处理。总的来说,Flink在一些方面(如处理延迟、系统架构等)具有优势,而SparkStreaming则在生态系统、成熟度等方面具有优势,使用哪个框架应该根据具体需求和场景来选择。Flink与StromStorm是一个分布式实时计算系统,由Twitter公司开发并贡献给Apache开源社区。它提供了一个容错性、高可用性的实时数据流处理平台,可以用于大数据的实时处理、数据流分析、实时监控等场景。相较于Storm,Flink有以下几个优势:低延迟可以处理有界和无界数据更强的容错能力更灵活的状态管理更全面的API支持第二章Scala语言Flink实时大数据处理技术教学内容第一节Scala语言概述第二节Scala语言入门第三节集合第四节函数式编程第五节面向对象编程第六节模式匹配教学目标知识目标了解Scala语言的基本语法和特性技能目标掌握Scala语言基本语法的核心操作毕业要求 1.工程知识Scala语言概述–知识点预览#节知识点难点重点应用1C02-01Scala语言概述1、Scala简介√

2、开发环境配置√3、创建项目√Scala简介Scala(全称:ScalableLanguage)是一种通用的、支持面向对象编程和函数式编程的编程语言。最初是为了在Java虚拟机(JVM)上提供更好的可扩展性而创建的。Scala的语法结构源自于Java和ML语言,它旨在融合面向对象编程和函数式编程的最佳特性,以提高程序的可读性、灵活性和扩展性。Scala和Java一样,都是运行在Java虚拟机上的编程语言。Scala代码可以与Java代码无缝地集成,也可以使用Java库,反之亦然。Scala还具有一些Java所没有的功能和优势,例如更丰富的函数式编程特性、支持类型推断和隐式转换、更灵活的语法等等。Scala简介Scala是一种多范式编程语言,具有以下几个特点:面向对象函数式编程JVM兼容性模式匹配隐式参数和隐式转换并发和异步编程开发环境配置—下载安装JavaSE采用的Scala版本为2.12.x,此版本需要保证JDK为1.8及以上版本。在Windows上配置Scala环境如下:首先,需要到Oracle官网下载并安装JDK(JavaDevelopmentKit),具体步骤如下:打开网址/java/technologies/javase-downloads.html在JavaSE下载页面中,选择适合自己操作系统的版本(如Windows、macOS等),

然后点击“下载”按钮。同意许可协议并下载相应版本的安装程序。下载完成后,运行安装程序,按照指示完成JDK的安装。开发环境配置—配置Java环境变量安装完成后,需要配置JAVA_HOME环境变量。在Windows操作系统中,可以按照以下步骤进行配置:打开“控制面板”,进入“系统和安全”选项,点击“系统”。在系统界面中,点击“高级系统设置”。在“系统属性”窗口中,点击“环境变量”。在“环境变量”窗口中,点击“新建”按钮,输入变量名JAVA_HOME,变量值为JDK

的安装路径(如C:\ProgramFiles\Java\jdk1.8.0_271)。在“环境变量”窗口中,找到系统变量中的“Path”变量,点击“编辑”按钮,在变量值

的末尾添加;%JAVA_HOME%\bin,表示将JDK的bin目录添加到系统路径中。点击“确定”按钮,保存修改并关闭窗口。配置完成后,可以在命令行输入java-version命令,如果可以正常输出版本信息,则表示JDK安装成功,并且JAVA_HOME环境变量配置成功。开发环境配置—下载安装配置Scala从官网/下载适合自己操作系统的Scala安装包,然后解压到一个不包含中文及空格的路径下。以下为Scala的环境变量配置:新建变量SCALA_HOME,值为Scala安装路径(例如C:\Program\scala)。编辑变量Path,在末尾添加%SCALA_HOME%\bin;,保存退出。环境变量设置后,打开命令行提示符,验证是否配置成功,输入scala-version指令,回车后,如果显示Scala版本信息,则表示安装成功,然后配置Scala开发环境。开发环境配置—IDEA环境配置由于IDEA默认不支持Scala语言的开发,需要安装Scala插件进行扩展。打开IDEA,依次点击File=>Settings=>Plugins选项卡,在搜索框中搜索Scala插件,找到插件后进行安装。安装完成后,需要重启IDEA以使插件生效,如图所示。图2-1IDEA安装Scala插件创建项目—选择Maven选项在安装Scala插件后,创建项目时,左侧选项中会增加创建Scala项目的选项,由于,后面的Flink项目除了涉及Scala代码,也可能会编写Java代码,选择创建Maven项目更为通用,因此,此处选择Maven选项。图2-2选择Maven选项创建项目—选择Scala框架填写项目名称后,按提示创建项目。由于创建的是Maven项目,还需要添加Scala框架的支持。右键点击项目名称,选择“AddFrameworkSupport”选项,在弹出的窗口中选择Scala框架,完成Scala框架的添加,如图所示。图2-3选择Scala框架创建项目—新建ScalaClass类添加完成后,在项目结构中,找到“src/main/java”目录,右键单击该目录,选择“New->ScalaClass”。如下图所示:图2-4新建Scala类创建项目—选择object选项因为在Scala语言中,程序的入口点是一个单例对象而不是一个类,因此在创建类时需要选择"Object"选项,如图所示:图2-5选择”Object”选项创建项目—编写程序在新建的Demo文件中加入以下示例代码,就可以完成一个基本的Scala程序。然后点击"Run"按钮或使用快捷键"Shift+F10"运行程序,在控制台中即可看到输出"Hello,world!"。objectDemo{defmain(args:Array[String]):Unit={print("helloworld");}}objectDemo:定义了一个名为Demo的对象。defmain(args:Array[String]):Unit=:定义了一个名为main的方法,该方法有一个

参数args,类型为Array[String],并且返回值类型为Unit,表示没有返回值。print("helloworld"):在main方法中,使用print方法打印了字符串"helloworld"。Scala语言入门–知识点预览#节知识点难点重点应用1C02-02Scala语言入门1、类型体系结构√

2、变量的定义与使用√3、字面量与插值表达式√4、运算符√5、流程控制语句√类型体系结构Scala数据类型体系图如下所示,可以划分以下层次:顶级类型:Any和AnyRef,所有Scala类的超类都是Any。AnyRef是所有引用类的超类。值类型和引用类型,值类型的变量直接存储值,引用类型的变量存储的是对实际值的引用。图2-6Scala数据类型体系图变量的定义与使用在Scala中,变量可以使用var和val关键字定义。其中,var关键字定义的变量是可变的,可以修改其值,类似于Java中的变量;val关键字定义的变量是不可变的,一旦初始化后,其值就不能被修改,类似于Java中的常量。//定义一个可变变量varvariableName:variableType=initialValue//定义一个不可变变量valvariableName:variableType=initialValue变量的定义语法如下代码所示:变量的使用非常简单,直接使用变量名即可://定义一个可变变量vara:Int=10a=20println(a)//输出20//定义一个不可变变量valb:Int=30//b=40//报错,val变量不能重新赋值println(b)输出30需要注意的是,一般情况下建议使用不可变变量,因为不可变变量的值在初始化后就不能被修改,可以更好地避免由于变量值被修改而导致的错误。只有在必要的情况下才使用可变变量。变量的定义与使用

Scala支持类型推断,编译器可以自动推断出一个变量或表达式的类型,因此在大多数情况下不需要显式地指定变量的类型。示例代码如下:valx=10//类型推断为Intvaly="hello“//类型推断为String在这里,编译器会根据变量的初始值来推断变量的类型。在需要显式指定类型的情况下,可以使用冒号(:)符号来指定类型。示例代码如下:valx:Int=10//显式指定类型为Intvaly:String="hello“//显式指定类型为String当变量的类型被显式指定时,如果变量的初始值与指定的类型不匹配,则会导致编译错误。类型推断在Scala中非常常见,因为Scala的类型系统非常强大,并且Scala编译器可以根据表达式的上下文来推断类型。字面量与插值表达式—字面量在Scala中,每种类型都有其对应的字面量表示方式,下面是一些常见类型的字面量表示:整数类型(Byte、Short、Int、Long)可以使用十进制、八进制、十六进制和二进制表示,例如:123,0x12AB,0o765,0b1010。浮点数类型(Float、Double)可以使用十进制表示,也可以使用科学计数法表示,例如:1.23,1.23e5。布尔类型(Boolean)有两个字面量值:true和false。字符类型(Char)使用单引号包含一个字符,例如:'a'。字符串类型(String)使用双引号包含一组字符,例如:"hello"。Scala提供了“”“...”“”语法,通过三个双引号来表示原生字符串和多行字符串,使用该种方式,原生字符串中的特殊字符不会被转义,它们的语法如下代码所示:valmultiLineString="""Thisisamulti-linestringwithtriplequotes."""字面量与插值表达式—插值表达式在Scala中,插值表达式(InterpolationExpression)可以让我们在字符串字面量中使用变量或表达式。Scala提供了三种插值方式:s插值、f插值和raw插值。f插值与s插值类似,不同的是可以指定格式化参数,格式化参数的语法与C语言的printf函数相似。示例代码如下:valpi=3.1415926println(f"Piisapproximately$pi%1.2f.")//输出结果为:Piisapproximately3.14.

s插值是最常用的插值方式,它使用$符号来引用变量或表达式,可以使用${}来明确变量或表达式的范围。示例代码如下:valname="Tom"valage=20println(s"Mynameis$name,I'm$ageyearsold.")//输出结果为:MynameisTom,I'm20yearsold.字面量与插值表达式—插值表达式

raw插值与s插值类似,但是它不会将反斜杠字符\转义为其转义字符。在需要打印特殊字符的场景下,可以使用raw插值。示例代码如下:可以看到,使用raw插值输出的结果中,反斜杠字符\并没有被转义成其转义字符,而是按照原本的样子输出了出来。println(raw"Hello\nWorld")//输出结果为:Hello\nWorld字面量与插值表达式—运算符

Scala和其他语言一样,支持大多数的操作运算符,如表所示:varx=10;vary=20;varz=x+y;println("x+y="+z);//输出结果为:x+y=30

Scala支持加减乘除等常见的算术运算符,示例代码如下:表2-1Scala操作运算符字面量与插值表达式—运算符

Scala支持各种比较运算符,示例代码如下:varx=60;vary=13;println("(x&y)="+(x&y));println("(x|y)="+(x|y));println("(x^y)="+(x^y));println("~x="+(~x));

Scala也支持位运算符,包括按位AND、按位OR、按位XOR等,示例代码如下:varx=10;vary=20;if(x>y){println("x>y");}else{println("x<=y");//输出结果为:x<=y

Scala支持逻辑运算符包括AND、OR和NOT代码如下:varx=true;vary=false;println("x&&y="+(x&&y));println("xIly="+(xIly));println("!x="+!x);//输出结果为:x&&y=falsex||y=true!x=false//输出结果(x&y)=12(x|y)=61(x^y)=49~X=-61字面量与插值表达式—运算符

Scala也支持各种赋值运算符,示例代码如下:varx=10;x+=5;//等价于x=x+5println("x="+x);//输出结果为:x=15在Scala中,没有单独的自增和自减运算符++和--,而是通过+=1和-=1来实现的。具体而言,对于一个变量x,x+=1相当于x=x+1,而x-=1相当于x=x-1,示例代码如下:varx=10x+=1//自增1,相当于x=x+1println(x)//输出11x-=1//自减1,相当于x=x-1println(x)//输出10字面量与插值表达式—流程控制语句If-else条件表达式if(condition){//如果条件为真,执行此处代码}else{//如果条件为假,执行此处代码}下面是一个if语句的演示程序,示例代码如下:objectIfElseDemo{defmain(args:Array[String]){valx=5if(x<0){println("xisnegative")}elseif(x>0){println("xispositive")}else{println("xiszero")}}}Scala中的if-else语句用于根据某个条件执行不同的代码块。其语法格式如下:字面量与插值表达式—流程控制语句while循环与do-while循环while(条件){

//循环体}示例代码如下:vari=0while(i<5){println(s"当前数字为$i")i+=1}while循环的语法结构如下:Scala支持while和do-while两种循环语句,用于执行一定的操作直到条件不成立为止。输出结果字面量与插值表达式—流程控制语句while循环与do-while循环do{

//循环体}while(条件)示例代码如下:vari=0do{println(s"当前数字为$i")i+=1}while(i<5)do-while循环的语法结构如下:do-while循环与while循环的区别在于,do-while循环会先执行一次循环体,再进行条件判断。输出结果字面量与插值表达式—流程控制语句for循环for(i<-1to10){println(i)}可以加入until关键字,示例代码如下:for(i<-1until10){println(i)}传统的for循环形式如下:嵌套的for循环形式如下:for(i<-1to3;j<-1to3){println(s"($i,$j)")}for循环可用于遍历集合中的元素代码如下:vallist=List("apple","banana","cherry")for(fruit<-list){println(fruit)}字面量与插值表达式—流程控制语句for循环vallist=List("apple","banana","cherry")for(fruit<-listiffruit.startswith("a")){println(fruit)}for循环可以在循环时添加过滤条件,只有满足条件的元素才会被遍历,代码如下:for循环使用了yield关键字,可以将遍历的元素存储到一个集合中返回,代码如下:vallist=List("apple","banana","cherry")valresult=for(fruit<-listiffruit.startswith("a"))yieldfruitprintln(result)for循环使用了循环守卫,循环守卫可以确保只有当特定的条件满足时,循环才会继续进行,代码如下:for(i<-1to10ifi%2==0){println(i)}字面量与插值表达式—流程控制语句循环控制importscala.util.control.Breaks.breakable{for(i<-1to10){if(i==5)breakelseprintln(i)}}Scala中没有像Java中的break和continue这样的关键字,但是可以使用breakable方法和if表达式来实现类似的效果。breakable方法可以将一个代码块标记为可中断的,然后在代码块中使用break关键字来跳出循环。示例代码如下:在这个例子中,使用breakable方法将for循环块标记为可中断的。当循环计数器i等于5时,使用break语句跳出循环。字面量与插值表达式—流程控制语句Match-case语句inputmatch{casepattern1=>action1casepattern2=>action2case_=>defaultAction}Match-case语句是Scala中的一种模式匹配语法,可以用于根据不同的输入参数执行不同的逻辑。它类似于其他编程语言中的switch语句,但更加灵活和强大。其中,input是要匹配的输入参数,casepattern是模式匹配的表达式,=>后面是要执行的逻辑。每一个case子句都包括了一个模式和一个动作,如果输入参数和模式匹配成功,就会执行对应的动作。Match-case语句的基本语法如下:使用match-case语句对不同的颜色进行匹配如下:defprintColor(color:String):Unit=colormatch{case"red"=>println("Colorisred")case_=>println("Unknowncolor")case"blue"=>println("Colorisblue")case"green"=>println("Colorisgreen")}printColor("red")printColor("yellow")集合–知识点预览#节知识点难点重点应用1C02-03集合1、集合概述

2、Array和ArrayBuffer√3、Tuple√4、List和ListBuffer√5、Set√6、Map√7、集合操作符号√集合概述Scala集合体系结构主要包含可变集合和不可变集合两种类型。可变集合是指在集合的操作过程中可以对其进行修改,而不可变集合则是指在集合的操作过程中不会修改集合的内容。Scala集合体系结构可以分为三个层次,分别是:顶层:

Iterable、Seq、Map、Set等,scala.collection包集合结构。中层:集合的中层包括scala.collection.immutable和scala.collection.mutable两个包。底层:集合的底层是scala.collection.mutable和scala.collection.immutable包中的具体集合类实现。集合概述图2-7scala.collection包集合结构图Array和ArrayBuffer在Scala中,Array和ArrayBuffer都是可变的序列,可以进行添加、删除和修改等操作。不同之处在于:Array是一个固定大小的序列,一旦创建就无法改变它的大小。Array-Buffer可以动态地增加或减少元素数量。Array的创建方式有两种,一种是使用Array伴生对象的apply方法,另一种是使用A-rray类的构造方法。下面是两种方式的示例代码://使用apply方法创建Arrayvalarray1=Array(1,2,3,4,5)//使用构造方法创建Arrayvalarray2=newArray[Int](5)array2(0)=1array2(1)=2array2(2)=3array2(3)=4array2(4)=5Array和ArrayBufferArrayBuffer的创建方式是使用ArrayBuffer类的构造方法。下面是一个示例代码:importscala.collection.mutable.ArrayBuffervalbuffer=ArrayBuffer(1,2,3,4,5)对于Array和ArrayBuffer,常见的操作包括添加元素、删除元素和修改元素等。以A-rrayBuffer为例,以下是一些常用的操作,示例代码如下:importscala.collection.mutable.ArrayBuffer//创建一个空的ArrayBuffervalbuffer=ArrayBuffer[Int]

()//添加元素buffer+=1//在尾部添加元素buffer+=2buffer++=Array(3,4)//在尾部添加一个数组的元素buffer.insert(1,5)//在索引1处插入元素5//删除元素buffer-=4//删除元素4buffer.remove(2)//删除索引2处的元素//修改元素buffer(0)=0//修改索引0处的元素为0Array和ArrayBufferScala中的Array和ArrayBuffer都可以与Java中的数组进行转换。将Java数组转换为Scala数组,可以使用Array伴生对象的apply方法,示例代码如下:valjavaArr=Array("a","b","c")valscalaArr=Array.apply(javaArr:_*)将Scala数组转换为Java数组,可以使用Scala数组的toArray方法,代码中调用方法时省略了括号,示例代码如下:valscalaArr=Array("a","b","c")valjavaArr=scalaArr.toArray//或者使用Java的Arrays类的asList方法importjava.util.ArraysvalscalaArr=Array("a","b","c")valjavaArr=Arrays.asList(scalaArr:_*)TupleTuple(元组)是一个不可变的、有序的、可以容纳不同类型元素的容器。Tuple可以将多个不同类型的值封装在一起,形成一个完整的数据单元。Tuple的元素可以通过下标访问,下标从1开始计数,也可以使用tuple._1、tuple._2等方式进行访问。Scala中的Tuple最多可以包含22个元素,分别是Tuple1、Tuple2、Tuple3直到Tuple22。Tuple常用于需要将多个值作为一个整体处理的场景,例如函数返回多个值、元组作为Map中的键值对等。下面是一个示例程序,演示了如何创建Tuple并访问它的元素://创建一个包含两个元素的元组valtuple=(1,"Scala")//访问元组的第一个元素valfirst=tuple._1//访问元组的第二个元素valsecond=tuple._2//打印元素值println(first)//输出1println(second)//输出"Scala"List和ListBuffer在Scala中,List和ListBuffer都是用来表示序列的集合类型。List是不可变的序列,可以使用::操作符在头部添加元素,但不能在尾部添加元素。它的元素类型可以是任意类型,但所有元素类型必须相同。List的常用操作包括head、tail、isEmpty、l-ength等。List的应用场景包括不需要频繁添加和删除元素的场景,例如配置文件的读取、程序参数的处理等,示例代码如下://创建一个包含整数的Listvallist1=List(1,2,3,4,5)//创建一个包含字符串的Listvallist2=List("apple","banana","orange")//在List头部添加元素vallist3="pear"::list2//获取List头部元素valhead=list3.head//获取List尾部元素valtail=list3.tail//判断List是否为空valisEmpty=list3.isEmpty//获取List的长度vallength=list3.lengthList和ListBuffer列表的其他常用操作方法如下:表2-2列表的其他常用操作方法List和ListBufferListBuffer的应用场景包括需要频繁添加和删除元素的场景,例如日志记录、缓存数据等,示例代码如下://创建一个空的ListBuffervallistBuffer=ListBuffer[Int]()//在ListBuffer尾部添加元素listBuffer+=1listBuffer+=2listBuffer+=3//在ListBuffer头部添加元素4+=:listBuffer5+=:listBuffer//在指定位置插入元素listBuffer.insert(2,0)//删除指定元素listBuffer-=3//删除指定位置的元素listBuffer.remove(0)//将ListBuffer转换为Listvallist=listBuffer.tolistSet在Scala中,Set是一个集合,用于存储唯一的元素。它可以是可变的(mutable)或不可变的(immutable)。使用Set的主要场景是为了保证集合中不会出现重复的元素。例如,我们可以使用Set来统计一段文本中有多少个不同的单词。以下是使用不可变Set的示例代码://创建不可变Setvalset1=Set(1,2,3,4,5)valset2=Set(4,5,6,7,8)//打印集合元素println(set1)//Set(1,2,3,4,5)//向集合中添加元素valset3=set1+6println(set3)//Set(1,2,3,4,5,6)//求两个集合的交集、并集和差集valintersect=ersect(set2)//交集valunion=set1.union(set2)//并集valdiff=set1.diff(set2)//差集//打印集合操作结果println(intersect)//Set(4,5)println(union)//Set(1,2,3,4,5,6,7,8)println(diff)//Set(1,2,3)总的来说,Set可以用于处理需要去重的数据,例如统计单词频率、过滤重复数据等。在具体应用场景中,可以根据需要选择不可变或可变的Set。MapMap是Scala集合框架中的一种集合类型,用于存储键值对。它可以用于各种应用场景,如缓存、配置文件、数据存储等。在Scala中,Map有不可变和可变两种类型,它们分别在scala.collection.immutab-le和scala.collection.mutable包中定义。不可变Map的键值对不能被修改,而可变Map的键值对可以被修改。以下是使用不可变Map的示例代码:创建一个不可变Mapvalmap=Map("a"->1,"b"->2,"c"->3)//访问Map中的元素vala=map("a")valb=map.get("b")//遍历Mapfor((key,value)<-map){println(s"key:$key,value:$value")}//添加元素valnewMap=map+("d"->4)//删除元素valdelMap=map-"c"Map以下是使用可变Map的示例代码://创建一个可变Mapvalmap=scala.collection.mutable.Map("a"->1,"b"->2,"c"->3)//访问Map中的元素vala=map("a")valb=map.get("b")//遍历Mapfor((key,value)<-map){println(s"key:$key,value:$value")}//添加元素map+=("d"->4)//删除元素map-="c"集合操作符号在Scala中,集合操作中的符号是一些预定义的操作符,它们用于对集合进行操作,如元素添加、删除、连接等。Scala集合操作符号列表如下:表2-3Scala集合操作符号列表集合操作符号可以使用+运算符向一个列表中添加一个元素,示例代码如下:vallist=List(1,2,3)valnewList=list+4println(newlist)//输出List(1,2,3,4)valset1=Set(1,2,3)valset2=Set(3,4,5)valnewSet=set1++set2println(newSet)//输出Set(1,2,3,4,5)可以使用++运算符连接两个集合,示例代码如下:函数式编程–知识点预览#节知识点难点重点应用1C02-04函数式编程1、函数的定义与使用√

2、匿名函数√3、高阶函数√4、柯里化雨闭包√函数的定义与使用Scala的函数式编程指的是一种编程范式,它强调函数的重要性和使用不可变值来构建应用程序。在函数式编程中,函数被视为一等公民(first-classcitizens),可以像其他数据类型一样被操作和传递。在Scala中,函数是一等公民,也就是说,函数可以被视为变量一样进行传递和使用。函数的定义由函数名、参数列表、返回值类型和函数体组成。Scala中的函数定义格式如下:函数的调用可以像Java一样使用函数名和参数列表的形式进行。Scala中的函数调用格式如下:deffunctionName(param1:Type1,param2:Type2,...):ReturnType={//函数体…}valresult=functionName(arg1,arg2,...)函数的定义与使用下面是一个简单的函数示例:下面是一个无返回值函数的例子:defadd(x:Int,y:Int):Int={x+у}valresult=add(1,2)println(result)//输出3defprintMessage(message:String):Unit={println(message)}定义了一个名为add的函数,该函数有两个参数x和y,返回值类型为Int,函数体为将两个参数相加。然后我们调用add函数,并将返回值赋给result变量,最后输出result的值为3。无返回值函数的定义方式是在函数签名后面添加Unit类型,表示该函数不会返回任何值。一般情况下,我们可以省略Unit类型的声明,因为Scala编译

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论