hadoop提交作业分析
hadoop分布式实验总结

hadoop分布式实验总结Hadoop分布式实验总结一、实验目标本次实验的目标是深入理解Hadoop分布式文件系统(HDFS)和MapReduce计算模型,通过实际操作和案例分析,掌握Hadoop的基本原理和应用。
二、实验内容在本次实验中,我们主要完成了以下几个部分的内容:1. HDFS的基本操作:包括在HDFS中创建文件夹、上传和下载文件等。
2. MapReduce编程:编写Map和Reduce函数,实现对数据的处理和分析。
3. Hadoop集群搭建:配置Hadoop集群,了解节点间的通信和数据传输机制。
4. 性能优化:通过调整参数和优化配置,提高Hadoop集群的性能。
三、实验过程1. HDFS操作:首先,我们在本地机器上安装了Hadoop,并启动了HDFS。
然后,我们通过Hadoop命令行工具对HDFS进行了基本的操作,包括创建文件夹、上传和下载文件等。
在操作过程中,我们遇到了权限问题,通过修改配置文件解决了问题。
2. MapReduce编程:我们选择了一个经典的问题——单词计数作为案例,编写了Map和Reduce函数。
在编写过程中,我们了解了MapReduce的基本原理和编程模型,以及如何处理数据的分片和shuffle过程。
3. Hadoop集群搭建:我们在实验室的局域网内搭建了一个Hadoop集群,配置了各个节点之间的通信和数据传输。
在配置过程中,我们注意到了防火墙和网络通信的问题,通过调整防火墙规则和配置网络参数,解决了问题。
4. 性能优化:我们对Hadoop集群进行了性能优化,通过调整参数和优化配置,提高了集群的性能。
我们了解到了一些常用的优化方法,如调整数据块大小、优化网络参数等。
四、实验总结通过本次实验,我们深入了解了Hadoop分布式文件系统和MapReduce计算模型的基本原理和应用。
在实验过程中,我们遇到了一些问题,但通过查阅资料和互相讨论,最终解决了问题。
通过本次实验,我们不仅掌握了Hadoop的基本操作和编程技能,还提高了解决实际问题的能力。
Hadoop实训总结1000字

Hadoop实训总结1000字最近学习了hadoop这个框架,把自己的理解总结如下:1、hadoop通过一个jobtracker分派任务到一系列tasktracker来运行,tasktracker同时向jobtracker返回任务运行结果。
jobtracker对作业的输入数据进行分片,然后为每个分片创建一个map任务,同时创建一定数量的reduce任务,并指派空闲的tasktracker 来执行这些任务。
tasktracker从jobtracker处获取任务jar包以及分片的输入数据,然后新建jvm来执行,并定期反馈执行进度情况。
2、map任务就是进行原始数据的提取工作,提取数据后进行sufflix 排序,排序后的数据作为reduce的输入,然后经过reduce的统计计算得到最后结果。
3、hdfs对数据进行分块,然后存储在datanote里,datanote向namenode报告自己存储的文件块,客户端通过访问namenode来得知构成文件的各个数据块的具体存放datanote,进而从datanote中读取整个文件。
4、hadoop作业的输入数据必须在作业执行前是固定的,然后才能进行数据的分片,所以不能胜任增量的流式数据处理作业。
5、mapreduce本身需要编写java代码,优化起来也比较复杂,而pig可以让用户通过脚本语句Latin来操作数据,并将脚本语句转换成mapreduce来在hadoop中执行,pig并不要求被操作的数据满足关系数据库模式。
6、hive构建于hadoop的数据仓库,能够对存储在HDFS中的数据增加元数据,从而提供SQL风格的数据操作,再将操作翻译成mapreduce来在hadoop中执行。
hive与pig的主要区别是hive能提供SQL风格数据库表操作,而pig使用自定义的Latin脚本来直接操作数据,pig更轻量。
7、hbase是一个按列存储的分布式数据库,它的表不满足关系数据库模式且不支持SQL查询,可以将数据存储在HDFS上。
hadoop分析

