【云计算】hadoop开发&调试解析
小标 2018-12-13 来源 : 阅读 1023 评论 0

摘要:本文主要向大家介绍了【云计算】hadoop开发&调试解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】hadoop开发&调试解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。


写好的hadoop任务打成jar后,可以在服务器上用命令hadoop jar 提交。但开发阶段总不能一直用这种方式来调试,最好是在本机的ide 上可以直接debug。


如果在wiindow上配置一套开发调试环境,说实话真是觉得很不爽。为了以后方便,整理了一下windows 下hadoop开发环境的配置和调试过程。


首先本地下载一个和服务器相同版本的hadoop安装包。



 


然后配置一个HADOOPHOME环境变量



 


还要去网上下载window的工具包,需要有下面两个文件。下载的时候要注意,如果你是安装的32位Jdk 那么下32位的工具包。



 


把下后的两个文件拷贝到HADOOPHOME bin目录下。


到这里配置还没有完,除了上面几个配置外,不同的场景还需要不同的配置。(我也是很无语)。


为了便于区分,接下来,我将列出本地Hadoop开发调试的四种场景。


1,本机访问Hdfs数据


如果只是访问远程hdfs目录和文件,需要有%HADOOP_HOME%,还有%HADOOP_HOME%\bin\winutils.exe就可以了。


另外运行的时候会有访问权限的问题。主要是纠结hadoop 服务器的用户名和你本地机器用户名不一样。



 


解决办法有两种


方法1:hdfs-site.xml 加上如下配置,重启。


dfs.permissions


false


方法2:加一个环境变量HADOOP_USER_NAME = 你的hadoop用户名。



 


访问路径的问题:


如果目录不加hdfs:"/user/rihai/logdata/tmp"默认会访问你本地目录。


如果想访问hdfs 目录则需要在project resource目录下放置core-site.xml。



 


fs.defaultFS


hdfs://master:9000


hadoop.tmp.dir


/home/rihai/hadoop/tmp


或者代码里指定Configuration


conf.set("fs.default.name", "hdfs://master:9000")


2,本机MapReduce,本地目录做数据源


方便说明,写一个简单的例子,我用的IDE是 IntelliJ IDEA,先创建一个Maven project.


pom.xml 配置



  


xml version="1.0" encoding="UTF-8">


4.0.0


com.rihai.hadoop


demo


pom


1.0-SNAPSHOT


hdfs


job


UTF-8


org.apache.hadoop


hadoop-client


2.6.0


代码如下:



  


1 package com.rihai.hadoop.job;


2


3 import org.apache.hadoop.conf.Configuration;


4 import org.apache.hadoop.fs.FileSystem;


5 import org.apache.hadoop.fs.Path;


6 import org.apache.hadoop.io.IntWritable;


7 import org.apache.hadoop.io.Text;


8 import org.apache.hadoop.mapreduce.Job;


9 import org.apache.hadoop.mapreduce.Mapper;


10 import org.apache.hadoop.mapreduce.Reducer;


11 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;


12 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


13 import org.apache.hadoop.util.GenericOptionsParser;


14 import org.apache.hadoop.yarn.util.SystemClock;


15 import org.apache.hadoop.yarn.webapp.ResponseInfo;


16


17 import java.io.IOException;


18 import java.util.StringTokenizer;


19


20


21 /**


22 * Created by rihaizhang on 2016/9/21.


23 */


24 public class MrDebug {


25


26 /**


27 * mapper


28 */


29 public static class TokenizerMapper extends Mapper {


30


31 private final static IntWritable one = new IntWritable(1);


32 private Text word = new Text();


33


34 @Override


35 public void map(Object key, Text value, Context context) throws IOException, InterruptedException {


36


37 StringTokenizer stk = new StringTokenizer(value.toString());


38


39 while (stk.hasMoreTokens()) {


40 word.set(stk.nextToken());


41 context.write(word, one);


42 }


43 }


44


45 }


46


47 /**


48 * reducer


49 */


50 public static class IntSumReducer extends Reducer {


51


52 private final static IntWritable sum = new IntWritable(1);


53


54 @Override


55 public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {


56


57 int temp = 0;


58 for (IntWritable val : values) {


59 temp += val.get();


60 }


61 sum.set(temp);


62 context.write(key, sum);


63 }


64 }


65


66 private static void deleteOutput(Configuration conf, String path) throws IOException {


67 try( FileSystem fs = FileSystem.get(conf)) {


68 Path outPath = new Path(path);


69 if (fs.exists(outPath)) {


70 boolean delResult = fs.delete(outPath, true);


71 if (delResult) {


72 System.out.println(path + " deleted.");


73 } else {


74 System.out.println(path + " delete failed.");


75 }


76 }


77 }


78


79 }


80


81 public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {


82


83 System.out.println("begin");


84 Configuration conf = new Configuration();


85


86 String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();


87


88 if (otherArgs.length < 2) {


89 System.err.println("Usage: wordcount [...] ");


90 System.exit(2);


91 }


92


93 deleteOutput(conf,otherArgs[otherArgs.length - 1]);


94


95 Job job = Job.getInstance(conf, "mrdebug");


96 job.setJarByClass(MrDebug.class);


97 job.setMapperClass(TokenizerMapper.class);


98 job.setCombinerClass(IntSumReducer.class);


99 job.setReducerClass(IntSumReducer.class);


100 job.setOutputKeyClass(Text.class);


101 job.setOutputValueClass(IntWritable.class);


102


103 for (int i = 0; i < otherArgs.length - 1; i++) {


104 FileInputFormat.addInputPath(job, new Path(otherArgs[i]));


105 }


106 FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));


107


108 System.exit(job.waitForCompletion(true) 0 : 1);


109


110 }


111


112 }


在resources 加上Log4j的配置,不然会有警告。



 


log4j.rootLogger=INFO, stdout


log4j.appender.stdout=org.apache.log4j.ConsoleAppender


log4j.appender.stdout.layout=org.apache.log4j.PatternLayout


log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE


调试前还得PATH环境变量追加;%HADOOP_HOME%\bin,因为要用到上面工具包的两个文件。注意:Ide 需要重启



 


设置运行参数为本地目录:



 


然后运行:



 


View Code



 


3,本机MapReduce,远程Hdfs目录做数据源


访问的是hdfs的数据,但MapReduce在本机,相当于单机版的MR,这样我信可以直接在Ide 上debug。


代码增加如下配置:


conf.set("fs.default.name", "hdfs://master:9000");


设置运行参数为Hdfs目录:



 


运行结果:



 


4,本地提交MapReduce 到远程hadoop 服务器


真正的MapReduce 是一个分布式任务,提交到hadoop集群上,在本地Ide是无法debug的。


代码增加如下配置:


conf.set("fs.default.name", "hdfs://master:9000");


conf.set("mapreduce.framework.name", "yarn");


conf.set("yarn.resourcemanager.hostname", "master");


conf.set("mapreduce.app-submission.cross-platform","true");


conf.set("mapreduce.job.jar", "D:\\IdeaProjects\\hadoop-demo\\job\\target\\demo-job-1.0-SNAPSHOT.jar");


代码还需要指定最终的编译的Jar包地址



 


运行结果:


查看Job 管理页面 https://192.168.56.101:8088/



 


可以看到这个Job是直接提交到远程服务器运行的。


总结:弄清楚了上面的各种配置场景之后,我们还可以通过在resource目录增加Hadoop配置文件的方式,来灵活控制我们的调试。



 


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved