使用Hadoop的MapReduce与HDFS处理数据
hadoop是一个分布式的基础架构,利用分布式实现高效的计算与储存,最核心的设计在于HDFS与MapReduce,HDFS提供了大量数据的存储,mapReduce提供了大量数据计算的实现,通过Java项目实现hadoop job处理海量数据解决复杂的需求。
一、基本环境及相关软件的配置
具体配置说明:基本环境配置及权限申请
二、hadoop项目开发流程
hadoop基本的开发为job的初始化与分布式处理流程的开发。
1、任务基本配置
首相依据业务需求,须要在代码中配置job在每台机器上须要的java虚拟机使用的内存与运行过程须要的最大内存。
Configuration configuration =new Configuration();configuration.set("mapreduce.map.java.opts","-Xmx2048m");configuration.set("mapreduce.map.memory.mb","3072");configuration.set("mapreduce.reduce.java.opts","-Xmx2048m");configuration.set("mapreduce.reduce.memory.mb","3072");Job job = newJob(configuration, "miuilite-dailyRetain-"+arg[4]); |
2、执行參数配置
job.setJarByClass(MiuiliteRetainJob.class);MultipleOutputs.addNamedOutput(job, MIUIDanfaGeneralMapReduce.MULTI_OUTPUT_NAME_STATUS, SequenceFileOutputFormat.class,Text.class,class);job.setOutputFormatClass(SequenceFileOutputFormat.class);MultipleInputs.addInputPath(job,new Path(arg[0]), SequenceFileInputFormat.class, MiuiliteRetainMapReduce.NewLogMapper.class);MultipleInputs .addInputPath(job,new Path(arg[1]), SequenceFileInputFormat.class, MiuiliteRetainMapReduce.StatusLogMapper.class);FileOutputFormat.setOutputPath(job,new Path(arg[2]));job.setReducerClass(MiuiliteRetainMapReduce.RetainReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);job.setNumReduceTasks(40);//配置节点数量 |
hadoop任务处理过程中,各个分布式机器读取操作数据都是通过分布式储存文件系统hdfs,而且分布式计算将中间结果或者终于结果都是保存到hdfs上的,所以在job开发过程中须要的配置有:
1)相关的地址:数据hdfs地址,中间状态缓存保存HDFS地址,以及生成的结果hdfs保存地址,(如须要本地进一步处理结果,还须要本地地址,须要将hdfs的结果地址拉取到本 地进行处理),本地server地址:
MultipleInputs.addInputPath(job, new Path(arg[0]), SequenceFileInputFormat.class, MiuiliteRetainMapReduce.NewLogMapper.class);
注意:对于要写入数据的地址要具有写的权限,具体权限配置请看基本配置介绍。
2)各种数据格式:
一种是文件的读取格式,能够使用基于行的日志文件,也能够使用二进制格式,多行输入记录或其它的格式,Hadoop有自带的几种格式:
|
输入格式
|
解释
|
key
|
value
|
|---|---|---|---|
| TextInputFormat | 默认格式,依照行读取 | 行的字节偏移量 | 行的内容 |
| KeyValueInputFormat | 解析每一行的数据 | 第一个Tab前的字符 | 剩下的内容 |
| SequenceFileInputFormat | 具有高性能的二进制格式 | 自己定义 | 自己定义 |
所以在读取输入文件格式中,须要选择自己合适的格式来初始化 MultipleInputs.addInputPath(job, new Path(arg[0]),
SequenceFileInputFormat.class, MiuiliteRetainMapReduce.NewLogMapper.class);
对于自己定义的SequenceFileInputFormat,它会读取特殊的特定于Hadoop的二进制文件,会让Hadoop的mapper高速读取数据。Sequence文件是块压缩的,并提供了对几种数据类型(不不过文本类型)直接的序列化与反序列化操作。
其次文件读取key 与value的格式,以及输出到文件的格式:BooleanWritable:标准布尔型数值,ByteWritable:单字节数值,DoubleWritable:双字节数,FloatWritable:浮点数,IntWritable:整型数,LongWritable:长整型数,Text:使用UTF8格式存储的文本,NullWritable:当<key,value>中的key或value为空时使用,须要在初始化job的过程中初始化相应输入输出的格式。
3)配置数据处理类,一般分为两个阶段,
第一步叫做mapping,会对数据作为mapper函数的输入数据,每条数据相应一个,mapper会吧每次map处理后的结果能够依据同样的key单独传到一个输出数据元素里面。样例: MultipleInputs.addInputPath(job, new Path(arg[0]), SequenceFileInputFormat.class,
MiuiliteRetainMapReduce.NewLogMapper.class);。
注意:能够同一时候使用多个数据输入处理的mapper,但输出key与value格式必须保持一致。
第二步叫做reducer,会接收mapping的输出作为输入列表的迭代器,会将同一key的值聚合在一起,并做一定的处理而返回处理结果。样例:job.setReducerClass(MiuiliteRetainMapReduce.RetainReducer.class);
3、数据处理流程
在全部配置好了之后调用job.waitForCompletion(true);提交任务运行任务并等待结束。
Mapper阶段:
public class NewLogMapperextends Mapper<Object, BytesWritable, Text, Text> { @Override publicvoid map(Object key, BytesWritable value, Context context) { //..........省略中间处理原始数据过程,比方解密,生成OutPutKey等 context.write(newText(OutPutKey), newText(OutPutValue); }} |
Redecer阶段:
public class RetainReducerextends Reducer<Text, Text, Text, Text> { @Override publicvoid setup(Context context)throws IOException, InterruptedException { super.setup(context); //数据初始化过程,初始化相关的计数工具 } @Override publicvoid reduce(Text key, Iterable<Text> values, Context context) { //相应同一个key进行相关的统计处理阶段,并将数据计入到相关的计数工具中。 } @Override protectedvoid cleanup(Reducer.Context context)throws IOException, InterruptedException { stringCounter.output(context); super.cleanup(context); //运行完成的兴许阶段,将没台分布式计算的机器的结果输入到hdfs上,清理context, } |
reducer完毕后须要统一将处理结果写入到HDFS中,所以在统计工具中应带有最后的输出函数:
public output(Reducer.Context context, intlongTailBar) throwsIOException, InterruptedException { for(Iterator<String> iterator = stringCountMap.keySet().iterator(); iterator.hasNext();) { String key = iterator.next(); longvalue = stringCountMap.get(key); if(value < longTailBar) continue; key = key.replace('\r',' '); key = key.replace('\n',' '); context.write(newText(key), new } } |
4、处理结果本地
hadoop处理后的结果都是保存在hdfs上的,能够将相应的结果作为行的任务的输入进一步精确处理,假设须要进一步本地处理,通过调用本地shell命令将结果拷贝到本地:
private copyToLocal(String hdfsPath, String localPath)throws IOException, InterruptedException { String[] cmd = {"/bin/sh","-c", "hadoop fs -cat "+ hdfsPath + "/part* > "+ localPath}; String tmpDic = loalPath.substring(0,localPath.lastIndexOf("/")); if(!newFile(tmpDic).exists()){ newFile(tmpDic).mkdirs(); } if(!newFile(localPath).exists()){ newFile(localPath).createNewFile(); } Process pid = Runtime.getRuntime().exec(cmd); if(pid != null) { pid.waitFor(); } } |
三、执行流程
执行shell命令配置
hadoop项目执行方式通过shell文件执行指定的jar包,并指定相应的入口函数,根据项目的需求传入不同的參数。
hadoop jar miuiapp-logs.jar com.xiaomi.miui.logs.danfa.MiuiMihomeGeneralJob XXX-param-1 XXX-param-2 XXX-param-3
注意:假设通过crontab -e定时指定相关的命令执行,须要在执行的shell文件里加入 jdk,hadoop的地址到环境变量中。
注意:在配置pom过程中须要将jar包打成大包,将全部依赖的jar包都应该打进去,所以在pom中应该增加下列配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId></plugin><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.3</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions></plugin> |
使用Hadoop的MapReduce与HDFS处理数据的更多相关文章
- MapReduce将HDFS文本数据导入HBase中
HBase本身提供了很多种数据导入的方式,通常有两种常用方式: 使用HBase提供的TableOutputFormat,原理是通过一个Mapreduce作业将数据导入HBase 另一种方式就是使用HB ...
- Hadoop(三)HDFS写数据的基本流程
HDFS写数据的流程 HDFS shell上传文件a.txt,300M 对文件分块,默认每块128M. shell向NameNode发送上传文件请求 NameNode检测文件系统目录树,看能否上传 N ...
- Hadoop 系列文章(二) Hadoop配置部署启动HDFS及本地模式运行MapReduce
接着上一篇文章,继续我们 hadoop 的入门案例. 1. 修改 core-site.xml 文件 [bamboo@hadoop-senior hadoop-2.5.0]$ vim etc/hadoo ...
- Hadoop优化 第一篇 : HDFS/MapReduce
比较惭愧,博客很久(半年)没更新了.最近也自己搭了个博客,wordpress玩的还不是很熟,感兴趣的朋友可以多多交流哈!地址是:http://www.leocook.org/ 另外,我建了个QQ群:3 ...
- Hadoop基础-MapReduce的数据倾斜解决方案
Hadoop基础-MapReduce的数据倾斜解决方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据倾斜简介 1>.什么是数据倾斜 答:大量数据涌入到某一节点,导致 ...
- 用mapreduce读取hdfs数据到hbase上
hdfs数据到hbase过程 将HDFS上的文件中的数据导入到hbase中 实现上面的需求也有两种办法,一种是自定义mr,一种是使用hbase提供好的import工具 hbase先创建好表 cre ...
- 使用MapReduce将HDFS数据导入Mysql
使用MapReduce将Mysql数据导入HDFS代码链接 将HDFS数据导入Mysql,代码示例 package com.zhen.mysqlToHDFS; import java.io.DataI ...
- 使用MapReduce将HDFS数据导入到HBase(二)
package com.bank.service; import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.conf. ...
- Hadoop源码分析之客户端向HDFS写数据
转自:http://www.tuicool.com/articles/neUrmu 在上一篇博文中分析了客户端从HDFS读取数据的过程,下面来看看客户端是怎么样向HDFS写数据的,下面的代码将本地文件 ...
随机推荐
- 编译Android源代码与内核总结
这些天花了些时间自己下载了android源代码来编译,当中走了一些弯路导致耗了些时间,如今又一次梳理总结下,让有同样想法的人自己编译的时候能少走些弯路,官方指导文档在http://source.and ...
- Android含文档server结束(client UI接口异步请求的一部分)三
在本文中,AsyncTask为了实现异步请求,详细代码如下所示的: public class downloadActivity extends Activity { private TextView ...
- Nginx+Varnish
Nginx+Varnish 实现动静分离,为服务器分流,降低服务器负载 相必大家在看加快网站响应速度方面的文章时,都提过这么一条:动静分离.那怎样实现动静分离呢,这里笔者就亲自搭建相关服务实现动静分离 ...
- Android采取async框架文件上传
页面效果 须要的权限 <uses-permission android:name="android.permission.INTERNET"/> 网络訪问权限; 布局文 ...
- Hive ERROR: Out of memory due to hash maps used in map-side aggregation
什么时候hive在运行大数据量的统计查询语句时.常常会出现以下OOM错误.详细错误提演示样例如以下: Possible error: Out of memory due to hash maps us ...
- JAVA Socket超时浅析(转)
套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”.针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”.JAVA有两个基于数据流 ...
- dev layoutControl 控件使用
对于排版控件,用微软的方法都是先拉 label再拉一个 Textbox , 虽然微软的控件了有类似于 EXCEL的单元格全并功能,但用起来使终不方便, 今天研究了一下 DEV 的这个控件,比微软的 ...
- Linux下一个Nginx安装步骤
一个.下载pcre 官网下载:http://www.pcre.org/ # wget http://sourceforge.net/projects/pcre/files/pcre/8.35/pcre ...
- Win7设置局域网共享
Win7设置局域网共享 1. 把win7的guest用户开启. 打开win7的控制面板=>用户账号与安全=>用户账户=>管理其他用户=>点击guest用户,进行开启. 2.解决 ...
- 【Android基础】listview控件的使用(1)------最简单的listview的使用
listview控件是项目开发中最常用的空间之一,我将慢慢推出关于listview的一系列的文章,先从最简单的,系统自带的listview开始吧! 先上效果图: activity_one.xml &l ...