莫张周刘王 发表于 2024-12-12 19:56:52

Hadoop在 IntelliJ IDEA 中打包并提交 MapReduce 程序

配景:

    实行创新驱动发展战略,需加强底子研究。俗话说万丈高楼平地起,“大数据期间”下,针对大数据处理的新技术也在被不停地开辟和运用,并渐渐成为数据处理与发掘行业广泛使用的主流技术之一。在大数据期间,Hadoop作为处理大数据的分布式存储和计算框架,在国表里大、中、小型企业中已得到广泛应用,把握Hadoop 技术是从事大数据行业工作必不可少的一步,Hadoop亦是大数据技术专业学习的底子知识。
一.什么是 Hadoop?

    随着移动设备的广泛使用和互联网的快速发展,数据的增量和存量快速增加,硬件发展跟不上数据发展,单机许多时间已经无法处理 TB、PB 级别的数据。如果一头牛拉不动货物,那么选择找几头牛一起拉货物比培育一头更强壮的牛更加轻易。同理,对于单机无法办理的题目,综合利用多个平凡机器的做法比打造一台超级计算机的做法可行性更高。这就是 Hadoop的计划思想。
   Hadoop 由 Apache 软件基金会开辟,是一个开源的、可靠的、可扩展的、用于分布式计算的分布式体系底子框架。Hadop允许用户使用简单的编程模型在计算机集群中对大规模数据集进行分布式处理。Hadoop旨在从单一的机器扩展到成千上万的机器,将集群部署在多台机器中,每台机器提供本地存储和计算服务。每台机器上有一个或多个节点,HadooP存储的数据将备份在多个节点中以提拔集群的可用性,当一个节点宕机时,其他节点依然可以提供数据备份和计算服务。
https://i-blog.csdnimg.cn/direct/f6f55efda909499599e07851bec0d493.png
   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配置类提供了许多设置被传递的参数的属性名称的方法,如:
https://i-blog.csdnimg.cn/direct/e33edf173c6548ef863c0614088f196d.png
Confguration配置类中设置被传递的参数的属性名称的方法的参数阐明如下为参数的属性名称。(1)name:
(2)value:参数值。
(3)source:该参数值的来源(用于调试)
(4)pattem:模式值。
在表中,set(String name,String value)方法是比力通用的一种方法,只需设置 name和 value 两个参数的值,其他方法的用法类似。如代码set()方法的使用:
https://i-blog.csdnimg.cn/direct/3ca4f602ff604b75bed15c817ccd867e.png
设置参数的属性名称后,可以使用Confguration配置类中返回类型为Sting的get(Stringname)方法,根据属性名称获取参数值。在编写 MapReduce 程序时,可以在 Mapper或 Reducer模块中通过上下文对象 Context 中的 getConfiguration()方法获取 Confguration 配置对象,再调用 Configuration 的 get(String name)方法获取参数值,如代码获取参数值:
https://i-blog.csdnimg.cn/direct/7e3cab63717d455196ea4efac6541268.png
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)方法,传递相关参数,如代码所示:
https://i-blog.csdnimg.cn/direct/25ffc214772842e5a892fcf8027cb84f.png
https://i-blog.csdnimg.cn/direct/5ef7061530a34971b0dc50700c321f61.png
https://i-blog.csdnimg.cn/direct/0f8e2f860700459cac6831991f6515ce.png
https://i-blog.csdnimg.cn/direct/eef7af01d81a4b04a2863809e593e3c8.png
在代码中,main()方法中使用了 ToolRunner 的run()方法,并且将参数值写在 mainO)方法中,因此使用“hadoop jar”命令运行程序时就不须要写参数值。打包程序并命名为logcount.jar,在 master 节点中执行以下代码所示的命令即可乐成提交 MapReduce 使命。
https://i-blog.csdnimg.cn/direct/5523c7287cc5413ba4dd46602adaf192.png
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 集群配置的方法
https://i-blog.csdnimg.cn/direct/4f7b0f88ea9c447688ae8bc950956013.png
https://i-blog.csdnimg.cn/direct/c337dbe221c6416584328b898e93ecd2.png
在定义了获取 Hadoop 集群配置的方法后,须要在驱动类的run0方法中调用定义的获取 Hadoop 集群配置的 getMyConfiguration()方法,如代码所示:
调用定义的获取 Hadoop 集群配置的方法
https://i-blog.csdnimg.cn/direct/4749b26b64c64f3aa1e161b5611b6a53.png
添加了 Hadoop 集群配置代码后,只需将程序打包,在代码中输入Jar 包本地路径,无须上传至 Linux 体系中,右键单击驱动类,选择“Run LogCount.mainO)’”命令即可运行MapReduce 程序,如图所示:  选择“Run'LogCount.main()”命令
https://i-blog.csdnimg.cn/direct/2394ac54cb854344bc137c15a808bab1.png
在工程的/src/main/resources 目录下添加 log4j.properties 日志文件,该文件用于将运行程序的日志输出至控制台,方便用户检察日志,如代码所示:
https://i-blog.csdnimg.cn/direct/09d1333431584cfca7de3a2569f65a3d.png
LogCount 程序在运行过程中将在 IntelliJ IDEA 的控制台输出日志信息,如图所示:
https://i-blog.csdnimg.cn/direct/d2b38861d460451ba526e49aa0df8bca.png
Confguration配置类;  在InteliJ IDEA 的控制台输出的运行 MapReduce 使命的日志,工具类的实当代码:
https://i-blog.csdnimg.cn/direct/5ecf08ec0ba64fd487dcca49a5c73d26.png
https://i-blog.csdnimg.cn/direct/8e5195bfef914b5883fceef9f673857e.png
https://i-blog.csdnimg.cn/direct/7e1344fc49be4f7fae1c5ca1fc5e7d48.png
编写自动打包的工具类之后,只需在设置Hadoop集群配置时将设置Jar包路径的代码修改为以下代码所示的代码即可,无须将程序打包即可在IntelJIDEA中直接提交MapReduce 使命。
https://i-blog.csdnimg.cn/direct/3898a090ed8f49598d2352b353b25694.png
三.小结

   本次是 MapReduce 进阶编程,先容的内容包括 MapReduce 的输出及输人格式、HadoopJava API、自定义键值类型、Combiner、Partitioner、自定义计数器以及在IntelliJ DEA中直接提交并运行 MapReduce 使命。学习了MapReduce 进阶编程的知识后,优化了日志文件的统计程序。其中,自定义键值类型、Combiner、Partitioner 和辅助类 ToolRunner 对程序的优化起到了非常积极的作用,在一定水平上可以进步程序运行的效率。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Hadoop在 IntelliJ IDEA 中打包并提交 MapReduce 程序