Hadoop MR编程
Hadoop开发job需要定一个Map/Reduce/Job(启动MR job,并传入参数信息),以下代码示例实现的功能:
1)将一个用逗号分割的文件,替换为“|”分割的文件;
2)对小文件合并,将文件合并为reduceNum个文件。
DataMap.java
package com.dx.fpd_load; import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class DataMap extends Mapper<LongWritable, Text, Text, Text> {
private final Text key = new Text(); @Override
protected void map(LongWritable longWritable, Text value, Context context) throws IOException, InterruptedException {
// 如果数据为空,则不进行处理,跳出map输入
if (value.getLength() == 0) {
return;
} String newValue = value.toString().replace(",", "|") + "|NULL|NULL";
String[] newValues = newValue.split("\\|"); // 输入的文件路径
String filePath = context.getInputSplit().toString().toUpperCase(); // 如果路径包含了fpd_bak才进行处理否则不处理
if (filePath.contains("fpd_bak".toUpperCase()) && newValues.length > 10) {
key.set(newValues[6]); //objid context.write(key, new Text(newValue));
}
}
}
DataReducer.java
package com.dx.fpd_load; import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs; import java.io.IOException; public class DataReducer extends Reducer<Text, Text, NullWritable, Text> {
public MultipleOutputs multipleOutputs;
public final Text key = new Text(); @Override
protected void setup(Context context) throws IOException, InterruptedException {
multipleOutputs = new MultipleOutputs(context);
} @Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
for (Text text : values) {
String data = text.toString(); String[] p_days = context.getConfiguration().getStrings("p_day");
String[] p_cities = context.getConfiguration().getStrings("p_city"); String p_day = "p_day";
if (p_days != null) {
p_day = p_days[0];
}
String p_city = "p_city";
if (p_cities != null) {
p_city = p_cities[0];
} multipleOutputs.write("fpdload", NullWritable.get(), new Text(data), "/thetenet/my_hive_db/fpd_new/p_day=" + p_day + "/p_city=" + p_city + "/fpd_data");
}
} @Override
protected void cleanup(Context context) throws IOException, InterruptedException {
multipleOutputs.close();
}
}
DataJob.java
package com.dx.fpd_load; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser; public class FingerLib_Load_DataJob {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
String p_city = otherArgs[0];
String p_day = otherArgs[1];
String reducerNum = otherArgs[2];
String inputPath = otherArgs[3];
String outputPath = otherArgs[4]; if (p_day == null) {
throw new Exception("p_day is null");
}
conf.set("p_day", p_day);
if (p_city == null) {
throw new Exception("p_city is null");
}
conf.set("p_city", p_city); Job job = Job.getInstance(conf);
job.setJobName("LoadDataIntoFPD_p_city" + p_city + "_p_day_" + p_day);
job.setJarByClass(DataJob.class);
job.setMapperClass(DataMap.class);
job.setReducerClass(DataReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);
job.setNumReduceTasks(Integer.parseInt(reducerNum)); MultipleOutputs.addNamedOutput(job, "fpdload", TextOutputFormat.class, NullWritable.class, Text.class); FileInputFormat.addInputPath(job, new Path(inputPath));
FileOutputFormat.setOutputPath(job, new Path(outputPath)); System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
调用脚本:
#!/usr/bin/env bash
source /app/mylinux/login.sh
#./submit_fpdload.sh
DAY=$
CITY=$
REDUCER_NUMBER=$ JAR="/app/mylinux/service/dx-1.0-SNAPSHOT.jar" MAIN_CLASS="com.dx.fpd_load.DataJob"
INPUT_PATH="/thetenet/my_hive_db/fpd_bak/p_day=$DAY/p_city=$CITY/"
OUT_DIR="/thetenet/my_hive_db/fpd_load_out/" hadoop fs -rm -r /thetenet/my_hive_db/fpd_new/p_day=$DAY/p_city=$CITY/
hadoop fs -rm -r $OUT_DIR time yarn jar $JAR $MAIN_CLASS $CITY $DAY $REDUCER_NUMBER $INPUT_PATH $OUT_DIR #beeline -e "
#alter table my_hive_db.fpd_new add if not exists partition(p_day=$DAY,p_city=$CITY)
#location '/thetenet/my_hive_db/fpd_new/p_day=$DAY/p_city=$CITY/';" echo "Complete..."
Hadoop MR编程的更多相关文章
- Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)
不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...
- hadoop streaming 编程
概况 Hadoop Streaming 是一个工具, 代替编写Java的实现类,而利用可执行程序来完成map-reduce过程.一个最简单的程序 $HADOOP_HOME/bin/hadoop jar ...
- 【Hadoop】Hadoop MR 如何实现倒排索引算法?
1.概念.方案 2.代码示例 InverseIndexOne package com.ares.hadoop.mr.inverseindex; import java.io.IOException; ...
- 【Hadoop】Hadoop MR 自定义分组 Partition机制
1.概念 2.Hadoop默认分组机制--所有的Key分到一个组,一个Reduce任务处理 3.代码示例 FlowBean package com.ares.hadoop.mr.flowgroup; ...
- 【Hadoop】Hadoop MR 自定义排序
1.概念 2.代码示例 FlowSort package com.ares.hadoop.mr.flowsort; import java.io.IOException; import org.apa ...
- 【Hadoop】Hadoop MR异常处理
1.代码示例 package com.ares.hadoop.mr.flowsort; import java.io.IOException; import org.apache.hadoop.con ...
- 【Hadoop】Hadoop MR 自定义序列化类
1.基本概念 2.Mapper代码 package com.ares.hadoop.mr.flowsum; import java.io.IOException; import org.apache. ...
- 【Hadoop】Hadoop mr wordcount基础
1.基本概念 2.Mapper package com.ares.hadoop.mr.wordcount; import java.io.IOException; import java.util.S ...
- 《Hadoop高级编程》之为Hadoop实现构建企业级安全解决方案
本章内容提要 ● 理解企业级应用的安全顾虑 ● 理解Hadoop尚未为企业级应用提供的安全机制 ● 考察用于构建企业级安全解决方案的方法 第10章讨论了Hadoop安全性以及Hado ...
随机推荐
- 使用padding来合理布局自己的容器类
这两天一直忙着前端UI的事,前端布局这块下了很多工夫,很多第三方布局框架如Bootstrap和layUI等虽然很好使用,但是前端你懂的,实际用起来总得缝缝补补,烦啊. 今天就遇到了一个要让div容器内 ...
- java编程基础知识及常见例题
⒈标识符: 只能包含数字.字母.下划线.$,并且不能以数字开头.语义直观规范 驼峰法则: 如:方法名.变量名采用驼峰法则 帕斯卡命名法: 如: 类.接口.枚举采用帕斯卡命名法包名:网址倒写,com.网 ...
- 数据库MySQL、redis主从切换shell脚本
具体源码可找我领取
- Algorithm --> 判读是否是子树
问题 判断一棵树是否是另一棵树的子树,如图 思路 问题分两步: 找值相同的根结点(遍历解决) 判断两结点是否包含(递归:值.左孩子.右孩子分别相同) 树节点定义 struct TreeNode { i ...
- 动态规划(Dynamic programming) 走楼梯
来自:算法爱好者 有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶,要求用程序来求出一共有多少种走法? f(10) = f(9) + f(8) f(9) = f(8) + f ...
- nginx session 配置失效解决
nginx 反向代理后台web服务器session path导致的session 失效,特此总结下配置方法: 配置如下: location ^~ /2016tyjf_dev/djwechat { pr ...
- JavaScript(第十四天)【面向对象和原型】
学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建 ...
- C语言博客作业--函数
一.PTA实验作业 题目1 (6-7) (1).本题PTA提交列表 (2)设计思路 设计第一个函数判断是否完数int factorsum( int number ) 定义sum.i:sum初始化归0, ...
- 【Alpha版本】冲刺阶段 - Day1 - 启航
Alpha 阶段成员分工及任务量 成员 分工 任务量(小时) 袁逸灏 完成app用户车辆,子弹发射,背景移动,暂停界面,音乐界面,音乐查找,音乐播放 25 刘伟康 项目进度把控.分配任务.组织会议.整 ...
- 敏捷冲刺每日报告--day1
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...