文章插图
安全防御

文章插图
大数据
其实在上面提到的分布式中就有涉及大数据相关知识 。无外乎是数据量越来越大,我们如何尽可能使用较低的成本存储更多的数据,给公司企业带来更好的利润 。上面说过分布式缓存,负载均衡等技术,其共同特点是如何抵抗高并发的压力,而这里的大数据技术主要谈论的是如何满足大规模的计算 。通过对数据的分析,进而发掘海量数据中的价值,这里的数据包含数据库数据,日志信息,用户行为数据等等 。那么这么多不同类型的数据,怎么去存储呢?
分布式文件存储 HDFS 架构
如何将数以万计的服务器组成统一的文件存储系统?其中使用Namenode服务器作为控制块,负责元数据的管理(记录文件名,访问权限,数据存储地址等),而真正的文件存储在DataNode中 。Mapreduce
大量的数据存储下来的目的是通过相应的算法进行数据分析,获得通过深度学习/机器学习进行预测,从而获取有效的价值,这么大的文件,我们不可能将HDFS当做普通的文件,从文件中读取数据然后计算,这样子不知道算到何时何地 。大数据处理经典的处理框架即MapReduce,分为Map和Reduce两个阶段,其中一个Map过程是将每个服务器上启动Map进程,计算后输出一个
下面以wordCount统计所有数据中相同的词频数据为例,详细看看Map和Reduce的过程 。

文章插图
wordcoun计算过程
在这个例子中,通过对value中的1组成的列表,reduce对这些1进行求和操作从而得到每个单词的词频 。代码实现如下:
public class WordCount {
// MApper四个参数:第一个Object表示输入key的类型;第二个Text表示输入value的类型;第三个Text表示表示输出键的类型;第四个IntWritable表示输出值的类型 。map这里的输出是指输出到reduce
public static class doMapper extends Mapper<Object, Text, Text, IntWritable> {
public static final IntWritable one = new IntWritable(1);//这里的IntWritable相当于Int类型
public static Text word = new Text;//Text相当于String类型
// map参数<keyIn key,valueIn value,Context context>,将处理后的数据写入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<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable;
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
//for循环遍历,将得到的values值累加
for (IntWritable value : values) {
sum += value.get;
}
result.set(sum);
context.write(key, result);//将结果保存到context中,最终输出形式为"key" + "result"
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
System.out.println("start");
Job job = Job.getInstance;
job.setJobName("wordCount");
Path in = new Path("hdfs://***:9000/user/hadoop/input/buyer_favorite1.txt");//设置这个作业输入数据的路径(***部分为自己liunx系统的localhost或者ip地址)
Path out = new Path("hdfs://***:9000/user/hadoop/output/wordCount"); //设置这个作业输出结果的路径
FileInputFormat.addInputPath(job, in);
FileOutputFormat.setOutputPath(job, out);
job.setJarByClass(WordCount.class);// 设置运行/处理该作业的类
job.setMapperClass(doMapper.class);//设置实现了Map步的类
job.setReducerClass(doReducer.class);//设置实现了Reduce步的类
job.setOutputKeyClass(Text.class);//设置输出结果key的类型
job.setOutputValueClass(IntWritable.class);//设置输出结果value的类型
////执行作业
推荐阅读
- 同步与异步Python有何不同?
- 8种ETL调度算法归纳总结,看完这些你就全明白了
- InnoDB的行锁,原来为你做了这么多
- 教你怎样饮茶最健康,饮茶要健康
- 黑茶与普洱迷你配,普洱熟茶与黑茶的区别
- 教你制作银杏叶保健茶,养生保健茶
- 运势|神回复:什么职业可以避免社交啊?最好是什么人都不麻烦你。
- 从qq头像看性格 你的性格如何
- 咳嗽总不好?或许你需要这五个良方
- 几点喝姜茶你知道吗,你知道吗
