欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount

程序员文章站 2022-07-14 14:04:35
...

Windows使用Eclipse或IDEA连接Linux环境Hadoop运行wordcount

 

1 环境准备

     linux 系统版本centos7 ,Hadoop版本2.7.6

     (1)正确安装hadoop,具体安装步骤参考安装教程,安装成功启动HDFS和Yarn,进入hadoop安装路径/sbin 下,运行start-all.sh

使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount

使用jps命令(可能需要在root下使用)查看启动的java进程 其中ResourceManger和Nodemanager(Yarn进程),DataNode,NameNode NodeManager secondarynameNode是必须的进程

使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount

 (2)在命令行中测试当前Hadoop是否安装成功,使用如下命令

            >>hdfs dfs -mkdir  test         --创建一个文件夹test

            >>hdfs dfs  -ls   /                  --查看test文件夹是否成功   

 (3)在centos7 下运行hadoop的wordcout例子测试hadoop是否能够运行成功

        进入 hadoop安装目录 /share/hadoop/mapreduce/下运行

           使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount

   运行成功代表hadoop环境安装没有问题

   此过程常出现的问题是卡主不动,这是由于Yarn的内存配置错误造成的引用网上的解决方法,进入hadoop安装目录/etc/hadoop下打开yarn-site.xml 加入如下内容:

  1. <property>  
  2.     <name>yarn.nodemanager.resource.memory-mb</name>  
  3.     <value>6048</value>    
  4. </property>  
  5. <property>  
  6.    <name>yarn.scheduler.minimum-allocation-mb</name>  
  7.    <value>2048</value>  
  8. </property>  
  9. <property>  
  10.     <name>yarn.nodemanager.vmem-pmem-ratio</name>  
  11.     <value>2.1</value>  
  12. </property>  

   其中yarn.nodemanager.resource.memory-mb Yarn可以使用的最大内存可以设置的尽量大一些(不要超过总内存),此值太小会造成mapreduce程序一直卡主

  (4)将和centos下相同版本的hadoop2.7.6 解压到windows的路径下 ,设置本机环境变量如下

     使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount

      path环境变量添加hadoop\bin目录

      %HADOOP_HOME%\bin

(5)上面的步骤全部成功后继续进行,

        下载windows下连接hadoop需要的文件地址如下:地址中的文件支持hadoop2.6.* 和2.7.* 其他版本未知

         https://download.csdn.net/download/wxtcstt/10576906

        解压目录中有两个版本,选择正确的版本将文件解压后放置到windows 的hadoop的bin目录下 只放这两个文件即可

  使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount

  2 WordCount mapreduce编程代码

    

package hadooptest;


import java.io.IOException;
import java.io.PrintStream;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class WordCount
{
  public static class TokenizerMapper
    extends Mapper<Object, Text, Text, IntWritable>
  {
    private static final IntWritable one = new IntWritable(1);
    private Text word = new Text();
    
    public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
      throws IOException, InterruptedException
    {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens())
      {
        this.word.set(itr.nextToken());
        context.write(this.word, one);
      }
    }
  }
  
  public static class IntSumReducer
    extends Reducer<Text, IntWritable, Text, IntWritable>
  {
    private IntWritable result = new IntWritable();
    
    public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context)
      throws IOException, InterruptedException
    {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      this.result.set(sum);
      context.write(key, this.result);
    }
  }
  
  public static void main(String[] args) throws Exception
  {
	  System.setProperty("hadoop.home.dir", "F:\\cdh5.13.0INstall\\hadoop-2.7.6\\hadoop-2.7.6");
	  args=new String[]{"hdfs://10.16.5.188:9000/test/shakespear.txt","hdfs://10.16.5.188:9000/test/output10"};

    Configuration conf = new Configuration(); //會自動讀取程序目录的配置文件
    System.out.println(conf.get("fs.defaultFS"));
    //nf.set("mapred.job.tracker","10.16.5.188:9001");  不用单独设置
    // conf.set("fs.default.name","hdfs://10.16.5.189:9000");
    
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if (otherArgs.length < 2)
    {
      System.err.println("Usage: wordcount <in> [<in>...] <out>");
      System.exit(2);
    }
    Job job = Job.getInstance(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    for (int i = 0; i < otherArgs.length - 1; i++) {
      FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
    }
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[(otherArgs.length - 1)]));
    
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

   


  代码 中的此处重点做一个解释:   Configuration conf = new Configuration();  这一句会默认加载程序目录的下的

     core-site.xml   hdfs-site.xml 等文件   ,所以如果设置了core-site.xml   hdfs-site.xml 等配置文件是不需要使用 下面的代码           (A)的,如果没有工程目录下没有添加设置这些.xml文件

     可以使用下面的代码(A)做设置
  (A): //conf.set("fs.default.name","hdfs://10.16.5.189:9000");
     

  我在程序目录的resources下放置了core-xml 内容如下,我只设置了hadoop的地址

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property>
                <name>fs.defaultFS</name>
                <value>hdfs://10.16.5.188:9000</value>
    </property>
 </configuration>

  程序目录如下:

 使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount

 

     代码中为了保险仍然使用了下面一句 其实删除它也是可以的 因为我们设置了 环境变量

     System.setProperty("hadoop.home.dir", "F:\\cdh5.13.0INstall\\hadoop-2.7.6\\hadoop-2.7.6");   

    在工程中记得载入连接hadoop需要的类 基本的

  4 常遇到的问题 

       (1)org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0(Ljava/lang/String;I)V

               遇到这个问题的方法是将上面下载的文件中的hadoop.dll 放到系统的windows/system32下 解决此问题

          (2) org.apache.hadoop.security.AccessControlException:

              Permissiondenied: user=asus, access=WRITE,inode="/user/root/output":root:supergroup:drwxr-xr-x

            解决方法是在centos服务器的hadoop安装目录/etc/hadoop下的hdfs-site.xml添加

<property> 
     <name>dfs.permissions</name> 
     <value>false</value> 
</property>

设置没有权限认证,自己的测试环境可以这样设置

 对于正式的hadoop集群,使用权限认证方法(引用https://blog.csdn.net/qq_24520639/article/details/53726393

                   1.修改当前windows操作系统的用户名为centos系统中的用户名

                   2. 通过 haddop fs -chmod 777 ...  修改hadoop下文件的权限为任何人可读可写

                   3.显示设定环境变量:

                     System.setProperty("HADOOP_USER_NAME", "root");  //设置环境变量

                     或者在本机的环境变量设置 HADOOP_USER_NAME

                     当然还可以通过run configuration 的方式进行指定jvm环境功能变量‘-DHADOOP_USER_NAME=root’

  5 总结

         1 windwos 下连接hadoop 需要使用文档中下载的文件

         2 在eclipse中是不需要安装插件的。

相关标签: hadoop wordcount