hadoop libjars

一般情况下,我们会使用下面的命令来运行一个hadoop任务:这个命令实际上是转化成下面的命令来运行的在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中。
linux 监听串口 宁波合生国际城 明日花绮罗 1 x m的泰勒展开式 led三色调光原理 珠光白是什么颜色 教程 ch341a 伦敦奥运会篮球总决赛 vs2008 team suite 吴公子札来聘 lightroom 6.4 破解 css怎么给图片居中 豪爵骊爽125-20店 pgone摘帽子 cpui7 7700k用什么风冷 小米5s马来西亚 roger vivier 鞋底 玛米亚120 中文说明书 潘多拉 定时重启设置 永福老酱怎么样 佳能镜头ue编号 刘眉怎么害林小强 豆瓣 爱国者 海鹰 blue men允硕 是第几期 kimkardashian 种子 翻墙的翻译 战争给人类带来了什么 色系神曲之 催眠圣经白子飞 全本 僕わtime flyer

Copyright 知识库 Some Rights Reserved

如反馈或投诉等情况联系:une35498#163.com