小机灵鬼|42 张图带你揭秘后端技术都要学啥?( 十 )


小机灵鬼|42 张图带你揭秘后端技术都要学啥?安全防御
小机灵鬼|42 张图带你揭秘后端技术都要学啥?大数据其实在上面提到的分布式中就有涉及大数据相关知识 。 无外乎是数据量越来越大 , 我们如何尽可能使用较低的成本存储更多的数据 , 给公司企业带来更好的利润 。 上面说过分布式缓存 , 负载均衡等技术 , 其共同特点是如何抵抗高并发的压力 , 而这里的大数据技术主要谈论的是如何满足大规模的计算 。
通过对数据的分析 , 进而发掘海量数据中的价值 , 这里的数据包含数据库数据 , 日志信息 , 用户行为数据等等 。 那么这么多不同类型的数据 , 怎么去存储呢?
分布式文件存储 HDFS 架构
如何将数以万计的服务器组成统一的文件存储系统?其中使用Namenode服务器作为控制块 , 负责元数据的管理(记录文件名 , 访问权限 , 数据存储地址等) , 而真正的文件存储在DataNode中 。
Mapreduce
大量的数据存储下来的目的是通过相应的算法进行数据分析 , 获得通过深度学习/机器学习进行预测 , 从而获取有效的价值 , 这么大的文件 , 我们不可能将HDFS当做普通的文件 , 从文件中读取数据然后计算 , 这样子不知道算到何时何地 。
大数据处理经典的处理框架即MapReduce , 分为Map和Reduce两个阶段 , 其中一个Map过程是将每个服务器上启动Map进程 , 计算后输出一个
下面以WordCount统计所有数据中相同的词频数据为例 , 详细看看Map和Reduce的过程 。
小机灵鬼|42 张图带你揭秘后端技术都要学啥?wordcoun计算过程
在这个例子中 , 通过对value中的1组成的列表 , reduce对这些1进行求和操作从而得到每个单词的词频 。 代码实现如下:
public class WordCount {
// Mapper四个参数:第一个Object表示输入key的类型;第二个Text表示输入value的类型;第三个Text表示表示输出键的类型;第四个IntWritable表示输出值的类型 。 map这里的输出是指输出到reduce
public static class doMapper extends Mapper {
public static final IntWritable one = new IntWritable(1);//这里的IntWritable相当于Int类型
public static Text word = new Text;//Text相当于String类型
// map参数 , 将处理后的数据写入context并传给reduce
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
//StringTokenizer是Java工具包中的一个类 , 用于将字符串进行拆分
StringTokenizer tokenizer = new StringTokenizer(value.toString, " ");
//返回当前位置到下一个分隔符之间的字符串
word.set(tokenizer.nextToken);
//将word存到容器中 , 记一个数
context.write(word, one);
}
}
//参数同Map一样 , 依次表示是输入键类型 , 输入值类型 , 输出键类型 , 输出值类型 。 这里的输入是来源于map,所以类型要与map的输出类型对应。
public static class doReducer extends Reducer {
private IntWritable result = new IntWritable;
@Override
protected void reduce(Text key, Iterable values, Context context)
throws IOException, InterruptedException {


推荐阅读