WordCount开发及运行

开发MR程序需要引入新的包,还是通过maven管理依赖

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
        <version>2.7.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.7.4</version>
    </dependency>
</dependencies>

参照:http://hadoop.apache.org/docs/r2.7.4/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

import java.io.IOException;
import java.util.StringTokenizer;

/**
 * Created by chingy on 2017/9/29.
 */
public class MyWordCount {
    //Mapper class
    static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
        private final static IntWritable ONE = new IntWritable(1);
        private Text word = new Text();

@Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//            super.map(key, value, context);//参考源码最基本的处理
            StringTokenizer itr = new StringTokenizer(value.toString());//默认根据空白符/t/n/r/f进行分割
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());//取出每个单词作为map输出的key
                context.write(word, ONE);//通过上下文输出map的key-value,value以1为计数
            }
        }
    }

//Reducer class
    static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();

@Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
//            super.reduce(key, values, context);//参考源码最基本的处理
            int sum = 0;//用于累加
            for (IntWritable value : values) {//循环同key的value组,进行处理
                sum += value.get();//累加
            }
            result.set(sum);//累加结果作为reduce输出的value
            context.write(key, result);
        }
    }

//Driver
    public static void run(String[] args) throws Exception {
        Configuration conf = new Configuration();//获取运行环境下的配置信息
        conf.set("mapred.jar","D:/IDEAWorks/hadoopAPI/target/hadoopAPI-1.0-SNAPSHOT.jar");
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if (otherArgs.length != 2) {
            System.err.println("Usage: MyWordCount <in> <out>");
            System.exit(2);
        }
        //创建Jog,设置配置及Job名称
//        Job job = new Job(configuration, "wc");//新版废弃的方法
        Job job = Job.getInstance(conf, "WC");
        //1·设置Job运行的类
        job.setJarByClass(MyWordCount.class);
        //2·设置Mapper及Reducer
        job.setMapperClass(MyMapper.class);
        job.setReducerClass(MyReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        //3·设置输入、输出文件路径
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        //4·提交Job,等待运行结果,并在客户端显示运行信息
        boolean isSuccess = job.waitForCompletion(true);
        //结束程序,并返回执行结果
        System.exit(isSuccess ? 0 : 1);
    }

public static void main(String[] args) throws Exception {
        args = new String[] { "file:///D:/data/taotaomm.txt", "hdfs://n1/remoteUser/mmResult" };
        run(args);//这里手动连接的NN,不知道应该怎么解决--undo
    }
}

解决错误:Operation category WRITE is not supported in state standby

ü 如果连接standby的NN进行操作的话,是只读的。如果是在集群上提交则会自动尝试主备NN,这里手动提交的,则需要手动指定(或者将集群的配置拷贝出来试试)

ü 顺便说下,默认端口是8020,如果配置的时候不指定端口,则访问的时候,也可以不指定端口,而统一用默认的即可。可以仅仅使用主机名访问

windows本地运行MR数据读写HDFS

1. windows本地要有hadoop运行库(注意,windows的Hadoop编译需要Windows SDK 7.1 or Visual Studio 2010以上版本)

a) (这个是2.7.4版本的,其他版本可以选择maven源码windows编译):http://pan.baidu.com/s/1jHVuaxg

b) 在本地FS创建文件授权的时候除了问题(ExitCodeException exitCode=-1073741515: ),需要安装VC++2010sp1

2. hdfs中创建专门供windows访问目录,并授权(目录属主为windows当前用户即可)

hdfs dfs -mkdir /remoteUser

hdfs dfs -chown chingy:supergroup /remoteUser

hdfs dfs -ls /

远程创建目录,测试授权是否成功:

@Before
public void init() throws Exception {
    //配置文件
    Configuration conf = new Configuration();
    //最小化配置
    conf.set("fs.default.name", "hdfs://n1");
    //获取文件系统
    hdfs = FileSystem.get(conf);
}

@Test
public void mkdir() throws Exception {
    Path path = new Path("/remoteUser/chingy");
    if (hdfs.mkdirs(path))
        System.out.println("create dir success!");
}

3. 在本地项目中导入NativeIO类源码(重写如下部分代码,注释部分即是,大概500多行之后,搜索方法签名应该找得到)

public static boolean access(String path, AccessRight desiredAccess)
    throws IOException {
return true;
//return access0(path, desiredAccess.accessRight());
}

由于日志关闭了,没有看到执行过程,需要调整日志级别,才能在本地控制台中打印任务运行日志

日志配置:(修改为INFO即可打印job日志,一般使用WARN即可)

log4j.rootLogger=WARN,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n

1 远程提交yarn运行MR

上述是本地执行,访问HDFS只是为了数据的读写(可以仅启动hdfs),如果需要远程执行,还需要启动并提交YARN上

1) 项目要打成jar包,并通过conf设置本地jar包路径,以便传输远程执行

2) 需要导入远程的核心配置文件(按照提交job的重要性排序):mapred-site.xml、yarn-site.xml、hdfs-site.xml

mapred-site.xml

