背景:
实施创新驱动发展战略,需加强基础研究。俗话说万丈高楼平地起,“大数据时代”下,针对大数据处理的新技术也在被不断地开发和运用,并逐渐成为数据处理与挖掘行业广泛使用的主流技术之一。在大数据时代,Hadoop作为处理大数据的分布式存储和计算框架,在国内外大、中、小型企业中已得到广泛应用,掌握Hadoop 技术是从事大数据行业工作必不可少的一步,Hadoop亦是大数据技术专业学习的基础知识。
一.什么是 Hadoop?
随着移动设备的广泛使用和互联网的快速发展,数据的增量和存量快速增加,硬件发展跟不上数据发展,单机很多时候已经无法处理 TB、PB 级别的数据。如果一头牛拉不动货物,那么选择找几头牛一起拉货物比培育一头更强壮的牛更加容易。同理,对于单机无法解决的问题,综合利用多个普通机器的做法比打造一台超级计算机的做法可行性更高。这就是 Hadoop的设计思想。
Hadoop 由 Apache 软件基金会开发,是一个开源的、可靠的、可扩展的、用于分布式计算的分布式系统基础框架。Hadop允许用户使用简单的编程模型在计算机集群中对大规模数据集进行分布式处理。Hadoop旨在从单一的机器扩展到成千上万的机器,将集群部署在多台机器中,每台机器提供本地存储和计算服务。每台机器上有一个或多个节点,HadooP存储的数据将备份在多个节点中以提升集群的可用性,当一个节点宕机时,其他节点依然可以提供数据备份和计算服务。
Hadoop框架核心的设计是 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)和分布式计算框架MapReduce。HDFS是可扩展、高容错、高性能的分布式文件系统,负责数据的分布式存储和备份,文件写人后只能读取,不能修改。MapReduce是分布式计算框架,包含 Map(映射)和Reduce(归约)两个阶段。
二.IntelliJ IDEA 中打包并提交 MapReduce 程序
在IntelliJIDEA中编写MapReduce 程序后,务器节点,通过“hadoopjar”命令提交至集群运行。这一流程需要在不同平台系统间切换并且各个环节需要手动处理,比较烦琐且效率低。本次是介绍如何在工作环境中更为简便地提交 MapReduce任务,在 IntelliJIDEA中实现自动打包 MapReduce 任务并远程连接 Hadoop 集群,直接提交并运行编写的 MapReduce 程序,并显示运行过程中的输出日志。
1.传递参数
MapReduce 编程中,除了 MapReduce 需要输人的参数由输人路径和输出路径提交外,其他参数(如分隔符)均是直接写进程序中的。如果输入数据的分隔符有所改动,那么程序里使用的分隔符也要进行相应的修改,再重新编译打包程序再次提交至集群运行,使得操作十分烦琐。解决方案是将分隔符作为参数传递到程序中当输入数据的分隔符改变时,直接修改传递的参数即可。
Confguration配置类
Hadoop的Configuration配置类提供了许多设置被传递的参数的属性名称的方法,如:
Confguration配置类中设置被传递的参数的属性名称的方法的参数说明如下为参数的属性名称。(1)name:
(2)value:参数值。
(3)source:该参数值的来源(用于调试)
(4)pattem:模式值。
在表中,set(String name,String value)方法是比较通用的一种方法,只需设置 name和 value 两个参数的值,其他方法的用法类似。如代码set()方法的使用:
设置参数的属性名称后,可以使用Confguration配置类中返回类型为Sting的get(Stringname)方法,根据属性名称获取参数值。在编写 MapReduce 程序时,可以在 Mapper或 Reducer模块中通过上下文对象 Context 中的 getConfiguration()方法获取 Confguration 配置对象,再调用 Configuration 的 get(String name)方法获取参数值,如代码获取参数值:
Mapper 或 Reducer类提供了一个 setup(Context context)方法,该方法在 MapReduce 程序运行时只会被调用-次,因此建议通过重写 setup(Context context)方法进行参数值的获取。
3.使用 Hadoop 辅助类 ToolRunner
MapReduce 程序的驱动类中,main()方法进行了 MapReduce 作业的相关配置,再通过命令行方式运行作业。为了简化命令行,Hadoop自带了一些辅助类,其中GenericOptionsParser是一个解释常用的 Hadoop 命令行选项类,GenericOptionsParser 类可以根据需要为 Configuration对象设置相应的值。通常不直接使用 GenericOptionsParser 类,更方便的方式是实现 Tool接口通过 ToolRunner 运行应用程序,在 ToolRunner 内部调用 GenericOptionsParser 类。
以统计某竞赛网站用户在2021年1月和2月每天的登录次数为例,讲解ToolRunner的使用方法。
ToolRunner的使用方法
首先是实现的驱动类,使驱动类继承 Hadoop 配置类 Confgured;并实现 Tool 接口以及 Tool 接口中的 run(String[]args)方法,在 run(String[]args)方法中进行MapReduce 作业的相关配置;再编写一个main()方法,调用ToolRunner 中的run(Configuration conf,Tool tool,String[] args)方法,传递相关参数,如代码所示:
在代码中,main()方法中使用了 ToolRunner 的run()方法,并且将参数值写在 mainO)方法中,因此使用“hadoop jar”命令运行程序时就不需要写参数值。打包程序并命名为logcount.jar,在 master 节点中执行以下代码所示的命令即可成功提交 MapReduce 任务。
4.自动打包并提交 MapReduce 任务
每一次运行 MapReduce 程序时都要先将程序编译生成Jar 包,再上传至 Linux 文件系统中,然后通过“hadoop jar”命令提交并运行 MapReduce 程序,这种提交 MapReduce 任务的方式是比较烦琐的。为了提高开发效率,开发者可以通过IntelliJEA将MapReduce任务直接提交至 Hadoop 集群中。
MapReduce 提交到 Hadoop 集群
在 IntelliJ IDEA 中直接将 MapReduce 任务提交到 Hadoop 集群中,需要设置连接Hadoop集群的配置,包括使用跨平台提交任务、指定NameNode、指定使用 YARN 框架、指定 ResourceManager、指定资源分配器、指定 HistoryServer 以及指定 Jar 包的存放路径。以统计某竞赛网站用户在2021年1月和2月每天的登录次数为例,在驱动类中添加一个获取 Hadoop 集群配置的 getMyConfiguration()方法,如代码所示:
获取 Hadoop 集群配置的方法
在定义了获取 Hadoop 集群配置的方法后,需要在驱动类的run0方法中调用定义的获取 Hadoop 集群配置的 getMyConfiguration()方法,如代码所示:
调用定义的获取 Hadoop 集群配置的方法
添加了 Hadoop 集群配置代码后,只需将程序打包,在代码中输入Jar 包本地路径,无须上传至 Linux 系统中,右键单击驱动类,选择“Run LogCount.mainO)’”命令即可运行MapReduce 程序,如图所示: 选择“Run'LogCount.main()”命令
在工程的/src/main/resources 目录下添加 log4j.properties 日志文件,该文件用于将运行程序的日志输出至控制台,方便用户查看日志,如代码所示:
LogCount 程序在运行过程中将在 IntelliJ IDEA 的控制台输出日志信息,如图所示:
Confguration配置类; 在InteliJ IDEA 的控制台输出的运行 MapReduce 任务的日志,工具类的实现代码:
编写自动打包的工具类之后,只需在设置Hadoop集群配置时将设置Jar包路径的代码修改为以下代码所示的代码即可,无须将程序打包即可在IntelJIDEA中直接提交MapReduce 任务。
三.小结
本次是 MapReduce 进阶编程,介绍的内容包括 MapReduce 的输出及输人格式、HadoopJava API、自定义键值类型、Combiner、Partitioner、自定义计数器以及在IntelliJ DEA中直接提交并运行 MapReduce 任务。学习了MapReduce 进阶编程的知识后,优化了日志文件的统计程序。其中,自定义键值类型、Combiner、Partitioner 和辅助类 ToolRunner 对程序的优化起到了非常积极的作用,在一定程度上可以提高程序运行的效率。
版权归原作者 2023大数据技术2班 吴静甜 所有, 如有侵权,请联系我们删除。