• 基于Ubuntu Kylin系统在Hadoop的环境下调用MapReduce对单词WordCount计数


    基于Ubuntu Kylin系统在Hadoop的环境下调用MapReduce对单词WordCount计数

    一、首先在VB虚拟机中安装基本配置(基于Ubuntu Kylin已安装完毕)

    1、首先在终端中创建一个hadoop账户(若不想创建可跳过hadoop账户创建)

    sudo useradd -m hadoop -s /bin/bash
    
    • 1

    2、设置hadoop账户的密码

    sudo passwd hadoop
    
    • 1

    3、为 hadoop 用户增加管理员权限,为防止后续操作出现权限不够的情况

    sudo adduser hadoop sudo
    
    • 1

    最后注销当前账户登入hadoop账户
    4、登录hadoop账户后,我们对apt进行更新,在终端下输入以下命令

    sudo apt-get update
    
    • 1

    若出现更新不了的情况,请前往系统设置——软件和更新——下载自源选择https://mirrors.aliyun.com/ubuntu,将更新源更改完成后重新尝试输入上述命令选择软件和更新
    选择阿里云的镜像源
    5、装一个vim的编辑器,后期编辑文档比vi好用,辨别文字识别度更高,vi编辑器界面只有黑白,vim对于不同类型的文字有不同的颜色

    sudo apt-get install vim
    
    • 1

    在安装过程中,遇到确认在提示出填写y即可。
    在这里插入图片描述
    6、集群、单节点模式都需要用到 SSH 登陆,Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server

    sudo apt-get install openssh-server
    
    • 1

    安装完后,尝试进行登录

    ssh localhost
    
    • 1

    此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了。
    在这里插入图片描述
    但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。

    首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:

    exit                           # 退出刚才的 ssh localhost
    cd ~/.ssh/                     # 若没有该目录,请先执行一次ssh localhost
    ssh-keygen -t rsa              # 会有提示,都按回车就可以
    cat ./id_rsa.pub >> ./authorized_keys  # 加入授权
    
    • 1
    • 2
    • 3
    • 4

    此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了,如下图所示
    在这里插入图片描述

    二、安装Java环境

    1、安装JAVA环境采用手动安装,选择的JAVA安装包版本是JDK1.8的安装包jdk-8u162-linux-x64.tar.gz,安装包放在了坚果云里面,有需要的可以点击这个链接(访问密码:is03K4)。
    接下来我们对JAVA安装包进行安装,打开终端,输入如下命令(安装包已从Windows移动到Ubuntu中)。

    cd /usr/lib
    sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
    cd ~ #进入hadoop用户的主目录
    cd 下载  #通过vb的共享文件夹方式把JDK安装包jdk-8u162-linux-x64.tar.gz从Windows上传到到Ubuntu的该目录下
    sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm  #把JDK文件解压到/usr/lib/jvm目录下
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、想确认安装包是否已到指定路径,可使用下列命令进行查看

    cd /usr/lib/jvm  #切换到/usr/local/jvm这个路径
    ls  #查看当前文件夹有什么文件
    
    • 1
    • 2

    在这里插入图片描述
    3、设置JAVA环境变量

    cd ~
    vim ~/.bashrc
    
    • 1
    • 2

    通过上面的vim编辑器,打开环境变量配置文件.bashrc,在文件开头添加如下几行内容(进入vim编辑器中,按键盘“ i ”进入编辑模式)

    export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    编辑完后,按Esc退出编辑模式,按Shift+冒号,进入文本命令行模式,输入wq,保存并退出回到终端
    4、执行如下命令让.bashrc文件的配置立即生效,并用命令查看是否安装成功

    source ~/.bashrc   #让.bashrc文件的配置立即生效
    java -version   #查看是否安装成功
    
    • 1
    • 2

    若返回如下信息,则代表JAVA环境安装成功
    在这里插入图片描述

    三、安装Hadoop

    1、安装Hadoop,我选择的是Hadoop 2.10.0版本的安装包hadoop-2.10.0.tar.gz,可以点击这里进行下载(访问密码:KE3npb)
    接下来我们对Hadoop安装包进行安装,打开终端,输入如下命令(安装包已从Windows移动到Ubuntu中)。

    sudo tar -zxf ~/下载/hadoop-2.10.0.tar.gz -C /usr/local    # 解压到/usr/local中
    cd /usr/local/
    sudo mv ./hadoop-2.10.0/ ./hadoop            # 将文件夹名改为hadoop
    sudo chown -R hadoop ./hadoop       # 修改文件权限
    
    • 1
    • 2
    • 3
    • 4

    2、查看Hadoop解压完后是否可用,可使用如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息

    cd /usr/local/hadoop
    ./bin/hadoop version
    
    • 1
    • 2

    3、下面对Hadoop进行伪分布式的配置(Hadoop默认安装好单机配置)
    (1)Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,我们需要对core-site.xml 和 hdfs-site.xml这两个配置文件进行修改,使用vim编辑器对配置文件进行修改,每个配置以声明 property 的 name 和 value 的方式来实现。

    cd /usr/local/hadoop/etc/hadoop  #进入到hadoop文件夹中,core-site.xml 和 hdfs-site.xml这两个配置文件都在这个文件夹里面
    
    • 1

    (2)在进行修改配置文件前,需要创建相应的文件夹进行存放,否则在后面的操作中,不能够启动Hadoop

    sudo mkdir /usr/local/hadoop/tmp
    sudo mkdir /usr/local/hadoop/tmp/dfs/name
    sudo mkdir /usr/local/hadoop/tmp/dfs/data
    
    • 1
    • 2
    • 3

    (3)对core-site.xml进行修改

    vim core-site.xml 
    
    • 1

    在配置文件中找到下面这个标签对

    
    
    
    • 1
    • 2

    在这个标签对中插入下列内容

       
           hadoop.tmp.dir
           file:/usr/local/hadoop/tmp 
           Abase for other temporary directories.
       
       
           fs.defaultFS
           hdfs://localhost:9000
       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (4)对hdfs-site.xml进行修改

    vim hdfs-site.xml 
    
    • 1

    在配置文件中找到下面这个标签对

    
    
    
    • 1
    • 2

    在这个标签对中插入下列内容

       
            dfs.replication
            1
        
        
            dfs.namenode.name.dir
            file:/usr/local/hadoop/tmp/dfs/name
        
        
            dfs.datanode.data.dir
            file:/usr/local/hadoop/tmp/dfs/data
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4、配置完成后,执行 NameNode 的格式化:

    cd /usr/local/hadoop
    ./bin/hdfs namenode -format
    
    • 1
    • 2

    在这里插入图片描述
    5、开启 NameNode 和 DataNode 守护进程

    cd /usr/local/hadoop
    ./sbin/start-dfs.sh  #start-dfs.sh是个完整的可执行文件,中间没有空格
    
    • 1
    • 2

    若出现如下SSH提示,输入yes即可
    在这里插入图片描述
    6、当程序执行完后,可输入jps查看Hadoop是否启动成功,若出现下图则成功开启
    在这里插入图片描述
    7、成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
    在这里插入图片描述

    四、调用MapReduce执行WordCount对单词进行计数

    1、准备一个待分析的文件,里面全都是英文单词,我准备了一个不少于10000字的单词文本,有需要的可点击这里下载(访问密码:JXED37),将这个文件共享到Ubuntu的/usr/local/hadoop文件夹中,方便后续操作。
    在这里插入图片描述
    2、将这个文件上传到HDFS中,我们通过命令的方式进行上传(Hadoop已开启成功)

    ./bin/hdfs dfs -put /usr/local/hadoop/myLocalFile.txt  input
    
    • 1

    3、可以使用ls命令查看一下文件是否成功上传到HDFS中

    ./bin/hdfs dfs –ls input
    
    • 1

    在这里插入图片描述
    4、单词文件上传至HDFS成功后,我们需要安装 Hadoop-Eclipse-Plugin,因为我们要在Eclipse上编译和运行MapReduce程序(Eclipse已安装成功),Hadoop-Eclipse-Plugin安装包已上传至坚果云,可以点击这里进行下载(访问密码:BQkSow)
    接下来我们对Hadoop-Eclipse-Plugin安装包进行安装,打开终端,输入如下命令(安装包已从Windows移动到Ubuntu中)

    unzip -qo ~/下载/hadoop2x-eclipse-plugin-master.zip -d ~/下载 # 解压到~/下载中
    sudo cp ~/下载/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar /usr/lib/eclipse/plugins/  # 复制到eclipse安装目录的plugins目录下
    /usr/lib/eclipse/eclipse -clean  # 添加插件后需要用这种方式使插件生效
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    当执行完最后一条命令时,系统会自动打开Eclipse软件
    5、软件打开后,我们能够看到左边的Project Explorer里出现DFS Locations
    在这里插入图片描述
    6、插件需要进一步的配置,我们在上方找到Window——Preference
    在这里插入图片描述
    找到Hadoop Map/Reduce,在那里填入hadoop的安装地址/usr/local/hadoop
    在这里插入图片描述
    7、切换 Map/Reduce 开发视图,选择 Window 菜单下选择 Open Perspective——Other,在里面找到Map/Reduce
    在这里插入图片描述
    8、建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location
    在这里插入图片描述
    9、弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致,Host填localhost,DFS Master 的 Port 要改为 9000,Location name填MapReduceLocation
    在这里插入图片描述
    10、配置好后,点击左侧 Project Explorer 中的 MapReduce Location (点击三角形展开)就能直接查看 HDFS 中的文件列表了
    在这里插入图片描述
    11、在 Eclipse 中创建 MapReduce 项目
    (1)点击 File 菜单,选择 New——Project在这里插入图片描述
    (2)选择 Map/Reduce Project,点击 Next
    在这里插入图片描述
    (3)填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目
    在这里插入图片描述
    (4)此时在左侧的 Project Explorer 就能看到刚才建立的项目了
    (5)右键点击刚创建的 WordCount 项目,选择 New——Class
    在这里插入图片描述
    (6)弹出的class窗口需要填写两个地方:在 Package 处填写 org.apache.hadoop.examples;在 Name 处填写 WordCount
    在这里插入图片描述
    (7)创建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件中。

    package org.apache.hadoop.examples;
     
    import java.io.IOException;
    import java.util.Iterator;
    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;
    import org.apache.hadoop.util.GenericOptionsParser;
     
    public class WordCount {
        public WordCount() {
        }
     
        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            //String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
            String[] otherArgs=new String[]{"input","output"};
            if(otherArgs.length < 2) {
                System.err.println("Usage: wordcount  [...] ");
                System.exit(2);
            }
     
            Job job = Job.getInstance(conf, "word count");
            job.setJarByClass(WordCount.class);
            job.setMapperClass(WordCount.TokenizerMapper.class);
            job.setCombinerClass(WordCount.IntSumReducer.class);
            job.setReducerClass(WordCount.IntSumReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
     
            for(int i = 0; i < otherArgs.length - 1; ++i) {
                FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
            }
     
            FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
            System.exit(job.waitForCompletion(true)?0:1);
        }
     
        public static class IntSumReducer extends Reducer {
            private IntWritable result = new IntWritable();
     
            public IntSumReducer() {
            }
     
            public void reduce(Text key, Iterable values, Reducer.Context context) throws IOException, InterruptedException {
                int sum = 0;
     
                IntWritable val;
                for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
                    val = i$.next();
                }
     
                this.result.set(sum);
                context.write(key, this.result);
            }
        }
     
        public static class TokenizerMapper extends Mapper {
            private static final IntWritable one = new IntWritable(1);
            private Text word = new Text();
     
            public TokenizerMapper() {
            }
     
            public void map(Object key, Text value, Mapper.Context context) throws IOException, InterruptedException {
                StringTokenizer itr = new StringTokenizer(value.toString());
     
                while(itr.hasMoreTokens()) {
                    this.word.set(itr.nextToken());
                    context.write(this.word, one);
                }
     
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    (8)在运行 MapReduce 程序前,需要将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中,在终端中输入下列几行内容

    cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src
    cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src
    cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新,可看到src中多出了几个文件
    在这里插入图片描述
    (9)在代码文件中,右键选择Run As——Run on Hadoop就可以运行 MapReduce 程序了(运行文件前,务必把Hadoop启动)在这里插入图片描述
    (10)当程序执行完后,出现如图所示的样式时,代码运行成功,没有出现报错信息,那么单词计数已经成功在这里插入图片描述
    注意:
    1.若出现下面这条错误,则请在代码的左侧中找到标记红色的叉叉的图标,重新更换版本后再次执行代码。在这里插入图片描述
    2.若出现下面这条错误,则请在DFS Locations——Map ReduceLocation——user——hadoop中把output这个文件夹删掉,将output文件夹删掉后再次执行代码。在这里插入图片描述
    (11)查看结果有两种方式
    ①在DFS Locations——Map ReduceLocation——user——hadoop——output中打开part-r-00000这个文件就能查看到结果
    在这里插入图片描述
    ②在终端中输入下列命令可查看结果

    cd /usr/local/haddop
    ./bin/hdfs dfs -cat output/part-r-00000
    
    • 1
    • 2

    在这里插入图片描述
    在这里插入图片描述
    (12)将WordCount的输出结果part-r-00000下载到本地

    ./bin/hdfs dfs -get output/part-r-00000  /home/hadoop/下载  #把HDFS中的output/part-r-00000文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下
    
    • 1

    在这里插入图片描述
    (13)可以使用如下命令,到本地文件系统查看下载下来的文件part-r-00000

    cd ~
    cd 下载
    ls
    cat part-r-00000
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    在这里插入图片描述

    五、总结

    通过本次实验的实际操作,将WordCount这么一个案例,进行一个刨析以及实际应用,能够清楚了解到MapReduce的处理过程,首先通过输入一个案例,进行Map输入,Map进行Key、Value操作,输出的形式,然后进行洗牌,将Map的结果传给Reduce任务,Reduce整合后,输出Reduce结果。

    六、参考材料

    [1] http://dblab.xmu.edu.cn/blog/285/
    [2] http://dblab.xmu.edu.cn/blog/290-2/
    [3] http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/

  • 相关阅读:
    ARM FVP如何选择使用Base Platform还是Foundation Platform
    java 面试题
    前端框架学习之 搭建vue2的环境 书写案例并分析
    Java面试--HTTP和HTTPS协议
    Settings应用详情页面 & 安卓应用安装器 - com.google.android.packageinstaller
    网络基础知识
    Vue学习
    技术对接51
    CoppeliaSim机器人模拟器与Matlab Simulink环境
    CUR矩阵分解
  • 原文地址:https://blog.csdn.net/m0_55070913/article/details/126565571