Ubantu 0基础到MapReduce创建WordCount项目

一、Ubantu在VirtualBox上安装

1.在Windows中使用VirtualBox安装Ubuntu

(1)开机时按F2(每台电脑不一样)进入BIOS,确认CPU开启了虚拟化技术(Virtual Technology)为Enabled。并在网上下载并安装VirtualBox。
(2)安装完VirtualBox后,新建虚拟电脑
在这里插入图片描述
(3)分配内存以及创建虚拟硬盘
在这里插入图片描述在这里插入图片描述
(4)选择硬盘文件类型VDI
在这里插入图片描述
(5)虚拟硬盘选择动态分配,选择文件存储的位置和容量大小
在这里插入图片描述

在这里插入图片描述
(6)选择下载的Ubuntu LTS 14.04的ISO映像文件
ubantu_14->储存->控制器->属性->分配光盘
在这里插入图片描述

(7)启动虚拟机,断网安装ubantu
在这里插入图片描述
(8)选择安装类型(自定义分区)
在这里插入图片描述
(9)分区,创建主分区以及逻辑分区
在这里插入图片描述

在这里插入图片描述

(10)安装
在这里插入图片描述
(11)设置用户名和密码
在这里插入图片描述
(12)ubantu基本安装完成

2.安装增强功能

(1)安装例图
在这里插入图片描述
(2)虚拟终端输入
$ sudo apt-get install virtualbox-guest-dkms执行
(3)系统设置->显示->分辨率(适合的)->应用在这里插入图片描述
(4)设置网络接口[(桥接网卡)直接使用物理机上的网络(有线/无线)]
在这里插入图片描述

二、Hadoop安装

1.创建hadoop用户。

(1)添加hadoop用户。
命令行界面执行:
$ sudo useradd -m hadoop -s /bin/bash
//这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。
(2)设置密码,可简单设置为Hadoop。
执行$ sudo passwd hadoop//需输入两次密码。
(3)为hadoop用户增加管理员权限,方便部署。
执行$ sudo adduser hadoop sudo
(4)在hadoop用户登录后,更新apt,后续使用apt安装软件。
执行$ sudo apt-get update
(5)安装vim编辑器
执行$ sudo apt-get install vim

2.安装SSH、配置SSH无密码登录(目的是为了在window与ubantu之间使用SFTP)

(1)执行$sudo apt-get install openssh-server //安装SSH server
(2)执行$ssh localhost//第一次登录需输入密码在这里插入图片描述
(3) 利用 ssh-keygen 生成密钥,并将密钥加入到授权中
在这里插入图片描述
(4)再次登录时无需密码直接登录在这里插入图片描述

3.文件传输以及环境变量的配置

(1)FileZilla中创建window和ubantu的站点连接
在这里插入图片描述

(2)将jdk的安装包上传ubantu

(3)在ubantu上执行下列命令

$cd /usr/lib
$sudo mkdir jvm #

创建/usr/lib/jvm目录用来存放JDK文件
$cd ~ #进入hadoop用户的主目录
$cd Downloads #注意区分大小写字母,刚才已经通过FTP软件把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录下(downloads文件可能时中文,在上一步操作时用ll查看是否存在该文件夹)

$sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm 

#把JDK文件解压到/usr/lib/jvm目录下

(4)设置环境变量:

$cd ~
$vim ~/.bashrc

在这个文件的开头位置,添加

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

如图:
在这里插入图片描述
(5)执行如下命令让.bashrc文件的配置立即生效:
在这里插入图片描述
(6)查看是否安装成功:
在这里插入图片描述

4.安装hadoop

(若3.(1)未将该安装包上传需再用FileZilla进行上传)
(上传后安装包位于~家目录低下)
(1)安装hadoop-2.10.0.tar.gz

$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-2.10.0重命名为hadoop
在这里插入图片描述

$sudo chown -R hadoop ./hadoop

#修改(hadoop用户对于)文件(hadoop)的权限
(将文件所有者改为hadoop用户)
在这里插入图片描述

(2)检查hadoop是否安装成功

$cd /usr/local/hadoop
$./bin/hadoop version

在这里插入图片描述

5.hadoop单机配置(非分布式)

Hadoop默认为非分布式(本地模式)。非分布式即单Java进程,方便进行调试。
(1)用例hadoop的配置(运行hadoop非分布式实例)

$cd /usr/local/hadoop

//以下整个过程都在此路径下执行

