设为首页 收藏本站
查看: 1199|回复: 0

[经验分享] 2018-07-07期 Hadoop本地运行模式配置

[复制链接]

尚未签到

发表于 2018-10-28 12:23:34 | 显示全部楼层 |阅读模式
  详细来源:05-Hadoop本地运行模式配置
  在Windows开发环境中实现Hadoop的本地运行模式,详细步骤如下:
  1、在本地安装好jdk、hadoop2.4.1,并配置好环境变量:JAVA_HOME、HADOOP_HOME、Path路径(配置好环境变量后最好重启电脑)
  2、用hadoop-common-2.2.0-bin-master的bin目录替换本地hadoop2.4.1的bin目录,因为hadoop2.0版本中没有hadoop.dll和winutils.exe这两个文件。
  如果缺少hadoop.dll和winutils.exe话,程序将会抛出下面异常:
  java.io.IOException: Could not locate executable D:\hadoop-2.4.1\bin\winutils.exe in the Hadoop binaries.
  java.lang.Exception: java.lang.NullPointerException
  所以用hadoop-common-2.2.0-bin-master的bin目录替换本地hadoop2.4.1的bin目录是必要的一个步骤。
  注意:如果只是将hadoop-common-2.2.0-bin-master的bin目录中的hadoop.dll和winutils.exe这两个文件添加到hadoop2.4.1的bin目录中,也是可行的,但最好用用hadoop-common-2.2.0-bin-master的bin目录替换本地hadoop2.4.1的bin目录。
  上面这两个步骤完成之后我们就可以跑程序了,从而实现Hadoop的本地运行模式:
  首先输入输出路径都选择windows的文件系统:
  代码如下:
  代码如下:
  package MapReduce;
  import java.io.IOException;
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  import org.apache.hadoop.io.LongWritable;
  import org.apache.hadoop.io.Text;
  import org.apache.hadoop.mapreduce.Job;
  import org.apache.hadoop.mapreduce.Mapper;
  import org.apache.hadoop.mapreduce.Reducer;
  import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;

  public>  {
  public static String path1 = "file:///C:\\word.txt";//读取本地windows文件系统中的数据
  public static String path2 = "file:///D:\\dir";
  public static void main(String[] args) throws Exception
  {
  Configuration conf = new Configuration();
  FileSystem fileSystem = FileSystem.get(conf);
  if(fileSystem.exists(new Path(path2)))
  {
  fileSystem.delete(new Path(path2), true);
  }
  Job job = Job.getInstance(conf);
  job.setJarByClass(WordCount.class);
  FileInputFormat.setInputPaths(job, new Path(path1));
  job.setInputFormatClass(TextInputFormat.class);
  job.setMapperClass(MyMapper.class);
  job.setMapOutputKeyClass(Text.class);
  job.setMapOutputValueClass(LongWritable.class);
  job.setNumReduceTasks(1);
  job.setPartitionerClass(HashPartitioner.class);
  job.setReducerClass(MyReducer.class);
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(LongWritable.class);
  job.setOutputFormatClass(TextOutputFormat.class);
  FileOutputFormat.setOutputPath(job, new Path(path2));
  job.waitForCompletion(true);
  }
  public  static  class MyMapper extends Mapper
  {
  protected void map(LongWritable k1, Text v1,Context context)throws IOException, InterruptedException
  {
  String[] splited = v1.toString().split("\t");
  for (String string : splited)
  {
  context.write(new Text(string),new LongWritable(1L));
  }
  }
  }

  public  static>  {
  protected void reduce(Text k2, Iterable v2s,Context context)throws IOException, InterruptedException
  {
  long sum = 0L;
  for (LongWritable v2 : v2s)
  {
  sum += v2.get();
  }
  context.write(k2,new LongWritable(sum));
  }
  }
  }
  在dos下查看运行中的java进程:
  其中28568为windows中启动的eclipse进程。
  接下来我们查看运行结果:

  part-r-00000中的内容如下:
  hello   2me  1you 1
  接下来输入路径选择windows本地,输出路径换成HDFS文件系统,代码如下:
  package MapReduce;
  import java.io.IOException;
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  import org.apache.hadoop.io.LongWritable;
  import org.apache.hadoop.io.Text;
  import org.apache.hadoop.mapreduce.Job;
  import org.apache.hadoop.mapreduce.Mapper;
  import org.apache.hadoop.mapreduce.Reducer;
  import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;

  public>  {
  public static String path1 = "file:///C:\\word.txt";//读取windows文件系统中的数据
  public static String path2 = "hdfs://hadoop20:9000/dir";//输出到hdfs中
  public static void main(String[] args) throws Exception
  {
  Configuration conf = new Configuration();
  FileSystem fileSystem = FileSystem.get(conf);
  if(fileSystem.exists(new Path(path2)))
  {
  fileSystem.delete(new Path(path2), true);
  }
  Job job = Job.getInstance(conf);
  job.setJarByClass(WordCount.class);
  FileInputFormat.setInputPaths(job, new Path(path1));
  job.setInputFormatClass(TextInputFormat.class);
  job.setMapperClass(MyMapper.class);
  job.setMapOutputKeyClass(Text.class);
  job.setMapOutputValueClass(LongWritable.class);
  job.setNumReduceTasks(1);
  job.setPartitionerClass(HashPartitioner.class);
  job.setReducerClass(MyReducer.class);
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(LongWritable.class);
  job.setOutputFormatClass(TextOutputFormat.class);
  FileOutputFormat.setOutputPath(job, new Path(path2));
  job.waitForCompletion(true);
  }
  public  static  class MyMapper extends Mapper
  {
  protected void map(LongWritable k1, Text v1,Context context)throws IOException, InterruptedException
  {
  String[] splited = v1.toString().split("\t");
  for (String string : splited)
  {
  context.write(new Text(string),new LongWritable(1L));
  }
  }
  }

  public  static>  {
  protected void reduce(Text k2, Iterable v2s,Context context)throws IOException, InterruptedException
  {
  long sum = 0L;
  for (LongWritable v2 : v2s)
  {
  sum += v2.get();
  }
  context.write(k2,new LongWritable(sum));
  }
  }
  }
  程序抛出异常:

  处理措施同上:
  Configuration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://hadoop20:9000/");FileSystem fileSystem = FileSystem.get(conf);//获取HDFS中的FileSystem实例
  查看运行结果:
  [root@hadoop20 dir4]# hadoop fs -cat /dir/part-r-00000hello   2me      1you     1
  好的,到这里hadoop的本地文件系统就讲述完了,注意一下几点:
  1、file:\\ 代表本地文件系统,hdfs:// 代表hdfs分布式文件系统
  2、linux下的hadoop本地运行模式很简单,但是windows下的hadoop本地运行模式需要配置相应文件。
  3、MapReduce所用的文件放在哪里是没有关系的(可以放在Windows本地文件系统、可以放在Linux本地文件系统、也可以放在HDFS分布式文件系统中),最后是通过FileSystem这个实例来获取文件的。
  如有问题,欢迎留言指正!
  注意:如果用户用的是Hadoop1.0版本,并且是Windows环境下实现本地运行模式,则只需设置HADOOP_HOME与PATH路径,其余不用任何设置!
  --Exception: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
  错误
  Windows的唯一方法用于检查当前进程的请求,在给定的路径的访问权限,所以我们先给以能进行访问,我们自己先修改源代码,return true 时允许访问。我们下载对应hadoop源代码,hadoop-2.7.3-src.tar.gz解压,hadoop-2.7.3-src\hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\io\nativeio下NativeIO.java 复制到对应的Eclipse的project
  即:把红色源码进行修改

  修改为返回true

  问题解决
  处理方式:
  第一步:下载hadoo2.7.3的hadoop.dll和winutils.exe.zip赋值覆盖hadoop本地bin下,同时拷贝到C:\Windows\System32下(覆盖)
  第二步:项目下新建包名org.apache.hadoop.io.nativeio新建类NativeIO,接下来再次在Windows下运行eclipse中的Hadoop程序,Ok


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627494-1-1.html 上篇帖子: Linux 大数据(hadoop) 下篇帖子: 生产环境下hadoop HA集群及Hbase HA集群配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表