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

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

 

1 环境准备

     linux 系统版本centos7 ,Hadoop版本2.7.6

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

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

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

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

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

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

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

           

   运行成功代表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的路径下 ,设置本机环境变量如下

     

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

      %HADOOP_HOME%\bin

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

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

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

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

  

  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>

  程序目录如下:

 

 

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

     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中是不需要安装插件的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值