$mkdir ./input
$cp ./etc/hadoop/*.xml ./input

//将./etc/hadoop/*.xml(所有xml后缀的文件)复制到./input里面,并将配置文件作为输入文件

$./bin/hadoop jar ./share.hadoop/mapreduce/Hadoop-mapreduce-examples-*.jar grep ./input ./output ‘dfs[a-z.]+

//(使用hadoop运行jar包)+包的相对路径(grep使用的类,input为输入目录,ouput为输出目录)。
(2)检查输出结果

$cat ./output/*

#查看运行结果
如例图:
插入图片描述
(hadoop默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需先将用$rm -r ./output删除)

6.hadoop伪分布式配置

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是
HDFS 中的文件。

 $cd /usr/local/hadoop

(1)伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
可用gedit或者vim命令进行文件编辑

$vim ./etc/hadoop/core-site.xml

<configuration>
</configuration>

修改为下面配置:

<configuration>    
	<property>        
		<name>hadoop.tmp.dir</name>
       		<value>file:/usr/local/hadoop/tmp</value>            					        				
       		<description>Abase for other temporary directories.</description>    
	</property>    
	<property>        
		<name>fs.defaultFS</name>        
		<value>hdfs://localhost:9000</value>    
	</property>
</configuration>

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

$vim ./etc/hadoop/hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

(2)配置完成后,执行NameNod的格式化

$./bin/hdfs namenode -format

#成功格式化如下

看到“successfully formatted” 和 “Exitting with status 0” 的提示,若为“Exitting with status 1” 则是出错。
在这里插入图片描述

(3)开启 NameNode 和 DataNode 守护进程。

$./sbin/start-dfs.sh

//start-dfs.sh是个完整的可执行文件~
在这里插入图片描述
(4)判断jps是否成功启动
如下图(显示NameNode、DataNode、SecondaryNode)则成功~
可以用web界面http://localhost:50070看到NameNode和DataNode信息
在这里插入图片描述

7.运行hadoop伪分布式实例

上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS
(1)需要在 HDFS 中创建用户目录:

$./bin/hdfs dfs -mkdir -p /user/hadoop

(2)创建文件输入得文件夹,并将本地文件复制到分布式文件系统得输入文件夹中

$./bin/hdfs dfs -mkdir input
$./bin/hdfs dfs -put ./etc/hadoop/*.xml input

复制完成后,可以通过如下命令查看文件列表:

$./bin/hdfs dfs -ls input

伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。

$./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
(3)查看运行结果的命令(查看的是位于 HDFS 中的输出结果):

$./bin/hdfs dfs -cat output/*

结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。
在这里插入图片描述
我们也可以将运行结果取回到本地:

$rm -r ./output    # 先删除本地的 output 文件夹(如果存在)
$./bin/hdfs dfs -get output ./output     # 将 HDFS 上的 output 文件夹拷贝到本机
$cat ./output/*

Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:

$./bin/hdfs dfs -rm -r output    # 删除 output 文件夹

(4)若要关闭 Hadoop,则运行:

$./sbin/stop-dfs.sh

三、安装Eclipse

在这里插入图片描述

四、配置 Hadoop-Eclipse-Plugin

1.将hadoop2x-eclipse-plugin-master.zip用FizillaClient传入ubantu,并在ubantu上执行

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

2.开启hadoop并设置eclipse

(1)选择Window 菜单下的 Preference。
设置图如下:
在这里插入图片描述
(2)选择 Window 菜单下选择 Open Perspective -> Other,弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。
(3)建立与
Hadoop 集群的连接,点击 Eclipse软件右下角的Map/Reduce Locations 面板,在面板中单击右键,选择New Hadoop Location。配置如下:
在这里插入图片描述

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

配置好后,点击左侧 Project Explorer 中的 MapReduce Location (点击三角形展开)就能直接查看
HDFS 中的文件列表了(HDFS 中要有文件,如下图是
WordCount 的输出结果)
在这里插入图片描述
(1) 点击 File 菜单,选择New -> Project…:
(2)选择 Map/Reduce Project,点击 Next。
配置图如下:
在这里插入图片描述
(3) 填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目。操作图如下:
在这里插入图片描述
(4)此时在左侧的 Project Explorer 就能看到刚才建立的项目了。
在这里插入图片描述
(5)接着右键点击刚创建的 WordCount 项目,选择New -> Class
配置图如下:
在这里插入图片描述
(6) 创建 Class 完成后,在Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件中。
配置图如下:
在这里插入图片描述

五、 运行 MapReduce

1.配置文件

(1)在运行 MapReduce 程序前,还需要执行一项重要操作(也就是上面提到的通过复制配置文件解决参数设置问题):将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中
在这里插入图片描述
(2)复制完成后,务必右键点击WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新)
在这里插入图片描述
(3)编写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();
        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);
            }
 
        }
    }
}

(4)初次运行

在这里插入图片描述
(5)右键点击刚创建的WordCount.java,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数(如果 JavaApplication 下面没有 WordCount,那么需要先双击 Java Application)。切换到“Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。
在这里插入图片描述

2.运行实例

(1)home/hadoop/sadworld.txt文件上传到hdfs上
在这里插入图片描述
(2)将代码main() 函数的 String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 改为:
String[] otherArgs=new String[]{“input1”,”output2”};
(3)运行WordCount程序,统计sadworld.txt中字符出现的次数
在这里插入图片描述(4)执行完毕,查看字符统计情况
在这里插入图片描述
(5)将运行结果下载到本地在这里插入图片描述
(6)查看结果
在这里插入图片描述
在MapReduce中运行WordCount以及字数统计中遇到的问题
参考链接:
bantu在VirtualBox上安装
Hadoop安装
安装Eclipse
使用Eclipse编译运行MapReduce程序

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值