hadoop 学习笔记,
基于hadoop的贝叶斯文本分类器实现过程
贝叶斯基础理论(这个东西的项目概览)
对这个工程总体的流程可以参考这个文献里面的做法即可
参考文献1
远程原件目录
/user/coderlau/input
hadoop文件系统命令行主要是hdfs
对于初学者而言,在这个地方主要是注意两个地方即可,一个是Linux 环境下本身的文件路径,和HDFS系统远程文件系统,这是两个不同的东西
hadoop 执行源码情况
hadoop jar 源码打包成的jar 文件情况(关于这部分设计到如何去打包一个Java项目, 然后上传到服务器进行运行(这里的服务器是指Linux系统概念情况))
编程实践
主要是理解两个过程,一个map和reduce ,关于这个可以查看官方的文档资料等情况
官方文档
根据自己写的代码情况 自己定义参数情况
自定义参数情况
主要是主程序中的入口问题
程序编写
在这里要注意的地方是 InWritable 对象可以在后面进行创建,也可以在前面进行创建
程序代码案例
Hadoop 中最基本的词语统计功能
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable> {
//最后的输出结果形式
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
//map 方法数据的处理来源 的value参数, text 可以转换为 value 的基本关系
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
// 设置出来的值情况
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
代码编写过程中的核心概念设计
主程序中job
Configuration
Configuration configuration = new Configuration();
Job job = Job.getInstance(conf, “WordCount”);
job.setJarByClass(WordCount.class);
job.setMapperClass(WordCount.TokenizerMapper.class); // 如果调用两种情况 mapper类型
job.setReducerClass(WordCount.IntSumReduce.class); // 如果调用两种情况 reduce类
job.setOutputKeyClass(Text.class);
context() 方式
代码过程中的数据源
value , key ,分别代表的是什么数据源情况
hadoop 如何与bayes分类器结合起来使用这种情况
hadoop 结合贝叶斯简单分类器设置
如何计算概率,如何还是使用map 和reduce的功能进行计算概率, 先验概率和条件概率如何进行计算
先验概率情况
类条件概率P(tk|c)=(类c下单词tk在各个文档中出现的次数之和+1)/(类c的单词总数+训练样本中不重复特征词总数)
先验概率P©=类c下的单词总数/整个训练样本的单词总数
要统计的东西
条件概率
p(某个单词 | CHINA)=
p (某个单词| CANA) =
p
………
先验概率
P(CHINA)
P(CANA)
如何预测
关于这个贝叶斯分类器的设计的基础查看这部分文本
贝叶斯分类器
为训练集正负样本中出现每个单词都要计算
p(单词 1| CHINA) = 单词一(在China文本类中出现的总次数)/ (CHINA 样本中总的单词数) ,包括重复样本的数目情况
如果一个单词在CHINA中出现,而在CANA中没有出现过的话,则直实现加1操作吧, 把他出现的次数直接设置为
……………
P(单词n| CANA)
预测文本分别在
预测P(CHINA| 单词一,单词二,单词三,) == P(单词1|China) ****P(单词n| CANA) * p(CHINA)/ P(单词一) * 单词(二)………….
P(CANA| 单词一,单词二,单词三,)== P(单词1| CANA)
最终的概率计算方式情况(预测公式)
p(CHINA|单词一,单词二,,) = P(CHINA) * P(单词一| CHINA ) * P(单词二| CHINA)
P(CANA|单词一,单词二,,) = P(CANA) * P(单词一|CANA ) * P (单词二| CANA)
比较上述两个特征的值
P(CHINA|单词一,单词二,) > P(CANA|单词一,单词二,,) 比较两者大小情况
一个main方法
一个main 方法一个job 东西,
如何在hadoop 上面选择运行某一个job 作业,如何将这个项目进行打包即可在,这种情况下
如果解决多个作业任务的输出输入问题
如何将输出的文件进行合并情况
Hadoop fs -getmerge /JULY/output 本地文件名字情况
其中out后面生成的东西文件名字不要再指明这种情况 part-afds
实验文件路径
甘露学长在做的过程所使用的命令行
打包 hadoop archive -archinveName china.har -p /train/CHINA /data(dest 存放目录不需要先创建的,会自动进行创建的情况)
在运行环境过程中对运务进行截图
利用hadoop 自带的打包工具进行,
主要是hdfs 文件归档操作
单词统计功能
考虑文件大小有没有超过block size 工作区文件
存放数据的目录情况
hdfs dfs -mkdir -p /user/coderlau/input/train
这个目录下面是存放数据的情况
统计单词数目
统计单词数目 数目情况
Hadoop jar train_wordsum.jar /data/china.har /result1 统计词频命令行问题
统计文档数量情况
在所有的文件我们统一写cana 或china
hadoop jar train_prior.jar /input /out class 有三个参数,第一个是输入路径,第二个是输出路径,
统计词频的命令行工具情况
涉及到计算条件概率的问题, 所有要指明是哪一个类别还有单词总数是多少的情况
命令行工具总结如下面的情况可以得到的情况编写如下该种情况
uage : hadoop jar 源码文件 srcpath outpath class total
Total 总某个类别情况下面的数目情况
针对上面这种情况进行整合
"usage: hadoop jar package.ar srcpath outputpath china_word_total cana_word_total"
第三个参数是类别情况 cana 还是china 的情况要区分开来的基本情况
如何使用这个命令行
// 提示如何使用这个代码 ,运行输入相应的参数,
// hadoop 命令行, .jar 是Java打包后的可执行文件, srcpath 是输入mapreduce 模型的原件路径, outpath 是结果输出路径, class 是文档类别
用户输入
用户输入的参数可以进行conf.set
在主函数中可以
configuration.set(“type”, args[2]);
在文档统计中输入代表 用户输入情况
type1 采用 CHINA 代替
type0 采用 CANA 代替
最后如何编译写成的代码情况
https://blog.csdn.net/lifeifei2010/article/details/69396332
问题解决
如何解决编译的问题在这种情况下面
javac DouceNumberCount.java -cp $(/Users/coderlau/hadoop/hadoop-2.9.2/bin/hadoop classpath)
使用上述命令行解决中编译不成功的问题即可