思考小问题
统计一个100G大小的文件进行词频的解决方法
方法一:如果小文件可以编写一个小程序,进行遍历,统计词频。
方法二:编写一个多线程程序,实现并发,比上一个方法更加有效,但是要防止多个线程重复提交(同步互斥问题)。
方法三:程序交给多台服务器去完成,痛点:需要大量人工参与。
方法四:通过MapReduce框架自动化完成
特点:易于编程(有两个接口ma--大任务分成小任务,任务分解,reduce---任务汇总),良好的扩展,高容错性,适合离线处理
是一个编程框架:只需要程序员去设计map,reduce函数
MapReduce语义:相同的key为一组,调用一次reduce方法,在方法内迭代这一组数据的计算
输入(key,val)数据集----》map映射成一个中间结果(k,v)---》reduce(k,v).
先map处理结果作为reduce的输入(线性关系),map的输入的是大数据集的分片split(split窗口机制,大小可以调整,默认split大小近似block大小),默认框架以行为单位,可以实现分布式并行运算。
map的数量取决于split的数量 。
reduce的数量取决于程序员的设计partition
map的数量一般比reduce多。
框架内部实现机制(分区,排序,写入磁盘)
map生成
partition的个数决定reduce的个数,reduce连接网络到各个map中拉取分区。
Input---->Splitting--->Mapping--->Shuffling--->Reducing--->final result
Mapping:生成键值对
shuffing (洗牌):分组、排序、拉取数据
版本区别:
Hadoop 1.x 提现计算向数据移动(移动计算)问题:压力过大,单点故障
两个核心角色(核心进程):jobtrack(资源分配和调度两个任务),tasktrack
Hadoop 2.x :yarn提供资源管理和调度(RM,NM),用两个进程来分解任务
在启动Hadoop的基础上启动yarn,可以看到激活了RM和NM两个进程
如果环境不稳定丢失了某个进程可以单独启动
运行统计词频的jar包(wordcount),处理文件123.txt,输出结果放入output1
http://192.168.228.100:8088/
网页上查看进程运行
查看Wordcount运行详情
查看运行结果
搭建开发环境
window开发程序,Linux运行
配置eclipse(Hadoop环境),创建java项目(以实训项目材料为例)
前提准备好材料(1.解压材料包,2.下载插件复制到eclipse的插件包中)
将bin覆盖hadoop-2.7.5中的bin
找到hadoop-2.7.5/bin/hadoop.dll 文件复制到system32下
配置hadoop环境变量
打开eclipse进行配置,window--preference--java--user Library添加lib库
创建一个java项目后,右击选buildpath添加上hadoop的库
从虚拟机的hadoop文件中复制config文件到宿主机,并复制到创建的java项目中
后面MyWc项目中目前讲到的代码(项目还没讲完,所以文件有带错)
MyWc.java代码(注意import正确的hadoop库函数)
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class MyWc {
public static void main(String[] args) throws IOException {
//读取配置文件
Configuration conf = new Configuration(true);
//创建一个作业job
Job job = Job.getInstance(conf);
//设置作业的处理类
job.setJarByClass(MyWc.class);
// Specify various job-specific parameters
job.setJobName("myjob");
//路径
Path path=new Path(args[0]);//主函数main传参
//输入路径和输出路径
FileInputFormat.addInputPath(job, path);//ctrl+1 创建本地路径
Path output=new Path(args[1]);
//判断是否存在
FileSystem fs=output.getFileSystem(conf);
if(fs.exists(output)) {
fs.delete(output, true);
}
FileOutputFormat.setOutputPath(job, output);
// job.setInputPath(new Path("in"));
// job.setOutputPath(new Path("out"));
//设置作业处理的mapper和reduce
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
// Submit the job, then poll for progress until the job is complete
job.waitForCompletion(true);
}
}
注意:上面代码中的job类,按ctrl同时点击,进入job.class,点击attach scource链接上源码,源码就是之前解压文件中的源代码包
//快捷键
//ctrl+shift+t---->open type
//ctrl+1---->创建变量
持续更新.......