大数据统计MapReduce

  • Post author:
  • Post category:其他




一.Linux的安装

一.Linux的安装

这里使用VirtualBox 安装Linux的ubuntu 14.4进行操作,下载后按自己的需求安装。安装过程若下载东西很慢可以将网络断开,这样可以减少一些软件的下载,若后续需要再下。装完之后重启ubuntu,安装增强功能,开启共享文件夹与拖放,方便后续的操作。



二.准备工作

二.准备工作

1.创建hadoop账户

首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户 :

sudo useradd -m hadoop -s /bin/bash

这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。

接着使用如下命令设置密码,可简单设置为 hadoop,按提示输入两次密码:

sudo passwd hadoop

可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题:

sudo adduser hadoop sudo

最后注销当前用户(点击屏幕右上角的齿轮,选择注销),返回登陆界面。在登陆界面中选择刚创建的 hadoop 用户进行登陆。

2.更新apt

用 hadoop 用户登录后,我们先更新一下 apt,后续我们使用 apt 安装软件,如果没更新可能有一些软件安装不了。按 ctrl+alt+t 打开终端窗口,执行如下命令:

sudo apt-get update

安装 vim(vi增强版,基本用法相同)

sudo apt-get install vim

3.安装SSH、配置SSH无密码登陆

这里可以尝试拖放,如果可以使用拖放也可以跳过这一步,但是建议还是用SSH,因为以后会很常用。

集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server:

sudo apt-get install openssh-server

安装后,可以使用如下命令登陆本机:

ssh localhost

此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了。

但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。

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

exit # 退出刚才的 ssh localhost

cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost

ssh-keygen -t rsa # 会有提示,都按回车就可以

cat ./id_rsa.pub >> ./authorized_keys # 加入授权

此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了。



三…安装Java环境

三.安装Java环境

1.安装JDK

jdk-8u162-linux-x64.tar.gz(提取码:99bg)

请把压缩格式的文件jdk-8u162-linux-x64.tar.gz下载到本地电脑,如:“/home/hpf/Downloads/”目录下

在Linux命令行界面中,执行如下Shell命令(注意:当前登录用户名是hadoop):

cd /usr/lib

sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件

cd ~ #进入hadoop用户的主目录

cd Downloads #注意区分大小写字母,刚才已经通过FTP软件把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录下

sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下

2.验证JDK安装情况

JDK文件解压缩以后,可以执行如下命令到/usr/lib/jvm目录查看一下:

cd /usr/lib/jvm

3.设置JAVA坏境变量

cd ~

vim ~/.bashrc

通过vim编辑器。打开环境变量配置.bashrc文件,在文件开头添加如下几行内容:

(vim编辑器中,按“i”进去编辑模式,按“:wq”保存并返回终端)

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162

export JRE_HOME=



J

A

V

A

H

O

M

E

/

j

r

e

e

x

p

o

r

t

C

L

A

S

S

P

A

T

H

=

.

:

{JAVA_HOME}/jre export CLASSPATH=.:







J


A


V



A










H


















O


M


E



/


j


r


e


e


x


p


o


r


t


C


L


A


S


S


P


A


T


H




=








.




:





{JAVA_HOME}/lib:



J

R

E

H

O

M

E

/

l

i

b

e

x

p

o

r

t

P

A

T

H

=

{JRE_HOME}/lib export PATH=







J


R



E










H


















O


M


E



/


l


i


b


e


x


p


o


r


t


P


A


T


H




=





{JAVA_HOME}/bin:$PATH

保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:

source ~/.bashrc

验证安装情况

java -version

在这里插入图片描述

如果能够在屏幕上返回如下信息,则说明安装成功:



四.安装 Hadoop

四.安装 Hadoop

hadoop-2.7.1.tar.gz(提取码:99bg)

使用ftp上传至下载中

我们选择将 Hadoop 安装至 /usr/local/ 中:

sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local # 解压到/usr/local中

cd /usr/local/

sudo mv ./hadoop-2.6.0/ ./hadoop # 将文件夹名改为hadoop

sudo chown -R hadoop ./hadoop # 修改文件权限

Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:



五.Hadoop伪分布式配置

1.修改配置文件

Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

修改配置文件 core-site.xml:

修改为下面配置:

hadoop.tmp.dir

file:/usr/local/hadoop/tmp

Abase for other temporary directories.

fs.defaultFS

hdfs://localhost:9000

同样的,修改配置文件 hdfs-site.xml:

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

2.执行 NameNode 的格式化:

cd /usr/local/hadoop

./bin/hdfs namenode -format

成功的话,会看到 “successfully formatted” 的提示。

如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。

接着开启 NameNode 和 DataNode 守护进程。

cd /usr/local/hadoop

./sbin/start-dfs.sh #start-dfs.sh是个完整的可执行文件,中间没有空格

若出现如下SSH提示,输入yes即可。

在这里插入图片描述

3.开启NameNode和DataNode守护进程

当程序启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”。

在这里插入图片描述

成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。