1.前言学习hadoop的童鞋,倒排索引这个算法还是挺重要的。
这是以后展开工作的基础。
首先,我们来认识下什么是倒拍索引:倒排索引简单地就是:根据单词,返回它在哪个文件中出现过,而且频率是多少的结果。
这就像百度里的搜索,你输入一个关键字,那么百度引擎就迅速的在它的服务器里找到有该关键字的文件,并根据频率和其他一些策略(如页面点击投票率)等来给你返回结果。
这个过程中,倒排索引就起到很关键的作用。
2.分析设计倒排索引涉及几个过程:Map过程,Combine过程,Reduce过程。
下面我们来分析以上的过程。
2.1Map过程当你把需要处理的文档上传到hdfs时,首先默认的TextInputFormat类对输入的文件进行处理,得到文件中每一行的偏移量和这一行内容的键值对<偏移量,内容>做为map的输入。
在改写map函数的时候,我们就需要考虑,怎么设计key和value的值来适合MapReduce框架,从而得到正确的结果。
由于我们要得到单词,所属的文档URL,词频,而<key,value>只有两个值,那么就必须得合并其中得两个信息了。
这里我们设计key=单词+URL,value=词频。
即map得输出为<单词+URL,词频>,之所以将单词+URL做为key,时利用MapReduce框架自带得Map端进行排序。
下面举个简单得例子:图1 map过程输入/输出2.2 Combine过程combine过程将key值相同得value值累加,得到一个单词在文档上得词频。
但是为了把相同得key交给同一个reduce处理,我们需要设计为key=单词,value=URL+词频图2 Combin过程输入/输出2.3Reduce过程reduce过程其实就是一个合并的过程了,只需将相同的key值的value值合并成倒排索引需要的格式即可。
图3 reduce过程输入/输出。
hadoop mr的流程 -回复

hadoop mr的流程-回复Hadoop MapReduce(Hadoop MR)是Hadoop生态系统中的一种分布式计算框架,被广泛用于大数据处理和分析。
它的流程包括作业提交、输入分片、Map阶段、Shuffle阶段、Reduce阶段以及作业完成。
下面将详细介绍Hadoop MR的流程,以帮助读者更好地理解该框架的工作原理。
1. 作业提交:Hadoop MR作业的提交是指将用户编写的MapReduce程序提交给Hadoop集群进行处理。
用户可以使用Hadoop提供的命令行工具或编程接口来提交作业,并指定作业所需的输入和输出路径、任务的配置参数等信息。
2. 输入分片:在作业提交后,Hadoop会根据用户指定的输入路径将输入数据切分成多个分片。
这些分片可以是文件的一部分或者是文件的整个内容,每个分片可由一个或多个连续的数据块组成。
分片的大小通常由Hadoop配置的块大小决定,一般为64MB或128MB。
3. Map阶段:在Map阶段,Hadoop会为每个分片创建一个Map任务,并将该分片的数据块复制到任务所在的节点上进行计算。
用户需要编写自己的Map函数,将输入分片中的每一条记录转换成键值对的形式,并将它们输出给Reduce任务。
Map任务的数量通常由Hadoop配置的分片数决定。
4. Shuffle阶段:Shuffle阶段是MapReduce中的关键步骤,它负责对Map任务的输出进行排序和归并。
在该阶段,Hadoop会将Map任务的输出按照键进行排序,并将具有相同键的记录分配给同一个Reduce任务。
这样做的目的是为了让Reduce任务可以高效地对具有相同键的所有记录进行处理。
5. Reduce阶段:在Reduce阶段,Hadoop会为每个Reduce任务分配一组具有相同键的记录,并将它们作为Reduce函数的输入。
用户需要编写自己的Reduce 函数,对这些记录进行具体的计算和处理,并将最终结果输出到指定的输出路径中。
hadoop实训反思与思考

hadoop实训反思与思考作为一个 Hadoop 实训的参与者,我深刻地意识到了大数据时代来临的重要性和机遇。
通过这次实训,我不仅掌握了 Hadoop 的基本原理和常用命令,还了解了 Hive、Spark 等大数据处理技术。
然而,在实训中也暴露出一些问题,例如数据质量、数据处理效率等。
因此,我对 Hadoop 实训的反思和思考主要集中在以下几个方面:1. 数据质量:在 Hadoop 实训中,我们通常使用的数据集都是来自互联网的公共数据集,而这些数据集的质量往往不能保证。
因此,在实际应用中,我们需要更加关注数据的质量,包括数据的准确性、完整性、一致性等。
否则,如果数据质量不好,将会影响后续的数据分析和处理。
2. 数据处理效率:Hadoop 生态系统中的 MapReduce 算法是一种高效的数据处理算法,但是在实际应用中,由于数据集大小、数据分布、节点性能等因素的不同,数据处理效率可能会存在较大的差异。
因此,在实训中,我们需要考虑到数据处理的效率,选择合适的算法和工具来提高数据处理效率。
3. 数据隐私和安全:在大数据时代,数据的隐私和安全是非常重要的问题。
在 Hadoop 实训中,我们使用的数据集通常都是公开的,但是如果我们处理的数据涉及到用户的隐私信息,那么我们就需要更加关注数据隐私和安全的问题。
因此,在实训中,我们需要加强数据隐私和安全的保护,确保用户的个人信息不会被泄露。
Hadoop 实训是一个非常有意义的项目,它让我们深刻地认识到了大数据时代的重要性和机遇。
但是,在实训中,我们也暴露出一些问题,例如数据质量、数据处理效率等。
因此,我对 Hadoop 实训的反思和思考主要集中在以下几个方面:数据质量、数据处理效率、数据隐私和安全。
Hadoop大作业解析

