Ubantu 0基础到MapReduce创建WordCount项目

Posted fadeless_3

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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程序

以上是关于Ubantu 0基础到MapReduce创建WordCount项目的主要内容,如果未能解决你的问题,请参考以下文章

在MapReduce中运行WordCount以及字数统计中遇到的问题

如何使用 API 创建跨 TFS 集合的 TFS/Azure DevOps 工作项查询并将其导出到 Wor/Excel/Outlook 等

ubuntu8.0 下mdadm命令不能用,我的电脑没联网 ,怎么下载安装包 怎么让我的电脑能运行madad命令(ubantu

Ubantu常用命令

ubantu系统修改权限失败,导致只能客人会话登录解决办法

MapReduce基础知识