在这里插入图片描述



六.调用MapReduce执行WordCount对单词进行计数

六.调用MapReduce执行WordCount对单词进行计数

1.将待分析的文件上传到HDFS

文件命名:fpf.txt(不少于10000英文单词)

我们需要启动Hadoop。执行如下命令

1.cd /usr/local/hadoop
2../sbin/start-dfs.sh #启动hadoop

在这里插入图片描述

.将File.txt(或者是想要上传的文件)文件需要上传到hdfs的input里(注:已经创建的文件input)命令如下:

./bin/hdfs dfs -put /home/hadoop/File.txt  input

在这里插入图片描述

把HDFS中的File.txt文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下,命令如下:

./bin/hdfs dfs -get input/File.txt  /home/hadoop/下载

在这里插入图片描述

.可以使用如下命令,到本地文件系统查看下载下来的文件File.txt:

$ cd ~
$ cd 下载
$ ls
$ cat File.txt

2.安装Eclipse

在ubuntu软件中心中下载安装:

下载后执行如下命令,将 Eclipse 安装至 /usr/lib 目录中:

sudo tar -zxf ~/下载/eclipse-java-mars-1-linux-gtk*.tar.gz -C /usr/lib

3.安装 Hadoop-Eclipse-Plugin

要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-plugin,可下载 Github 上的 hadoop2x-eclipse-plugin(备用下载地址:http://pan.baidu.com/s/1i4ikIoP)。

下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar (还提供了 2.2.0 和 2.4.1 版本)复制到 Eclipse 安装目录的 plugins 文件夹中,运行 eclipse -clean 重启 Eclipse 即可(添加插件后只需要运行一次该命令,以后按照正常方式启动就行了)。

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 # 添加插件后需要用这种方式使插件生效

4.配置 Hadoop-Eclipse-Plugin

在继续配置前请确保已经开启了 Hadoop。

启动 Eclipse 后就可以在左侧的Project Explorer中看到 DFS Locations(若看到的是 welcome 界面,点击左上角的 x 关闭就可以看到了。CentOS 需要切换 Perspective 后才能看到,即接下来配置步骤的第二步)。

插件需要进一步的配置。

第一步:选择 Window 菜单下的 Preference。

此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。

第二步:切换 Map/Reduce 开发视图,选择 Window 菜单下选择 Open Perspective -> Other(CentOS 是 Window -> Perspective -> Open Perspective -> Other),弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。

第三步:建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location。

在弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致。由于我使用的Hadoop伪分布式配置,设置 fs.defaultFS 为 hdfs://localhost:9000,所以此处DFS Master 的 Port 要改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。

配置好 General ,点击 finish,Map/Reduce Location 就创建好了。

5.在 Eclipse 中操作 HDFS 中的文件

配置好后,点击左侧 Project Explorer 中的 MapReduce Location 就能直接查看 HDFS 中的文件列表了

6.在 Eclipse 中创建 MapReduce 项目

点击 File 菜单,选择 New -> Project…:

选择 Map/Reduce Project,点击 Next。

填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目。

7.在安装eclipse的情况下,打开eclipse创建需要填写workspace(工作空间),用来保存程序所在的位置,这里按照默认,不需要改动,如下图
在这里插入图片描述

8.点击“OK”按钮,进入Eclipse软件。

选择“File->New->Java Project”菜单,开始创建一个Java工程

在这里插入图片描述

在这里插入图片描述

9.可以看出,Eclipse自动创建了一个名为“HDFSFileIfExist.java”的源代码文件,请在该文件中输入以下代码:

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","outpu2"};
    if(otherArgs.length < 2) {
        System.err.println("Usage: wordcount <in> [<in>...] <out>");
        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<Text, IntWritable, Text, IntWritable> {
    private IntWritable result = new IntWritable();

    public IntSumReducer() {
    }

    public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        int sum = 0;

        IntWritable val;
        for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
            val = (IntWritable)i$.next();
        }

        this.result.set(sum);
        context.write(key, this.result);
    }
}

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
    private static final IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public TokenizerMapper() {
    }

    public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());

        while(itr.hasMoreTokens()) {
            this.word.set(itr.nextToken());
            context.write(this.word, one);
        }

    }
}

}

在这里插入图片描述

10.可以直接点击Eclipse工作界面上部的运行程序的快捷按钮,当把鼠标移动到该按钮上时,在弹出的菜单中选择“Run As”,继续在弹出来的菜单中选择“Java Application”,如图所示。

在这里插入图片描述

11.代码运行正常后,可以查看output的统计数据了:

在这里插入图片描述

在这里插入图片描述

12.点击output:然后点击part-r-00开头的文件点击右键会出现下载;点击下载就OK了。
在这里插入图片描述

在这里插入图片描述

#大数据统计单词

1.将待分析的文件(不少于10000英文单词)上传到HDFS。

2.调用MapReduce对文件中各个单词出现的次数进行统计.

3.将统计结果下载本地



版权声明:本文为weixin_48070777原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。