网络大数据课程作业目录1 实验环境部署 (1)1.1 主机环境 (1)1.2虚拟机环境 (1)2 方法介绍 (1)2.1 文本聚类 (1)2.2 主要的聚类方法 (2)2.3 K-means算法 (3)2.4 Hadoop实现 (4)2.5 Spark实现 (7)3 实验结果统计 (8)4 对两个平台上实现方法的对比 (8)5 收获与建议 (9)附录 (10)网络大数据课程作业1 实验环境部署1.1 主机环境处理器Intel(R) Core(TM)2 Duo CPU 2.80GHz内存8.00GB操作系统WIN7SP1 64bit1.2虚拟机环境VMware® Workstation 10.0.2 build-1744117处理器2Core内存4GB操作系统Ubuntu12.04 LTS Desktop 32bitHadoop与Spark环境在之前的练习中已经搭好。
2 方法介绍2.1 文本聚类文本聚类(Text clustering)主要是依据著名的聚类假设:同类的文档相似度较大,而不同类的文档相似度较小。
作为一种无监督的机器学习方法,聚类由于不需要训练过程,以及不需要预先对文档手工标注类别,因此具有一定的灵活性和较高的自动化处理能力,已经成为对文本信息进行有效地组织、摘要和导航的重要手段。
文本聚类可以用于生成一篇简明扼要的摘要文档;对搜索引擎返回的结果进行聚类,使用户迅速定位到所需要的信息;对用户感兴趣的文档(如用户浏览器cache中的网页)聚类,从而发现用户的兴趣模式并用于信息过滤和信息主动推荐等服务;数字图书馆服务;文档集合的自动整理等等。
2.2 主要的聚类方法(1)基于划分的方法基于划分的聚类算法(Partitioning Method)是文本聚类应用中最为普遍的算法。
方法将数据集合分成若干个子集,它根据设定的划分数目k选出k个初始聚类中心,得到一个初始划分,然后采用迭代重定位技术,反复在k个簇之间重新计算每个簇的聚类中心,并重新分配每个簇中的对象,以改进划分的质量。
hadoop结课大作业
hadoop结课大作业
Hadoop课程的期末大作业是一个有趣而有挑战性的任务,我们将使用HadoopMapReduce技术来处理海量信息和数据集,以创建出我们的期末大作业。
首先,我们需要建立一个分布式的Hadoop集群,同时使用Java 技术来编写MapReduce程序。
这些程序将以某种具体的形式(如XML 文件)来反映出所要处理的大量信息。
接下来,我们在Hadoop集群上发布MapReduce程序来处理相应的数据集。
在这个过程中,我们需要设定一些配置参数,以确保MapReduce程序能够正确处理包含在数据集中的大量信息。
之后,我们再根据需要,使用MapReduce API来准备和处理数据集,以便在Hadoop上可以获取所需的集群结果。
在此过程中,我们可以通过设定不同参数来调整MapReduce应用程序的性能。
最后,我们通过对相应的结果进行分析,从而得出期末大作业的最终结果。
总而言之,Hadoop课程的期末大作业需要我们使用HadoopMapReduce技术来处理大量信息和数据集,以便获得期末大作业的最终结果。
Hadoop综合大作业
Hadoop综合⼤作业
Hadoop综合⼤作业要求:
1.将爬⾍⼤作业产⽣的csv⽂件上传到HDFS
2.对CSV⽂件进⾏预处理⽣成⽆标题⽂本⽂件
3.把hdfs中的⽂本⽂件最终导⼊到数据仓库Hive中
4.在Hive中查看并分析数据
5.⽤Hive对爬⾍⼤作业产⽣的进⾏数据分析,写⼀篇博客描述你的分析过程和分析结果。
(10条以上的查询分析)
(1)查询不重复id的评论数
(2)查询前⼗条信息的所属城市
(3)查询前⼆⼗条信息的评论时间
(4)查询评论次数最多的20个⽤户
(5)查询城市中评分为5分的数量最多的前20名
(6)查询城市中评低于3分的前20名
(7)查询评论数前20名的城市
(8)查询不重复昵称的评论数
(9)计算出表内⼀共有⼏条评论数据
(10)查看评论⾥各评分的评论数
总结分析:在第⼀次上传⽂件到hive的时候发现并没有预想中的按列排序,后来把pre_deal.sh⽂件中默认的分列符改了之后就可以了。
通过数据分析出来的结果,可以看出北京上海这些⼀些城市与观看评论的时间都⽐较靠前,⽽且评分也相对较⾼。
通过对评论打分的数⽬分析也可以看出,打分4分以上的⼈数很多,占很⼤的⽐重,证明这也⼀部很精彩很受⼈喜欢的电影。
hadoop实验报告总结
hadoop实验报告总结Hadoop是一个大数据处理框架,它可以处理 petabyte 级别的数据存储和处理。
在大数据时代,Hadoop 的使用越来越普及,因此学习和掌握 Hadoop 成为了当今大数据从业人员的必修课。
本实验报告旨在介绍 Hadoop 的使用,以及在使用过程中所遇到的问题和解决方法。
我们需要了解 Hadoop 的基本架构。
Hadoop 的基本组成部分包括 HDFS(Hadoop Distributed File System),MapReduce,YARN(Yet Another Resource Negotiator)等。
HDFS 是一个用于存储和管理大数据的分布式文件系统,MapReduce 是一种用于分布式数据处理的编程模型,YARN 则是一个资源管理系统。
这三个组成部分相互配合,使得Hadoop 可以完成大数据存储和处理的任务。
在本次实验中,我们主要使用 HDFS 和 MapReduce 进行操作。
在使用 HDFS 进行操作之前,我们需要了解 HDFS 的基本概念和几个关键点。
HDFS 的文件以块的形式存储在不同的数据节点中,每个块的大小默认为 128MB。
每个文件至少会存储在三个数据节点中,以确保数据的容错性和高可用性。
HDFS 还具有很好的扩展性,可以根据需要增加更多的数据节点。
在使用 HDFS 进行操作时,我们可以使用 Hadoop 自带的命令行界面或者使用 GUI工具,如 Apache Ambari。
在本次实验中,我们使用了 Hadoop 自带的命令行界面进行操作。
在操作中,我们通过以下几个步骤实现了文件的上传、下载和删除操作:1. 使用命令 `hdfs dfs -put` 上传文件到 HDFS 上。
2. 使用命令 `hdfs dfs -get` 从 HDFS 上下载文件到本地。
3. 使用命令 `hdfs dfs -rm` 删除 HDFS 上的文件。
在使用 HDFS 时还需要注意以下几个关键点:1. 在上传文件时需要指定文件的大小和副本数,默认情况下副本数为 3。
如何在Hadoop中使用MapReduce进行数据分析
如何在Hadoop中使用MapReduce进行数据分析在当今信息爆炸的时代,数据分析已经成为了企业和组织决策的重要工具。
而Hadoop作为一个开源的分布式计算框架,提供了强大的数据处理和分析能力,其中的MapReduce就是其核心组件之一。
本文将介绍如何在Hadoop中使用MapReduce进行数据分析。
首先,我们需要了解MapReduce的基本原理。
MapReduce是一种分布式计算模型,它将大规模的数据集划分成若干个小的数据块,然后通过Map和Reduce两个阶段进行并行处理。
在Map阶段,数据集会被分割成若干个键值对,每个键值对由一个键和一个值组成。
然后,Map函数会对每个键值对进行处理,生成一个新的键值对。
在Reduce阶段,相同键的值会被分组在一起,然后Reduce函数会对每个键的值进行聚合和处理,最终生成最终的结果。
在Hadoop中使用MapReduce进行数据分析的第一步是编写Map和Reduce函数。
在编写Map函数时,我们需要根据具体的数据分析任务来定义键值对的格式和生成方式。
例如,如果我们要统计某个网站的访问量,那么键可以是网站的URL,值可以是1,表示一次访问。
在Reduce函数中,我们需要根据具体的需求来定义对键的值进行聚合和处理的方式。
例如,如果我们要统计每个网站的总访问量,那么Reduce函数可以将所有的值相加得到最终的结果。
编写好Map和Reduce函数后,我们需要将数据加载到Hadoop中进行分析。
在Hadoop中,数据通常以HDFS(Hadoop Distributed File System)的形式存储。
我们可以使用Hadoop提供的命令行工具或者编写Java程序来将数据加载到HDFS 中。
加载完成后,我们就可以使用Hadoop提供的MapReduce框架来进行数据分析了。
在运行MapReduce任务之前,我们需要编写一个驱动程序来配置和提交任务。
在驱动程序中,我们需要指定Map和Reduce函数的类名、输入数据的路径、输出数据的路径等信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hadoop提交作业流程分析bin/hadoop jar mainclass args ……这样的命令,各位玩Hadoop的估计已经调用过NN次了,每次写好一个Project或对Project做修改后,都必须打个Jar包,然后再用上面的命令提交到Hadoop Cluster上去运行,在开发阶段那是极其繁琐的。
程序员是“最懒”的,既然麻烦肯定是要想些法子减少无谓的键盘敲击,顺带延长键盘寿命。
比如有的人就写了些Shell脚本来自动编译、打包,然后提交到Hadoop。
但还是稍显麻烦,目前比较方便的方法就是用Hadoop eclipse plugin,可以浏览管理HDFS,自动创建MR程序的模板文件,最爽的就是直接Run on hadoop了,但版本有点跟不上Hadoop的主版本了,目前的MR模板还是的。
还有一款叫Hadoop Studio的软件,看上去貌似是蛮强大,但是没试过,这里不做评论。
那么它们是怎么做到不用上面那个命令来提交作业的呢不知道没关系,开源的嘛,不懂得就直接看源码分析,这就是开源软件的最大利处。
我们首先从bin/hadoop这个Shell脚本开始分析,看这个脚本内部到底做了什么,如何来提交Hadoop作业的。
因为是Java程序,这个脚本最终都是要调用Java来运行的,所以这个脚本最重要的就是添加一些前置参数,如CLASSPATH等。
所以,我们直接跳到这个脚本的最后一行,看它到底添加了那些参数,然后再逐个分析(本文忽略了脚本中配置环境参数载入、Java查找、cygwin 处理等的分析)。
#run itexec "$JAVA"$JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH"$CLASS "$@"从上面这行命令我们可以看到这个脚本最终添加了如下几个重要参数:JAVA_HEAP_MAX、HADOOP_OPTS、CLASSPATH、CLASS。
下面我们来一个个的分析(本文基于Cloudera Hadoop 分析)。
首先是JAVA_HEAP_MAX,这个就比较简单了,主要涉及代码如下:JAVA_HEAP_MAX=-Xmx1000m# check envvars which might override default argsif [ "$HADOOP_HEAPSIZE" !="" ];then#echo"run with heapsize $HADOOP_HEAPSIZE"JAVA_HEAP_MAX="-Xmx""$HADOOP_HEAPSIZE""m"#echo$JAVA_HEAP_MAXfi首先赋予默认值-Xmx1000m,然后检查中是否设置并导出了HADOOP_HEAPSIZE,如果有的话,就使用该值覆盖,得到最后的JAVA_HEAP_MAX。
接着是分析CLASSPATH,这是这个脚本的重点之一。
这部分主要就是添加了相应依赖库和配置文件到CLASSPATH。
# 首先用Hadoop的配置文件目录初始化CLASSPATH CLASSPATH="${HADOOP_CONF_DIR}"……# 下面是针对于Hadoop发行版,添加Hadoop核心Jar包和webapps 到CLASSPATHif [ -d "$HADOOP_HOME/webapps" ];thenCLASSPATH=${CLASSPATH}:$HADOOP_HOMEfifor f in $HADOOP_HOME/hadoop-*;doCLASSPATH=${CLASSPATH}:$f;done# 添加libs里的Jar包for f in $HADOOP_HOME/lib/*.jar;doCLASSPATH=${CLASSPATH}:$f;Donefor f in $HADOOP_HOME/lib/*.jar;doCLASSPATH=${CLASSPATH}:$f;done# 下面的TOOL_PATH只在命令为“archive”时才添加到CLASSPATH for f in $HADOOP_HOME/hadoop-*;doTOOL_PATH=${TOOL_PATH}:$f;donefor f in $HADOOP_HOME/build/hadoop-*;doTOOL_PATH=${TOOL_PATH}:$f;done# 最后添加用户的自定义Hadoop Classpathif [ "$HADOOP_CLASSPATH" !="" ];thenCLASSPATH=${CLASSPATH}:${HADOOP_CLASSPATH}fi上面只分析一部分,由于代码比较长,针对开发者部分的CLASSPATH添加没有列出来。
下面是这个脚本的重点、实体之处:CLASS分析。
Shell脚本会根据你输入的命令参数来设置CLASS和HADOOP_OPTS,其中CLASS所指向的类才是最终真正执行你的命令的实体。
# figure out which class to runif [ "$COMMAND"="namenode" ] ;thenCLASS=''HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"……elif [ "$COMMAND"="fs" ] ;thenCLASS=HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"……elif [ "$COMMAND"="jar" ] ;thenCLASS=……elif [ "$COMMAND"="archive" ] ;thenCLASS=CLASSPATH=${CLASSPATH}:${TOOL_PATH}HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"……elseCLASS=$COMMANDfi这里我们要关心的就是"$COMMAND" = "jar"时对应的类,这个类等下我们继续分析,这是我们通向最终目标的下一个路口。
脚本在最后还设置了、等HADOOP_OPTS。
接着,就利用exec命令带上刚才的参数提交任务了。
通过对上面的分析,我们知道了,如果想取代这个脚本,那就必须至少把Hadoop依赖的库和配置文件目录给加到CLASSPATH中(JAVA_HEAP_MAX和HADOOP_OPTS不是必须的),然后调用类来提交Jar到Hadoop。
PS:对Bash Shell不熟的可以先看看这我们分析了bin/hadoop脚本,知道了提交一个Hadoop作业所需要的基本设置以及真正执行任务提交的类。
这一篇我们就来分析这个提交任务的类,看它内部具体又做了些什么。
RunJar是Hadoop中的一个工具类,结构很简单,只有两个方法:main 和unJar。
我们从main开始一步步分析。
main首先检查传递参数是否符合要求,然后从第一个传递参数中获取jar包的名字,并试图从jar中包中获取manifest信息,以查找mainclass name。
如果查找不到mainclass name,则把传递参数中的第二个设为mainclass name。
接下去,就是在""下创建一个临时文件夹,并挂载上关闭删除线程。
这个临时文件夹用来放置解压后的jar包内容。
jar包的解压工作由unJar方法完成,通过JarEntry逐个获取jar包内的内容,包括文件夹和文件,然后释放到临时文件夹中。
解压完毕后,开始做classpath的添加,依次把解压临时文件夹、传递进来的jar包、临时文件夹内的classes文件夹和lib里的所有jar包加入到classpath中。
接着以这个classpath为搜索URL新建了一个URLClassLoader(要注意这个类加载器的parent包括了刚才bin/hadoop脚本提交时给的classpath),并设置为当前线程的上下文类加载器。
最后,利用方法,以刚才的那个URLClassLoader为类加载器,动态生成一个mainclass的Class对象,并获取它的main方法,然后以传递参数中剩下的参数作为调用参数来调用这个main方法。
好了,从上分析看来,这个RunJar类是一个很简单的类,就是解压传递进来的jar包,再添加一些classpath,然后动态调用jar包里的mainclass的main方法。
看到这里,我想你应该知道如何利用java 代码来编写一个替代bin/hadoop的程序了,主要就是两步:添加Hadoop的依赖库和配置文件;解压jar包,再添加一些classpath,并动态调用相应方法。
最偷懒的方法,直接用RunJar类就行了。
通过前面两篇文章的分析,对Hadoop的作业提交流程基本明了了,下面我们就可以开始编写代码模拟这个流程。
第一步要做的是添加Hadoop的依赖库和配置文件到classpath。
最常用的方法就是用一个容器先把各个要添加到classpath的文件或文件夹存储起来,后面再作为类加载器的URL搜索路径。
/*** Add a directory or file to classpath.** @param component*/publicstaticvoid addClasspath(String component) { if ((component !=null) && () >0)) {try {File f =new File(component);if ()) {URL key = ().toURL();if (!(key)) {(key);}}} catch (IOException e) {}}}上面的classPath变量就是我们声明用来装载classpath组件的容器。
privatestatic ArrayList<URL> classPath =new ArrayList<URL>();由于需要添加一些文件夹下的所有Jar包,所以我们还要实现一个遍历添加某文件夹下文件的方法。