hadoop背景知识

hadoop由2部分组成,分别是HDFS和MAPREDUCE。HDFS负责分布式文件的管理,MAPREDUCE负责分布式文件数据的处理和计算。
  1. HDFS

    HDFS集群由1个NameNode、一定数量的DataNode和SecondaryNameNode组成。

    HDFS架构:

hadoop背景知识_第1张图片

NameNode是整个文件系统的管理节点,它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表,接收用户的操作请求;
NameNode上包括以下文件:
fsimage:元数据镜像文件,存储某一时段NameNode内存元数据信息即保存了最新的元数据checkpoint
edits:操作日志文件
fstime:保存最近一次checkpoint的时间
Hadoop在重启时就是通过`fsimage+edits`来状态恢复,fsimage相当于一个checkpoint,首先将最新的checkpoint的元数据信息从fsimage中加载到内存,然后逐一执行edits修改日志文件中的操作以恢复到重启之前的最终状态。但是在edits操作日志很多的情况下,会出现NameNode恢复非常缓慢,SecondaryNameNode就是为了解决这1问题,其将fsimage,edits进行合并生成新的fsimage,NameNode重启以后恢复元数据会更快。


DataNode负责提供真实文件数据的存储服务,一般一个主机对应于1个DataNode节点。HDFS默认Block大小是64MB(1.0版本),128(2.0版本),如果一个文件小于一个数据块的大小,HDFS并不占用整个数据块存储空间。1份数据会存储在3个节点上进行备份,保证高可用性。

SecondaryNameNode负责从NameNode上下载元数据信息(fsimage,edits),并对齐合并称为新的fsimage,在本地保存,并推送到NameNode,同时重置NameNode上的edits。



Hadoop相关配置文件解析:
etc/hadoop/core-site.xml
fs.defaultFS  hdfs文件访问地址
etc/hadoop/hdfs-site.xml(配置NameNode和DataNode)
dfs.namenode.name.dir 在本地文件系统所在的NameNode的存储空间和持续化处理日志
dfs.datanode.data.dir 逗号分隔的一个DataNode上,它应该保存它的块的本地文件系统的路径列表
etc/hadoop/yarn-site.xml(配置ResourceManager 和 NodeManager)
yarn.resourcemanager.address 客户端对ResourceManager主机通过 host:port 提交作业
yarn.resourcemanager.scheduler.address ApplicationMasters 通过ResourceManager主机访问host:port跟踪调度程序获资源
yarn.nodemanager.resource.memory-mb givenNodeManager即资源的可用物理内存,以MB为单位
etc/hadoop/mapred-site.xml(配置mapreduce)
mapreduce.task.io.sort.factor 在文件排序中更多的流合并为一次

Web UI访问地址:
NameNode http://nn_hostport/默认端口号50070
ResourceManager http://rm_hostport/默认端口号8088
hadoop的启动:
start-all.sh     --->start-dfs.sh + start-yarn.sh
start-dfs.sh   ---->hadoop-daemon.sh start namenode  + hadoop-daemons.sh start datanode
start-yarn.sh ----->yarn-daemon.sh start  resourcemanager + yarn-daemons.sh start nodemanager
参考资料:[hadoop原理](https://www.cnblogs.com/yinghun/p/6230436.html)
  1. MapReduce
    mapreduce可以分为2个步骤,map、shuffle和reduce。
    映射(Mapping) :对集合里的每个目标应用同一个操作。默认使用换行符对每一行的输入数据执行map方法,并输出,形式为
    shuffle:对map的输出进行排序和分类,形式为,,,
    化简(Reducing):遍历集合中的元素来返回一个综合的结果。将每一个key的list进行规约相加统计,输出形式为,,

    map和reduce方法的计算模型:

hadoop背景知识_第2张图片

mapreduce运行的整个流程:

hadoop背景知识_第3张图片

完整的mapreduce示例代码如下:
mapper:

`public class WordCountMapper extends Mapper {
protected void map(LongWritable key, Text value, Mapper.Context context) throws IOException, InterruptedException {
    String line = value.toString();
    String[] words = line.split(" ");
    for (String word : words) {
    context.write(new Text(word), new IntWritable(1));
    }
}
}`

reducer:

`public class WordCountReducer extends Reducer {
    protected void reduce(Text key, Iterable values, Reducer.Context content) throws IOException, InterruptedException {
    Integer count = 0;
    for (IntWritable value : values) {
    count += value.get();
    }
    content.write(key, new IntWritable(count));
    }
}`

job:

`public class WordCountMapReduce {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = Job._getInstance_(conf, "wordcount");
job.setJarByClass(WordCountMapReduce.class);
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat._setInputPaths_(job, new Path("hdfs://192.168.18.128:9000/testa"));
FileOutputFormat._setOutputPath_(job, new Path("hdfs://192.168.18.128:9000/testb"));
boolean b =  job.waitForCompletion(true);
if(!b) {
System.err.println("This task is failes");
}
}
}`

参考资料:MapReduce资料

你可能感兴趣的:(大数据,hadoop)