Hadoop有一个本地作业运行器,可以使MapReduce执行引擎在本地的单个JVM上运行作业,主要设计用于测试本地代码,可以进行调试等操作。
本地运行与服务器上最大区别就是不能运行多个reducer,只能运行<=1个reduce操作,但是不影响调试。
使用本地作业运行器只需要通过配置一个参数即可,就是mapreduce.jobtracker.address值设置为local就会运行本地不访问外部jobtracker,默认值就是local。
步骤比较简单
前期准备:
1. 建立Maven项目导入Hadoop相关依赖包以后,完成Map和Reduce的编写。
2. 下载Hadoop-xxx.tar.gz(和服务器用的一个版本即可),解压放到本地hadoop目录。
下载地址:Hadoop各版本3. 下载winutils.exe(本地运行模拟linux上执行命令用的),下载地址:WinUtils.exe及本地库
开始配置:1. 下载的winutils.exe和相关文件复制到hadoop/bin下。
2. 开始准备调试代码,选择写好的方法入口,点击Debug Configuration,添加参数如下:
Program Arguments是程序运行参数,-conf 是hadoop命令参数,后面hadoop-local.xml是一个配置文件,主要是配置hadoop本地运行器运行程序,在我项目中的src/main/resources下,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property> <name>fs.defaultFS</name> <value>file:///</value> </property> <property> <name>mapreduce.jobtracker.address</name> <value>local</value> </property> </configuration>
fs.defaultFS : 配置为本地文件系统, mapreduce.jobtracker.address为local本地模式。VM Arguments 是动态指定的两个参数,-Dproperty=value 配置的hadoop临时目录和安装目录,可以在windows环境变量中配置HADOOP_HOME代替hadoop.home.dir, 在hadoop-local.xml配置hadoop.tmp.dir代替写在VM参数中hadoop.tmp.dir。(配置在环境和项目中就不用每次运行VM参数都要写了)
上述配置完成后,还需要配置PATH,就是window环境变量中的PATH,我这里配置到项目运行环境上了,(你可以配置到环境变量里去,和java的PATH添加方式相同)如下:
这个参数不配置,会导致如下异常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method) at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:609) at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:977) at org.apache.hadoop.util.DiskChecker.checkAccessByFileMethods(DiskChecker.java:187) at org.apache.hadoop.util.DiskChecker.checkDirAccess(DiskChecker.java:174) at org.apache.hadoop.util.DiskChecker.checkDir(DiskChecker.java:108) at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.confChanged(LocalDirAllocator.java:285) at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:344) at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:150) at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:131) at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:115) at org.apache.hadoop.mapred.LocalDistributedCacheManager.setup(LocalDistributedCacheManager.java:125) at org.apache.hadoop.mapred.LocalJobRunner$Job.<init>(LocalJobRunner.java:163) at org.apache.hadoop.mapred.LocalJobRunner.submitJob(LocalJobRunner.java:731) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:240) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308) at com.tom.MaxTemperatureDriver.run(MaxTemperatureDriver.java:59) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) at com.tom.MaxTemperatureDriver.main(MaxTemperatureDriver.java:68)
是hadoop调用window本地库访问目录时权限问题导致的。
Hadoop环境变量相关配置:看这里,里面有一点
完成配置后,点击debug,运行就可以跟踪代码了,控制台输出如下:
(如有理解描述偏差以及错误,请及时打脸,啪啪啪...)
Eclipse中采用本地作业运行器(Job Runner)运行Hadoop测试(Hadoop2.7.3) - 1
最新推荐文章于 2022-08-27 07:48:50 发布