这个命令实际上是转化成下面的命令来运行的 在RunJar中,会读取abc.jar文件,然后尝试从manifest中提取Main-Class作为mainClass,如果manifest中没有指定,则把abc.jar之后的下一个参数当成mainClass。 接下来,RunJar会在本地创建一个临时目录(下面称为workDir,类似/tmp/hadoop-unjar...),然后把abc.jar解压到这个目录中。然后,把wrokDir、workDir/classes和workDir/lib下的所有文件路径 添加到一个变量中,然后使用URLClassLoader将这个变量指定的所有路径加载到当前线程。 最后,使用反射调用mainClass的main函数,进入用户自己的代码。 当我们的代码调用job.waitForCompletion时,会调用JobClient.copyAndConfigureFiles,把本地的jar文件拷贝到HDFS上面/tmp/hadoop/mapred/staging/<jobid/job.jar/的目录下。 TaskTracker获取到一个Task之后,会启动一个线程TaskLauncher来处理这个Task。在启动这个Task之前,会调用taskController.initializeJob来初始化Job,把Job相关的内容从HDFS上拷贝到本地(JobLocalizer.localizeJobJarFile负责拷贝jar并解压到本地workDir中)。 后面TaskRunner.getClassPaths把 wrokDir、workDir/classes和workDir/lib下的所有文件路径 添加到一个变量中,然后使用这个变量构造启动JVM的参数,最后启动一个新的JVM来运行Job。 从这个流程可以看出,我们jar中的 根目录,classes目录,和lib下的所有文件 都被添加到了执行环境(另外还有系统自身的环境变量CLASSPATH和Hadoop自身依赖的库)中。 因此,如果我们想要在我们的hadoop中添加一个外部的库,可以有两种方法: 1.把外部的jar解压了,然后将所有的.class与我们自己的代码打包在一起(maven-shade-plugin可以很轻松地帮我们做这件事); 2.创建一个lib目录,把依赖的jar文件放在里面,然后把lib目录和我们的代码打包在一起。 最后,提一下-libjars参数。如果我们使用ToolRunner.run来启动我们的Job,那么可以使用-libjars来指定依赖的外部jar。 不过-libjars有一定的局限性,由于-libjars来指定依赖的外部jar是在ToolRunner.run中使用GenericOptionsParser来加载的,因此在调用ToolRunner.run之前,外部jar还没有加载,不能使用这些类,甚至import(直接或间接)也不行(JVM加载一个类时会先检查这个类所引用的其他类型是否都可以找得到)。如果搞不清楚外部jar在何时可以用,不建议使用-libjars。 当然在Map和Reduce阶段时,-libjars来指定依赖的外部jar就完全可以无限制地使用了。Hadoop会自动把-libjars来指定依赖的外部jar上传到HDFS上,每个Job在执行之前,这些jar会自动被拷贝到本地,并设置到classpath中。
一般情况下,我们会使用下面的命令来运行一个hadoop任务:
hadoop jar abc.jar arg0 arg1 ...
这个命令实际上是转化成下面的命令来运行的
java org.apache.hadoop.util.RunJar abc.jar arg0 arg1 ...
在RunJar中,会读取abc.jar文件,然后尝试从manifest中提取"Main-Class"作为mainClass,如果manifest中没有指定,则把abc.jar之后的下一个参数当成mainClass。
接下来,RunJar会在本地创建一个临时目录(下面称为workDir,类似/tmp/hadoop-unjar...),然后把abc.jar解压到这个目录中。
然后,把wrokDir、workDir/classes和workDir/lib下的所有文件路径添加到一个变量中,然后使用URLClassLoader将这个变量指定的所有路径加载到当前线程。
最后,使用反射调用mainClass的main函数,进入用户自己的代码。
当我们的代码调用job.waitForCompletion时,会调用JobClient.copyAndConfigureFiles,把本地的jar文件拷贝到HDFS上面/tmp/hadoop/mapred/staging/<jobid>/job.jar/的目录下。
接下来我们来看TaskTracker是如何获取和使用abc.jar的。
TaskTracker获取到一个Task之后,会启动一个线程TaskLauncher来处理这个Task。在启动这个Task之前,会调用taskController.initializeJob来初始化Job,把Job相关的内容从HDFS上拷贝到本地(JobLocalizer.localizeJobJarFile负责拷贝jar并解压到本地workDir中)。
后面TaskRunner.getClassPaths把wrokDir、workDir/classes和workDir/lib下的所有文件路径添加到一个变量中,然后使用这个变量构造启动JVM的参数,最后启动一个新的JVM来运行Job。
从这个流程可以看出,我们jar中的根目录,classes目录,和lib下的所有文件都被添加到了执行环境(另外还有系统自身的环境变量CLASSPATH和Hadoop自身依赖的库)中。
因此,如果我们想要在我们的hadoop中添加一个外部的库,可以有两种方法:
1.把外部的jar解压了,然后将所有的.class与我们自己的代码打包在一起(maven-shade-plugin可以很轻松地帮我们做这件事);
2.创建一个lib目录,把依赖的jar文件放在里面,然后把lib目录和我们的代码打包在一起。
最后,提一下-libjars参数。如果我们使用ToolRunner.run来启动我们的Job,那么可以使用-libjars来指定依赖的外部jar。
不过-libjars有一定的局限性,由于-libjars来指定依赖的外部jar是在ToolRunner.run中使用GenericOptionsParser来加载的,因此在调用ToolRunner.run之前,外部jar还没有加载,不能使用这些类,甚至import(直接或间接)也不行(JVM加载一个类时会先检查这个类所引用的其他类型是否都可以找得到)。如果搞不清楚外部jar在何时可以用,不建议使用-libjars。
当然在Map和Reduce阶段时,-libjars来指定依赖的外部jar就完全可以无限制地使用了。Hadoop会自动把-libjars来指定依赖的外部jar上传到HDFS上,每个Job在执行之前,这些jar会自动被拷贝到本地,并设置到classpath中。
本文的分析基于hadoop 1.0.3。
相关推荐
6. **Hadoop Shuffle Service**:提供MapReduce作业的中间数据分发服务,确保数据在Reduce阶段的正确处理。对应的JAR包可能包括`hadoop-mapreduce-client-shuffle-*.jar`。 7. **Hadoop Auth**:提供了认证和安全...
1. **导入JAR包**:下载Hadoop相关组件的JAR文件,通常可以从Apache Hadoop的官方网站或者通过Hadoop发行版获取。将这些JAR包添加到Eclipse项目的“lib”目录下。 2. **构建路径设置**:在Eclipse项目中右击,选择...
“jar”代表Java Archive,是Java类库的打包格式,用于收集多个类文件、相关的元数据和资源文件到一个文件中,便于分发和使用。“hadoop”标签明确了这是关于Hadoop生态系统的资源。 在压缩包的子文件名列表中,...
这个“HadoopJar.rar”文件似乎是一个压缩包,包含与Eclipse集成Hadoop MapReduce相关的资源。Eclipse是一款强大的集成开发环境(IDE),它支持多种编程语言,包括Java,而Hadoop主要是用Java编写的。为了在Eclipse...
总结来说,“hadoop-2.5.2.tar.gz”是Hadoop 2.5.2版本的完整分发包,包含了Hadoop的核心组件、配置文件和文档,适用于搭建、学习和开发分布式大数据处理环境。用户可以通过下载、解压和配置这个压缩包,深入了解和...
学习这份源码,开发者可以理解Hadoop如何在内部处理文件的分发和管理,这对于优化大型MapReduce作业的性能至关重要。同时,也可以发现可能的性能瓶颈,进而提出改进方案,例如优化文件分发算法、减少网络传输开销等...
3. **打包为JAR**:为了方便分发和执行,可以将编译后的类打包成JAR文件,如`jar cf HadoopFSOperations.jar HadoopFSOperations.class`。 4. **运行程序**:通过`hadoop jar HadoopFSOperations.jar`命令运行程序...
3. 执行MapReduce任务:使用`hadoop jar`命令提交任务到集群,进行分布式计算。 4. 结果获取:计算完成后,使用`hadoop fs -get`命令将结果下载回本地。 Hadoop 2.7.2在大数据处理领域具有广泛的适用性,无论是...
9. **Hadoop客户端工具**:Hadoop提供了一系列命令行工具,如`hadoop fs`用于交互式操作HDFS,`hadoop jar`用于执行MapReduce作业。熟悉这些工具的用法能帮助你更好地管理和使用Hadoop。 10. **注意事项**:在...
- 运行MapReduce作业:./bin/hadoop jar 示例程序.jar 主类名 输入路径 输出路径 7. Hadoop的版本更新: - 在Hadoop 0.20版本中,hadoop-site.xml被分离成三个XML文件,分别是:conf-site.xml、mapred-site.xml、...
最后,通过Hadoop提供的命令行工具,如`hadoop fs`和`hadoop jar`,可以与HDFS交互和运行MapReduce作业。 ### 分布式开发与调试 在分布式环境中,开发和调试Hadoop程序需要特别关注数据分布、任务调度和错误处理。...
插件会自动构建JAR文件,并将其提交到本地或远程的Hadoop集群进行执行。 为了便于调试,Hadoop Eclipse插件允许你在本地运行MapReduce作业,这样可以快速测试和调整代码。只需在运行配置中选择"Local Mode"(本地...
通常,这样的文件解压后会包含一个或多个`.jar`文件,这些文件包含了插件的实现代码,以及可能的配置文件和资源文件。 总的来说,这个插件旨在增强IntelliJ IDEA对Hadoop开发的支持,提供诸如代码高亮、自动补全、...
然后,在Eclipse中,我们需要创建一个Hadoop项目,并添加Hadoop相关的JAR文件到项目的类路径。这些JAR文件通常可以从Hadoop的lib目录中获取,包含MapReduce库和其他依赖。 接下来,我们可以开始编写MapReduce程序。...
压缩包内的“hadoop-3.2.1”文件夹很可能包含了经过上述步骤编译后的Hadoop发行版,包括可执行的JAR文件、配置文件、文档等。用户可以直接解压到树莓派上,按照Hadoop的安装指南进行配置和启动,从而在树莓派上建立...
在描述中提到了一个基于CDH5.14.0的伪分布式环境搭建步骤,这通常包括解压Hadoop安装包、安装依赖库(如openssl-devel)、修改配置文件、创建数据存储目录、分发安装包和配置环境变量。例如,通过`tar`命令解压,`...
- **分发公钥**:将公钥文件`id_rsa.pub`复制到其他节点的`authorized_keys`文件中,以便实现免密码SSH登录。 **3. 配置Hadoop环境** - **安装Hadoop**:将Hadoop安装包解压到指定目录,如`/opt/hadoop-2.7.0`。 -...
3. **编译和构建**:插件能够自动编译MapReduce程序,并生成相应的JAR文件,适合集群运行。 4. **调试**:集成的调试器允许在本地或远程集群上调试MapReduce作业,定位问题更方便。 5. **资源管理**:用户可以直观地...
在Hadoop源代码中,我们可以深入理解其内部工作原理,包括数据块的分发、容错机制、任务调度和数据本地化等关键功能。以下是Hadoop源代码中的一些关键知识点: 1. **HDFS架构**:HDFS由NameNode和DataNode组成。...
总的来说,配置Idea运行MapperReduce本地环境涉及安装Java环境、获取Hadoop、配置环境变量、编写MapReduce代码、打包JAR文件以及在IDEA中设置运行配置。这个过程对于Hadoop开发者来说是基础且重要的,因为它提供了...