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