第4章大数据技术教程-MapReduce
- 格式:docx
- 大小:2.18 MB
- 文档页数:23
mapreduce基础编程MapReduce是一种用于大规模数据处理的编程模型和软件框架。
它可以将大数据集分成多个小数据集,并通过多个计算节点并行处理,最后汇总处理结果。
MapReduce将数据处理过程分成两个阶段:Map阶段和Reduce阶段。
在Map阶段中,数据被分成多个小数据集,每个小数据集上运行相同的计算任务,然后产生中间结果。
在Reduce阶段中,中间结果被合并,最终产生处理结果。
MapReduce的基础编程模型可以分为以下几个步骤:1. 输入数据的读取:输入数据可以来自于Hadoop Distributed File System (HDFS)、本地文件系统或其他数据源。
2. Map阶段的编写:开发者需要编写Map函数,该函数将输入数据切分成多个小数据集,并在每个小数据集上运行相同的计算任务,生成中间结果。
Map函数的输出通常是一个键值对(key-value pair),其中键表示中间结果的类型,值表示中间结果的值。
3. Reduce阶段的编写:开发者需要编写Reduce函数,该函数将中间结果根据键值进行合并,生成最终的处理结果。
Reduce函数的输出通常是一个键值对(key-value pair),其中键表示最终处理结果的类型,值表示最终处理结果的值。
4. 输出数据的写入:最终处理结果可以写入到HDFS或其他数据源中。
MapReduce程序的开发需要掌握Java或其他编程语言。
除了基础编程模型外,还需要了解MapReduce的一些高级编程技术,如Combiner、Partitioner、InputFormat、OutputFormat等。
通过这些技术,可以进一步提高MapReduce程序的性能和可扩展性。
总之,MapReduce是一种强大的大数据处理工具,掌握基础编程模型是进行大数据分析和处理的必要条件。
《Hadoop大数据技术原理与应用》课程教学大纲课程编号:3250578学分:4学分学时:72学时(其中:讲课学时36 上机学时:36)先修课程:《Linux基础》、《关系数据库基础》、《程序设计基础》、《Java面向对象编程》后续课程:Spark,《Python编程基础》、《Python数据分析与应用》适用专业:大数据应用技术一、课程的性质与目标《大数据应用开发》本课程是软件技术专业核心课程,大数据技术入门课程。
通过学习课程使得学生掌握大数据分析的主要思想和基本步骤,并通过编程练习和典型应用实例加深了解;同时对Hadoop平台应用与开发的一般理论有所了解,如分布式数据收集、分布式数据存储、分布式数据计算、分布式数据展示。
开设本学科的目的是让学生掌握如何使用大数据分析技术解决特定业务领域的问题。
完成本课程学习后能够熟练的应用大数据技术解决企业中的实际生产问题。
二、教学条件要求操作系统:Center OSHadoop版本:Hadoop2.7.4开发工具:Eclipse三、课程的主要内容及基本要求第1章初识Hadoop第2章构建Hadoop集群第3章 HDFS分布式文件系统第4章 MapReduce分布式计算系统第5章 Zookeeper分布式协调服务第6章 Hadoop2.0新特性第7章 Hive数据仓库第8章 Flume日志采集系统第9章 Azkaban工作流管理器第10章 Sqoop数据迁移第11章综合项目——网站流量日志数据分析系统四、学时分配五、考核模式与成绩评定办法本课程为考试课程,期末考试采用百分制的闭卷考试模式。
学生的考试成绩由平时成绩(30%)和期末考试(70%)组成,其中,平时成绩包括出勤(5%)、作业(5%)、上机成绩(20%)。
六、选用教材和主要参考书本大纲是参考教材《Hadoop大数据技术原理与应用》所设计的。
七、大纲说明本课程的授课模式为:课堂授课+上机,其中,课堂主要采用多媒体的方式进行授课,并且会通过测试题阶段测试学生的掌握程度;上机主要是编写程序,要求学生动手完成指定的程序设计或验证。
mapreduce总结MapReduce一个由Google出的分布式编程模型,它将大数据处理转化为分布式程序模型,提供了一种简单却强大的方法来处理海量的数据。
MapReduce优点在于提供了一种既可以低成本、高效率地处理大规模数据的数据处理框架,在大数据的处理和管理方面发挥了重要作用。
本文将对MapReduce的相关概念及其实现原理、特点和应用进行综述。
一、MapReduce的概念MapReduceGoogle发明的一种解决海量数据处理的分布式编程模型,它是一种计算框架,可以将一个大型数据集分割成多个小任务,并把任务分发到多台机器上执行,并最终将小任务的结果合并成最终结果。
MapReduce模型由Google在2004年提出,并于2005年在著名论文“MapReduce:A Flexible Data Processing Tool”中被正式发表,其主要贡献者为Google公司的三位研究人员:Jeff Dean、Sanjay Ghemawat Andrew Tomkins。
二、MapReduce的实现原理MapReduce实现原理主要分2个阶段。
1. Map:Map是利用已有的数据,进行数据归类和分块的过程,将大规模的数据量分割成多个中等规模的数据块,每个数据块用一个子任务来处理;2. Reduce阶段:Reduce是从 Map的多个子任务的结果中汇总出最终的结果;MapReduce框架建立在分布式环境之上,将一个大规模的计算任务拆分成小任务,分发到各个节点运行,最后把小任务的结果合并成一个总结果。
三、MapReduce的特点MapReduce模型提供了一种机制,可以实现以下处理大规模数据的特点:1.发处理大数据:MapReduce过将大数据集分成多个小数据集,并由多个节点并行处理,从而提供了大规模数据处理的并发能力,可以提升处理效率;2.错性:MapReduce型支持容错性处理,也即当某台机器出现故障或是宕机,MapReduce架会将任务重新分发到其它机器上执行,从而保证了数据的正确性;3.可伸缩性:MapReduce型具有较高的可伸缩性,即可以根据需求随时增加或减少计算任务的数量,从而改变计算的规模;4.持低延迟的数据处理:MapReduce数据处理过程中,可以有效避免数据倾斜现象,从而减少任务处理的时间。
简述mapreduce计算的主要流程
MapReduce计算是一种分布式计算模型,其主要流程可以简述为以下几个步骤:
1. 输入分片:将输入数据分成若干个小块进行处理,每个小块称为一个输入分片。
2. Map阶段:将每个输入分片分配给一个或多个Map任务进行处理。
每个Map任务读取一个输入分片,并将其转换为一系列<key, value>对。
这些<key, value>对称为Map输出。
3. Shuffle阶段:将Map输出按照key值进行排序,将具有相同key值的<key, value>对分组在一起,并将它们发送给同一个Reduce任务进行处理。
这个过程称为shuffle。
4. Reduce阶段:将每个Reduce任务处理的<key, value>对按照一定的规则进行合并(如求和、求平均值等),并输出结果。
5. 输出合并:将所有Reduce任务的输出结果合并成一个最终的输出结果,并将其存储到输出文件中。
以上就是MapReduce计算的主要流程,其中Map阶段、Shuffle 阶段和Reduce阶段是整个计算过程中最关键的三个阶段,它们的正确性和效率对整个计算的性能影响非常大。
- 1 -。
使用Hadoop MapReduce高效处理大规模数据的方法随着互联网的快速发展,大规模数据的处理成为了一个重要的挑战。
传统的数据处理方法已经无法满足这一需求,因此,使用Hadoop MapReduce成为了一种高效处理大规模数据的方法。
一、Hadoop MapReduce的基本原理Hadoop MapReduce是一种分布式计算模型,它将大规模数据划分为多个小块,并将这些小块分发到不同的计算节点上进行并行处理。
其基本原理可以概括为以下几个步骤:1. 输入数据划分:将大规模数据划分为多个小块,每个小块的大小通常为64MB或128MB。
2. Map阶段:在每个计算节点上,对输入数据进行处理,生成中间结果。
这个阶段可以并行处理多个小块。
3. Shuffle阶段:将Map阶段生成的中间结果按照键值对进行排序,并将相同键的值归并在一起,以便进行后续的处理。
4. Reduce阶段:对Shuffle阶段生成的中间结果进行处理,得到最终的结果。
二、优化Hadoop MapReduce的性能虽然Hadoop MapReduce能够高效处理大规模数据,但是在实际应用中,还存在一些性能瓶颈。
下面介绍一些优化Hadoop MapReduce性能的方法。
1. 数据本地化:在MapReduce任务中,数据的传输是一个耗时的操作。
为了减少数据传输的开销,可以将计算节点的选择与数据的位置相匹配,尽量将计算任务分配到存储数据的节点上进行处理。
2. 压缩数据:大规模数据的处理通常需要大量的磁盘空间。
为了减少磁盘空间的占用,可以对输入数据进行压缩,减少存储和传输的开销。
同时,在Map阶段和Reduce阶段的中间结果也可以进行压缩,以减少网络传输的开销。
3. 合并小文件:在Hadoop中,每个小文件都会占用一个数据块的存储空间,这样会导致存储空间的浪费。
可以将多个小文件合并成一个大文件,减少存储空间的占用。
4. 调整任务数量:在Hadoop MapReduce中,任务的数量对性能有很大的影响。
第4章课后习题答案一、单选题1.在 MapReduce 程序中,map() 函数接收的数据格式是(A. 字符串B. 整型C. LongD. 键值对参考答案:D2.每个 Map 任务都有一个内存缓冲区,默认大小是( ) 。
A. 128 MBB. 64 MBC. 100 MBD. 32 MB参考答案:C3.在 MapTask 的 Combine 阶段,当处理完所有数据时,MapTask 会对所有的临时文件进行一次() 。
A. 分片操作B. 合并操作C. 格式化操作D. 溢写操作参考答案:B4.下列选项中,主要用于决定整个 MapReduce 程序性能高低的阶段是( ) 。
A. MapTaskB. ReduceTaskC. 分片、格式化数据源D. Shuffle参考答案:D二、判断题1. MapReduce 编程模型借鉴了面向过程的编程语言的设计思想。
( )参考答案:错2.在MapReduce 程序进行格式化数据源操作时, 是将划分好的分片格式化为键值对“ < key,value > ” 形式的数据。
( )参考答案:对3.带有倒排索引的文件称为“倒排索引文件”,简称“ 倒排文件” 。
( )参考答案:对4.reduce() 函数会将 map( ) 函数输出的键值对作为输入,将相同 key 值的 value 进行汇总,输出新的键值对。
( )参考答案:对5.MapReduce 通过 TextOutputFormat 组件输出到结果文件中。
( )参考答案:对biner 组件可以让 Map 对 key 进行分区,从而可以根据不同的 key 分发到不同的Reduce 中去处理。
( )参考答案:错7.对于 MapReduce 任务来说,一定需要 Reduce 过程。
( )参考答案:错8.在 MapReduce 程序中,只有 Map 阶段涉及 Shuffle 机制。
( )参考答案:错9.MapReduce 的数据流模型可能只有 Map 过程,由 Map 产生的数据直接被写入 HDFS中。
Hadoop大数据开发基础教案Hadoop教案MapReduce入门编程教案第一章:Hadoop概述1.1 Hadoop简介了解Hadoop的发展历程理解Hadoop的核心价值观:可靠性、可扩展性、容错性1.2 Hadoop生态系统掌握Hadoop的主要组件:HDFS、MapReduce、YARN理解Hadoop生态系统中的其他重要组件:HBase、Hive、Pig等1.3 Hadoop安装与配置掌握Hadoop单机模式安装与配置掌握Hadoop伪分布式模式安装与配置第二章:HDFS文件系统2.1 HDFS简介理解HDFS的设计理念:大数据存储、高可靠、高吞吐掌握HDFS的基本架构:NameNode、DataNode2.2 HDFS操作命令掌握HDFS的基本操作命令:mkdir、put、get、dfsadmin等2.3 HDFS客户端编程掌握HDFS客户端API:Configuration、FileSystem、Path等第三章:MapReduce编程模型3.1 MapReduce简介理解MapReduce的设计理念:将大数据处理分解为简单的任务进行分布式计算掌握MapReduce的基本概念:Map、Shuffle、Reduce3.2 MapReduce编程步骤掌握MapReduce编程的四大步骤:编写Map函数、编写Reduce函数、设置输入输出格式、设置其他参数3.3 典型MapReduce应用掌握WordCount案例的编写与运行掌握其他典型MapReduce应用:排序、求和、最大值等第四章:YARN资源管理器4.1 YARN简介理解YARN的设计理念:高效、灵活、可扩展的资源管理掌握YARN的基本概念:ResourceManager、NodeManager、ApplicationMaster等4.2 YARN运行流程掌握YARN的运行流程:ApplicationMaster申请资源、ResourceManager 分配资源、NodeManager执行任务4.3 YARN案例实战掌握使用YARN运行WordCount案例掌握YARN调优参数设置第五章:Hadoop生态系统扩展5.1 HBase数据库理解HBase的设计理念:分布式、可扩展、高可靠的大数据存储掌握HBase的基本概念:表结构、Region、Zookeeper等5.2 Hive数据仓库理解Hive的设计理念:将SQL查询转换为MapReduce任务进行分布式计算掌握Hive的基本操作:建表、查询、数据导入导出等5.3 Pig脚本语言理解Pig的设计理念:简化MapReduce编程的复杂度掌握Pig的基本语法:LOAD、FOREACH、STORE等第六章:Hadoop生态系统工具6.1 Hadoop命令行工具掌握Hadoop命令行工具的使用:hdfs dfs, yarn命令等理解命令行工具在Hadoop生态系统中的作用6.2 Hadoop Web界面熟悉Hadoop各个组件的Web界面:NameNode, JobTracker, ResourceManager等理解Web界面在Hadoop生态系统中的作用6.3 Hadoop生态系统其他工具掌握Hadoop生态系统中的其他工具:Azkaban, Sqoop, Flume等理解这些工具在Hadoop生态系统中的作用第七章:MapReduce高级编程7.1 二次排序理解二次排序的概念和应用场景掌握MapReduce实现二次排序的编程方法7.2 数据去重理解数据去重的重要性掌握MapReduce实现数据去重的编程方法7.3 自定义分区理解自定义分区的概念和应用场景掌握MapReduce实现自定义分区的编程方法第八章:Hadoop性能优化8.1 Hadoop性能调优概述理解Hadoop性能调优的重要性掌握Hadoop性能调优的基本方法8.2 HDFS性能优化掌握HDFS性能优化的方法:数据块大小,副本系数等8.3 MapReduce性能优化掌握MapReduce性能优化的方法:JVM设置,Shuffle优化等第九章:Hadoop实战案例9.1 数据分析案例掌握使用Hadoop进行数据分析的实战案例理解案例中涉及的技术和解决问题的方法9.2 数据处理案例掌握使用Hadoop进行数据处理的实战案例理解案例中涉及的技术和解决问题的方法9.3 数据挖掘案例掌握使用Hadoop进行数据挖掘的实战案例理解案例中涉及的技术和解决问题的方法第十章:Hadoop项目实战10.1 Hadoop项目实战概述理解Hadoop项目实战的意义掌握Hadoop项目实战的基本流程10.2 Hadoop项目实战案例掌握一个完整的Hadoop项目实战案例理解案例中涉及的技术和解决问题的方法展望Hadoop在未来的发展和应用前景重点和难点解析重点环节1:Hadoop的设计理念和核心价值观需要重点关注Hadoop的设计理念和核心价值观,因为这是理解Hadoop生态系统的基础。
第四章分布式计算框架MapReduce4.1初识MapReduceMapReduce是一种面向大规模数据并行处理的编程模型,也一种并行分布式计算框架。
在Hadoop流行之前,分布式框架虽然也有,但是实现比较复杂,基本都是大公司的专利,小公司没有能力和人力来实现分布式系统的开发。
Hadoop的出现,使用MapReduce框架让分布式编程变得简单。
如名称所示,MapReduce主要由两个处理阶段:Map阶段和Reduce 阶段,每个阶段都以键值对作为输入和输出,键值对类型可由用户定义。
程序员只需要实现Map和Reduce两个函数,便可实现分布式计算,而其余的部分,如分布式实现、资源协调、内部通信等,都是由平台底层实现,无需开发者关心。
基于Hadoop开发项目相对简单,小公司也可以轻松的开发分布式处理软件。
4.1.1 MapReduce基本过程MapReduce是一种编程模型,用户在这个模型框架下编写自己的Map函数和Reduce函数来实现分布式数据处理。
MapReduce程序的执行过程主要就是调用Map函数和Reduce函数,Hadoop把MapReduce程序的执行过程分为Map和Reduce两个大的阶段,如果细分可以为Map、Shuffle(洗牌)、Reduce三个阶段。
Map含义是映射,将要操作的每个元素映射成一对键和值,Reduce含义是归约,将要操作的元素按键做合并计算,Shuffle在第三节详细介绍。
下面以一个比较简单的示例,形象直观介绍一下Map、Reduce阶段是如何执行的。
有一组图形,包含三角形、圆形、正方形三种形状图形,要计算每种形状图形的个数,见下图4-1。
图:4-1 map/reduce计算不同形状的过程在Map阶段,将每个图形映射成形状(键Key)和数量(值Value),每个形状图形的数量值是“1”;Shuffle阶段的Combine(合并),相同的形状做归类;在Reduce阶段,对相同形状的值做求和计算。
在用户编写程序时,需要编写Map和Reduce两个函数,而Combine是由集群完成的。
在Map函数中,将每一个形状作为参数传入函数,用户编写的程序将形状和数字“1”作为map映射。
对于第一个图形,这个map的Key就是“三角形”,value就是“1”,这样就形成了K/V对,同理对于后面所有的图形都做这样的映射。
映射完成后就形成了以每个形状Key 和数字“1”为Value的K/V键值对,这样Map阶段就工作完成了。
在Combine中,集群将所有Key相同的键值对进行组合,图中可以看出“三角形”后面有4个“1”,圆形后有6个“1”,正方形后有三个“1”,这些“1”正是map阶段键值对的Value。
在Reduce阶段,把相同的Key的Value进行求和就可以统计出每个形状的个数了。
这是单个Map/Reduce任务的执行过程,在集群中运行时系统会自动运行多个Map任务,以并行的方式处理多个输入的数据块,实现基于分布式的并行计算。
其实在我们现实生活中,很多数据要么本身就为键值对的形式,要么可以用键值对这种方式来表示,例如电话号码和通话记录,文件名和文件存储的数据等,键值对是存在于我们身边非常普通的模型。
4.1.2 MapReduce编程思想MapReduce的核心思想只有四个字:分而治之。
MapReduce采用"分而治之",这样就把对大规模数据集的复杂计算任务分解成“简单任务”,分发给集群中各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。
简单地说,MapReduce就是"任务的分解与结果的汇总"。
把复杂的任务分解为若干个“简单任务”来处理。
“简单任务”包含三层含义:计算量变小,数据或计算的规模相对原来任务要大大缩小;就近计算,即任务会被分配到存放所需数据的节点上进行计算,也称本地计算原则;独立运行,这些小任务可以并行计算,彼此间几乎没有依赖关系。
在Reduce阶段,负责对Map阶段的结果进行汇总。
至于需要多少个Reduce任务来汇总,则可以由用户根据需要指定。
”4.1.3 MapReduce的编程模型MapReduce借鉴了函数式程序设计语言Lisp中的思想,定义了的Map和Reduce两个抽象的编程接口,由用户去编程实现。
Map函数: (k1; v1)-->[(k2; v2)]。
输入:键值对(k1;v1)表示接收的数据;处理:文档数据记录(如文本文件中的一行),以键值对的形式传入map函数,处理完之后以另一种键值对的形式输出中间处理结果[k2;v2];输出:键值对[k2;v2]表示的一组中间数据;洗牌(Shuffle):对中间结果数据处理。
对Map输出的[k2;v2]数据,进行分组、合并、排序,传送到Reduce端。
Reduce函数: (k2; [v2])-->[(k3; v3)]。
输入: Map输出的一组键值对[(k2; v2)] 将被进行合并处理将同样主键下的不同数值合并到一个列表[v2]中,故Reduce的输入为(k2;[v2]);处理:对传入的中间结果列表数据进行某种整理或进一步的处理,并输出最终的某种键值对形式的结果[(k3;v3)];输出:键值对[k3;v3]表示的最终结果数据。
下面以处理文本为例,说明编程模型中各阶段执行步骤。
Map函数执行:读取输入文件内容,对输入文件的每一行,解析成Key、Value对,通常行数(行偏移量)为Key值,每行文本作为Value值。
每一个键值对调用一次Map函数。
写自己的逻辑,对输入的Key、Value处理,转换成新的Key、Value输出。
在Shuffle中对输出的Key、Value进行分区。
对不同分区的数据,按照Key进行排序、分组。
相同Key的Value放到一个集合中。
Reduce函数执行:对多个Map任务的输出,按照不同的分区,通过网络copy到不同的Reduce节点。
对多个Map任务的输出进行合并、排序。
写Reduce函数自己的逻辑,对输入的Key、Value处理,转换成新的Key、Value输出。
把Reduce的输出保存到文件中。
4.2 MapReduce编程4.2.1 程序入门最简单的MapReduce应用程序至少包含 3 个部分:一个 Map 函数、一个 Reduce 函数和一个 main 函数。
在运行一个mapreduce计算任务时候,任务过程被分为两个阶段:map 阶段和reduce阶段,每个阶段都是用键值对(key/value)作为输入(input)和输出(output)。
main 函数将作业控制和文件输入/输出结合起来。
下面我们用一个单词统计的例子来学习MapReduce程序执行过程。
•并行读取文本中的内容,然后进行MapReduce操作。
•Map过程:并行读取文本,对读取的单词进行map操作,每个词都以<key,value>形式生成。
一个有三行文本的文件进行MapReduce操作。
读取第一行Hello World Bye World ,分割单词形成Map。
<Hello,1> <World,1> <Bye,1> <World,1>读取第二行Hello Hadoop Bye Hadoop ,分割单词形成Map。
<Hello,1> <Hadoop,1> <Bye,1> <Hadoop,1>读取第三行Bye Hadoop Hello Hadoop,分割单词形成Map。
<Bye,1> <Hadoop,1> <Hello,1> <Hadoop,1>•Reduce操作是对map的结果进行排序,合并,最后得出词频。
经过进一步处理(combiner),将形成的Map根据相同的key组合成value数组。
<Bye,1,1,1> <Hadoop,1,1,1,1> <Hello,1,1,1> <World,1,1>循环执行Reduce(K,V[]),分别统计每个单词出现的次数。
<Bye,3> <Hadoop,4> <Hello,3> <World,2>4.2.2第一个MapReduce程序根据上一小节介绍Word Count的MapReduce执行流程,这里我们来编写真正的第一个自己的MapReduce程序。
编程时只需要用户实现map和reduce两个方法,MapReduce执行原理中的其他步骤默认无需用户实现,而是由集群完成。
编写程序时先在本地开发环境中编写好代码测试通过后将程序打包上传到Hadoop集群中执行。
开发环境与HDSF章节中一致,需将相关Jar包下载到本地工程。
为了测试程序,在编写程序前将content.txt文件上传至HDFS的/mytest4/目录下,content.txt文件的内容为一段文本:the mission of the ASF is to provide software for the publicestablished in 1999 the ASF is a charitable organizationfunded by individual donations and corporate sponsorsASF is a good organization用户编写Map端程序和Reduce端程序,具体步骤如下:1、Map端编写步骤用户编写自己的Map类,需要继承org.apache.hadoop.mapreduce.Mapper类,并重写protected void map(KEYIN key, VALUEIN value, Context context)throws IOException, InterruptedException 方法。
下面是定义了一个类TokenizerMapper。
程序代码如下:代码4-1 TokenizerMapper.java1 import java.io.IOException;2 import java.util.StringTokenizer;3 import org.apache.hadoop.conf.Configuration;4 import org.apache.hadoop.fs.Path;5 import org.apache.hadoop.io.IntWritable;6 import org.apache.hadoop.io.Text;7 import org.apache.hadoop.mapreduce.Job;8 import org.apache.hadoop.mapreduce.Mapper;9 import org.apache.hadoop.mapreduce.Reducer;10 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;11 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;1213 public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {14 IntWritable one = new IntWritable(1);15 Text word = new Text();16 public void map(Object key, Text value, Context context) throws IOException, InterruptedException {17 // 将字符串按空格分开18 StringTokenizer itr = new StringTokenizer(value.toString());19 while (itr.hasMoreTokens()) {20 word.set(itr.nextToken());21 context.write(word, one);22 }23 }24 }代码中第1~11行,是导入相关的类,因为不同版本Hadoop中同名类较多,如果使用自动导入可能会将不同包下的同名类导入,初学者在导入时应多加注意。