<configuration>
    <property>
        <!-- 提交任务的方式:yarn -->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <!-- 开启跨平台,环境变量会得到自动处理,官方文档:将linux中的$PATH、windows中的%PATH%,统一设置为{{PATH}} -->
        <name>mapreduce.app-submission.cross-platform</name>
        <value>true</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <!-- 指出提交任务的RM服务器主机名,其它地址都是该地址的间接引用,网上都是配置的yarn.resourcemanager.address -->
        <name>yarn.resourcemanager.hostname</name>
        <value>n1</value>
    </property>
</configuration>

hdfs-site.xml

<configuration>
    <property>
        <!-- 避免操作的文件备份数被重置为默认的3 -->
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

然后需要注意的是: 1 ·数据不能读取本地的了,即使是远程主机的本地文件系统, 2 ·手动配置fs.defaultFS(避免忘记改回)

hadoop2.7.4在windows系统IDEA远程测试相关推荐

  1. linux远程打开windows程序,为新手讲解Linux和Windows系统的远程桌面访问知识

    很多新手都是使用Linux和Windows双系统的,它们之间的远程桌面访问是如何连接的,我们就为新手讲解Linux和Windows系统的远程桌面访问知识,包括所使用的软件及方法.本文所使用的Linux ...

  2. windows系统 修改远程桌面端口号

    windows 系统更改 远程桌面端口号 第一步:win+r 调出运行窗口 第二步:在运行输入框里输入"regedit",然后点击确定. 第三步:打开注册表编辑器后按顺序依次打开 ...

  3. 微软多个 Windows 系统存在远程代码执行漏洞(ICMP协议)(MPS-2023-1376)

    漏洞描述 Internet Control Message Protocol (ICMP) 协议是TCP/IP协议簇的一个子协议,用于在IP主机.路由器之间传递控制消息.raw socket 是一种网 ...

  4. Windows系统的远程桌面端口修改的方法

    Windows系统的远程桌面端口默认是用的是3389端口,但是由于系统安全的考虑,经常我们安装好系统后一般都会把原来的3389端口更改为另外的端口. 将原来的远程桌面服务3389端口改为6678端口为 ...

  5. 【搬运记录】Windows系统局域网远程Linux系统

    原作者地址:https://baijiahao.baidu.com/s?id=1642550036775110946 Windows系统控制Ubuntu的电脑,除了webmin,VNC等方式外,还可以 ...

  6. Windows系统CMD命令测试

    新手如何驾驭系统命令行 相信很多刚接触到操作系统的人会用到命令行,不管是linux还是Windows,接触底层代码是一个合格的程序员的标配,本文将主要介绍Windows 系统中的大量命令从而更好地理解 ...

  7. linux怎么远程windows桌面,Windows系统怎么远程登陆桌面Linux?

    1.我们先在windows主机上下载TigerVNC软件包.TigerVNC是一款开源免费的VNC连接软件,我们可以通过它对带桌面的linux主机进行远程.这里,我们从SourceForge网站下载T ...

  8. windows系统无法远程桌面提示CredSSP 身份验证协议和远程桌面客户端

    引言 微软在2018 年 3 月 13 日初始版本更新了所有受影响平台的 CredSSP 身份验证协议和远程桌面客户端.2018年5月8日将默认设置从"易受攻击"更改为" ...

  9. 【Windows系统】-- 远程桌面时,WIN键被锁定

    问题重现: 在对远程机器进行操作的时候,按键时会自动变成WIN组合键,比如:你按D的效果为[WIN+D]组合键的效果 就是切换到桌面,按E就是[WIN+E]组合键的效果,就是打开资源管理器. 解决方案 ...

最新文章

  1. Android控件之ImageView探究
  2. ArrayList、linklist、list的区别
  3. python代码大全表解释-python实现顺序表的简单代码
  4. Python实现Newton和lagrange插值
  5. VTK:Filtering之ConnectivityFilter
  6. [Golang] GOROOT、GOPATH和Project目录说明
  7. AjaxPro无刷新选择列表框/下拉框[方便|稳定]
  8. 百度论文引用网络节点分类比赛
  9. TCP文件上传Java_Java 理解TCP通信案例:文件上传案例
  10. 获取ACCESS_TOKEN接口
  11. 3.第一本 docker 书 --- docker 网络
  12. python代码生成_python代码生成 python代码自动生成器
  13. oracle logon 乱码,鼎信诺审计软件2013-2014年度常见问题解答
  14. 基于中移物联网MQTT协议的ESP8266远程开机实例
  15. Linux下忘记root密码重置过程笔记
  16. 测试用例设计——微信发朋友圈(详细)
  17. 男同胞要一定要看——酒桌上用来劝酒的话
  18. Java设计模式学习2:行为模式
  19. JS的map方法和Map对象
  20. 吴思里:阿里淘系前端面试经历

热门文章

  1. 腾讯云如何判断服务器是否中毒以及如何预防中毒解决方法
  2. 头条面试居然跟我扯了半小时的Semaphore
  3. Win10企业版激活
  4. python抓取微信文件_python 如何爬取微信公众号里的图片?
  5. 微信群助手机器人如何使用?哪家群助手好用?
  6. Number of Pairs(思维)
  7. SSH公钥原理(密钥,秘钥,私钥)(看了还是懵逼啊!)
  8. 金山办公:订阅为王?
  9. PHP实现24节气的计算方法
  10. 【Python】基于MQTT的聊天客户端