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远程测试相关推荐
- linux远程打开windows程序,为新手讲解Linux和Windows系统的远程桌面访问知识
很多新手都是使用Linux和Windows双系统的,它们之间的远程桌面访问是如何连接的,我们就为新手讲解Linux和Windows系统的远程桌面访问知识,包括所使用的软件及方法.本文所使用的Linux ...
- windows系统 修改远程桌面端口号
windows 系统更改 远程桌面端口号 第一步:win+r 调出运行窗口 第二步:在运行输入框里输入"regedit",然后点击确定. 第三步:打开注册表编辑器后按顺序依次打开 ...
- 微软多个 Windows 系统存在远程代码执行漏洞(ICMP协议)(MPS-2023-1376)
漏洞描述 Internet Control Message Protocol (ICMP) 协议是TCP/IP协议簇的一个子协议,用于在IP主机.路由器之间传递控制消息.raw socket 是一种网 ...
- Windows系统的远程桌面端口修改的方法
Windows系统的远程桌面端口默认是用的是3389端口,但是由于系统安全的考虑,经常我们安装好系统后一般都会把原来的3389端口更改为另外的端口. 将原来的远程桌面服务3389端口改为6678端口为 ...
- 【搬运记录】Windows系统局域网远程Linux系统
原作者地址:https://baijiahao.baidu.com/s?id=1642550036775110946 Windows系统控制Ubuntu的电脑,除了webmin,VNC等方式外,还可以 ...
- Windows系统CMD命令测试
新手如何驾驭系统命令行 相信很多刚接触到操作系统的人会用到命令行,不管是linux还是Windows,接触底层代码是一个合格的程序员的标配,本文将主要介绍Windows 系统中的大量命令从而更好地理解 ...
- linux怎么远程windows桌面,Windows系统怎么远程登陆桌面Linux?
1.我们先在windows主机上下载TigerVNC软件包.TigerVNC是一款开源免费的VNC连接软件,我们可以通过它对带桌面的linux主机进行远程.这里,我们从SourceForge网站下载T ...
- windows系统无法远程桌面提示CredSSP 身份验证协议和远程桌面客户端
引言 微软在2018 年 3 月 13 日初始版本更新了所有受影响平台的 CredSSP 身份验证协议和远程桌面客户端.2018年5月8日将默认设置从"易受攻击"更改为" ...
- 【Windows系统】-- 远程桌面时,WIN键被锁定
问题重现: 在对远程机器进行操作的时候,按键时会自动变成WIN组合键,比如:你按D的效果为[WIN+D]组合键的效果 就是切换到桌面,按E就是[WIN+E]组合键的效果,就是打开资源管理器. 解决方案 ...
最新文章
- Android控件之ImageView探究
- ArrayList、linklist、list的区别
- python代码大全表解释-python实现顺序表的简单代码
- Python实现Newton和lagrange插值
- VTK:Filtering之ConnectivityFilter
- [Golang] GOROOT、GOPATH和Project目录说明
- AjaxPro无刷新选择列表框/下拉框[方便|稳定]
- 百度论文引用网络节点分类比赛
- TCP文件上传Java_Java 理解TCP通信案例:文件上传案例
- 获取ACCESS_TOKEN接口
- 3.第一本 docker 书 --- docker 网络
- python代码生成_python代码生成 python代码自动生成器
- oracle logon 乱码,鼎信诺审计软件2013-2014年度常见问题解答
- 基于中移物联网MQTT协议的ESP8266远程开机实例
- Linux下忘记root密码重置过程笔记
- 测试用例设计——微信发朋友圈(详细)
- 男同胞要一定要看——酒桌上用来劝酒的话
- Java设计模式学习2:行为模式
- JS的map方法和Map对象
- 吴思里:阿里淘系前端面试经历
热门文章
- 腾讯云如何判断服务器是否中毒以及如何预防中毒解决方法
- 头条面试居然跟我扯了半小时的Semaphore
- Win10企业版激活
- python抓取微信文件_python 如何爬取微信公众号里的图片?
- 微信群助手机器人如何使用?哪家群助手好用?
- Number of Pairs(思维)
- SSH公钥原理(密钥,秘钥,私钥)(看了还是懵逼啊!)
- 金山办公:订阅为王?
- PHP实现24节气的计算方法
- 【Python】基于MQTT的聊天客户端