博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MapReduce入门(三)倒排索引
阅读量:5297 次
发布时间:2019-06-14

本文共 9098 字,大约阅读时间需要 30 分钟。

什么是倒排索引?

           倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。

我感觉搜索引擎的原理就是倒排索引,或者正排索引。那么就让我们解密吧!

一、创建ReverseApp类:用于实现实现倒排索引

 

package com.day02;import com.google.common.io.Resources;import com.utils.CDUPUtils;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.fs.Path;import org.apache.hadoop.mapreduce.Reducer;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.input.FileSplit;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.IOException;import java.util.Iterator;/** * 用MapReduce实现倒排索引 */public class ReverseApp {    public static class ReverseMapper extends Mapper
{ //map方法每次执行一行数据,会被循环调用map方法(有多少行就调用多少次) @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //获取key所在的文件名 Path path = ((FileSplit) context.getInputSplit()).getPath(); String fileName = path.toString(); String[] strings = value.toString().split(" "); for (int i = 0; i < strings.length; i++) { context.write(new Text(strings[i]),new Text(fileName)); } } } public static class ReverseReducer extends Reducer
{ //每次处理一个key,会被循环调用,有多少个key就会调用几次 //获取map处理的数据 hello 集合(用于存储key相同的value--1) @Override protected void reduce(Text key, Iterable
values, Context context) throws IOException, InterruptedException { Iterator
iterator = values.iterator(); StringBuffer buffer = new StringBuffer(); while (iterator.hasNext()) { Text fileName = iterator.next(); StringBuffer append = buffer.append(fileName.toString()).append("--"); } context.write(key,new Text(String.valueOf(buffer))); } } public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Configuration coreSiteConf = new Configuration(); coreSiteConf.addResource(Resources.getResource("core-site-master2.xml")); //设置一个任务,后面是job的名称 Job job = Job.getInstance(coreSiteConf, "Reverse"); //将打的jar包自动上传临时目录,运行之后就删除了--自己看不到 job.setJar("mrdemo/target/mrdemo-1.0-SNAPSHOT.jar"); //设置Map和Reduce处理类 job.setMapperClass(ReverseMapper.class); job.setReducerClass(ReverseReducer.class); //设置map输出类型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(Text.class); //设置job/reduce输出类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); //设置任务的输入路径 FileInputFormat.addInputPath(job, new Path("/wc")); //设置任务的输出路径--保存结果(这个目录必须是不存在的目录) //删除存在的文件 CDUPUtils.deleteFileName("/reout"); FileOutputFormat.setOutputPath(job, new Path("/reout")); //运行任务 true:表示打印详情 boolean flag = job.waitForCompletion(true); if (flag){ System.out.println("使用mapreduce来倒排索引操作的结果..."); CDUPUtils.readContent("/reout/part-r-00000"); }else { System.out.println(flag+",文件加载失败"); } }}

 

二、里面用到自己写的工具类CDUPUtils :用于删除已存在目录以及阅读文件内容

package com.utils;

 
import com.google.common.io.Resources;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
 
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
 
public class CDUPUtils {
    //删除已经存在在hdfs上面的文件文件
    public static void deleteFileName(String path) throws IOException {
        //将要删除的文件
        Path fileName = new Path(path);
        Configuration entries = new Configuration();
        //解析core-site-master2.xml文件
        entries.addResource(Resources.getResource("core-site-local.xml"));
        //coreSiteConf.set(,);--在这里可以添加配置文件
        FileSystem fileSystem = FileSystem.get(entries);
        if (fileSystem.exists(fileName)){
            System.out.println(fileName+"已经存在,正在删除它...");
            boolean flag = fileSystem.delete(fileName, true);
            if (flag){
                System.out.println(fileName+"删除成功");
            }else {
                System.out.println(fileName+"删除失败!");
                return;
            }
        }
        //关闭资源
        fileSystem.close();
    }
 
    //读取文件内容
    public static void readContent(String path) throws IOException {
        //将要读取的文件路径
        Path fileName = new Path(path);
        ArrayList<String> returnValue = new ArrayList<String>();
        Configuration configuration = new Configuration();
        configuration.addResource(Resources.getResource("core-site-local.xml"));
        //获取客户端系统文件
        FileSystem fileSystem = FileSystem.get(configuration);
        //open打开文件--获取文件的输入流用于读取数据
        FSDataInputStream inputStream = fileSystem.open(fileName);
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        //一行一行的读取数据
        LineNumberReader lineNumberReader = new LineNumberReader(inputStreamReader);
        //定义一个字符串变量用于接收每一行的数据
        String str = null;
        //判断何时没有数据
        while ((str=lineNumberReader.readLine())!=null){
            returnValue.add(str);
        }
        //打印数据到控制台
        System.out.println("MapReduce算法操作的文件内容如下:");
        for (String read :
                returnValue) {
            System.out.println(read);
        }
        //关闭资源
        lineNumberReader.close();
        inputStream.close();
        inputStreamReader.close();
    }
}

 

三、配置文件:cort-site-master2.xml--注意里面的主机IP需要填写自己的

fs.defaultFS
hdfs://192.168.228.13:9000
fs.hdfs.impl
org.apache.hadoop.hdfs.DistributedFileSystem
mapreduce.framework.name
yarn
yarn.resourcemanager.scheduler.address
192.168.228.13:8030
mapreduce.app-submission.cross-platform
true
The address of the applications manager interface in the RM.
yarn.resourcemanager.address
192.168.228.13:8032
The address of the scheduler interface.
yarn.resourcemanager.scheduler.address
192.168.228.13:8030
The http address of the RM web application.
yarn.resourcemanager.webapp.address
192.168.228.13:8088
The https adddress of the RM web application.
yarn.resourcemanager.webapp.https.address
192.168.228.13:8090
yarn.resourcemanager.resource-tracker.address
192.168.228.13:8031
The address of the RM admin interface.
yarn.resourcemanager.admin.address
192.168.228.13:8033
yarn.nodemanager.aux-services
mapreduce_shuffle

 

四、在pom文件中添加的依赖

4.0.0
com.zhiyou100
mrdemo
1.0-SNAPSHOT
2.7.5
org.apache.hadoop
hadoop-mapreduce-client-core
${org.apache.hadoop.version}
org.apache.hadoop
hadoop-mapreduce-client-common
${org.apache.hadoop.version}
org.apache.hadoop
hadoop-mapreduce-client-jobclient
${org.apache.hadoop.version}
org.apache.hadoop
hadoop-common
${org.apache.hadoop.version}
org.apache.hadoop
hadoop-hdfs
${org.apache.hadoop.version}
mysql
mysql-connector-java
5.1.46

五、测试:在本地将jar包自动上传到hdfs上运行,(运行时间长)

在hdfs上保证

1.有/wc文件夹--文件夹中的文件内容以空格隔开

例如:我在/wc目录下有一个a.txt,a.txt中内容如下

2.在hdfs上保证没有/reout目录

在打jar包之前需要将第三方jar包放在lib中(在resources中创建lib文件),再打包。

以上操作之后在本地直接运行(右击Run),就会出现类似下面的内容

转载于:https://www.cnblogs.com/pigdata/p/10305598.html

你可能感兴趣的文章
laravel
查看>>
installing the matplotlib via pip in the enviroment dos
查看>>
bzoj3312: [Usaco2013 Nov]No Change
查看>>
如何改善下面的代码 领导说了很耗资源
查看>>
Quartus II 中常见Warning 原因及解决方法
查看>>
高德地图 – 1.问题集锦
查看>>
php中的isset和empty的用法区别
查看>>
ajax VS websocket
查看>>
Android ViewPager 动画效果
查看>>
Android ijkplayer详解使用教程
查看>>
Android UI-仿微信底部导航栏布局
查看>>
Android中pendingIntent的深入理解
查看>>
Android ActionBar
查看>>
Redis集群方案Codis部署手册
查看>>
MySQL 第六天
查看>>
python 笔记一
查看>>
pip和easy_install使用方式
查看>>
数据表与简单java类(一对多的关系)
查看>>
博弈论
查看>>
CSS3 - 如何给图片增加内阴影
查看>>