在ubuntu14下使用eclipse完成伪分布式的WordCound程序

在ubuntu14 下使用eclipse完成WordCound程序

操作步骤
  1. 搭建环境
    1.1 安装ubuntu系统
    1.2 在ubuntu中安装jdk
    1.3 在ubuntu中安装hadoop,并搭建伪分布式环境
    1.4 在ubuntu中安装eclipse,并安装hadoop插件
  2. 编写代码,运行
环境准备
  1. ubuntu14镜像文件

下载地址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases
安装教程懒得写了,自己找去吧
安装成功后,ubuntu14没有自带右键打开终端的功能,所以需要自己去搞一下,很简单,在文章末尾介绍

  1. Linux版本的jdk

下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
看准是Linux版本的哦

  1. hadoop

下载地址:http://mirror.bit.edu.cn/apache/hadoop/common/
也要是Linux版本的哦

  1. eclipse

下载地址:https://www.eclipse.org/downloads/packages/
访问会比较慢,下载的时候要记得选择镜像下载,要不然下载速度会让你绝望
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
版本选择Linux版本,Eclipse IDE for Enterprise Java Developers

  1. eclipse的hadoop插件

下载地址:https://pan.baidu.com/s/1ZU7UNHFkmhwV5X31_4CYqg
提取码:97ir
在GitHub上也有,一搜就可以搜到

安装jdk
  1. 将下载的jdk压缩包,放在/opt目录下(这个目录下的操作需要root权限),然后使用tar -zxvf 压缩包名称解压,解压成功后,就可以把压缩包删了(删除文件命令:rm -f 文件名
  2. 配置环境变量,在桌面打开终端,输入指令gedit ~/.bashrc,在打开的文档的最下面,输入
export JAVA_HOME=/opt/jdk1.8.0_151(最后面这个填你自己的jdk的解压文件夹的名字)
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${PATH}

完成后保存,退出
注意:如果gedit用不了的话,还可以使用vi或者vim

  1. 在终端输入javac,测试jdk是否配置成功,成功显示如图
    在这里插入图片描述
安装hadoop并搭建伪分布式环境
  1. 将下载的hadoop放在/usr/local目录下(这个目录下的操作也需要root权限),然后使用tar -zxvf 压缩包名称解压,解压成功后,就可以把压缩包删了(删除文件命令:rm -f 文件名
  2. 配置环境变量,在桌面打开终端,输入指令gedit ~/.bashrc,在打开的文档的最下面,输入
export HADOOP_HOME=/usr/local/hadoop(最后面这个写你自己的hadoop解压文件名)
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH

完成后保存,退出

  1. 在终端输入hadoop version,测试hadoop是否安装成功,成功显示如图
    在这里插入图片描述
  2. hadoop安装成功后,在/usr/local目录下打开终端,输入指令chown -R hduser:hduser /usr/local/hadoop,将hadoop文件夹的所有者改为自己,解释一下,chown是指令,-R是参数,意思是将该文件夹下的所有子文件和文件夹的所有者都改成自己,hduser:hduser中,冒号前面的hduser表示用户,冒号后面的表示用户组,在后面就是要更改权限的目录,所以指令是chown -R 用户名:用户组 文件夹位置
  3. 权限更改之后,关闭终端,进入hadoop文件夹,找到etc文件夹,进入,应该还是一个hadoop文件夹,再进入,找到core-site.xml文件,选择用文本编辑器打开,在configuration节点下写入
 <property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:9000</value>
 </property>

保存,退出
解释一下,这个property是配置HDFS的默认名称

  1. 接着找到hdfs-site.xml文件,选择文本编辑器打开,同样在configuration节点下写入
 <property>
  <name>dfs.replication</name>
  <value>3</value>
 </property>
 <property>
  <name>dfs.namenode.name.dir</name>
  <value>file:/usr/local/hadoop/hadoop_data/hdfs/namenode</value>
 </property>
 <property>
  <name>dfs.datanode.data.dir</name>
  <value>file:/usr/local/hadoop/hadoop_data/hdfs/datanode</value>
 </property>

保存,退出
再解释一下,第一个property节点是配置blocks副本备份数量,第二个property是配置namenode数据存储目录,可以自己修改,但是文件夹的所有者一定要是自己,要不然后面启动hadoop会有问题,第三个property是配置datanode数据存储目录,和第二个一样的道理

  1. 还是在这个目录下找到yarn-site.xml文件,打开,在configuration节点上写入
 <property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
 </property>
 <property>
  <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  <value>org.apache.hadoop.mapred.ShuffleHandler</value>
 </property>

保存,退出

  1. 还是在这个目录下,打开终端,输入cp mapred-site.xml.template mapred-site.xml,意思是将mapred-site.xml模板文件里面的内容复制到mapred-site.xml文件下,执行完成后应该会多出来一个mapred-site.xml文件,打开,还是在configuration节点下写
 <property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
 </property>

保存,退出
意思是设置mapreduce框架为yarn

  1. 在这四个xml文件配置成功之后,根据hdfs-site.xml里面namenode和datanode配置的路径,建立文件夹,比如我配置的是file:/usr/local/hadoop/hadoop_data/hdfs/datanode(namenode),所以我在/usr/local/hadoop下新建文件夹hadoop_data,然后在新建hdfs文件夹,然后再是namenode和datanode文件夹,要注意的是,不管新建在哪,文件夹的所有者必须是自己,不能是root,要不然在eclipse连接会有问题
  2. 在桌面打开终端,输入hadoop namenode -format,意思是格式化HDFS,如果出现报错信息,那就说明文件夹有问题,可以从路径是否正确,权限是否是自己去检查错误原因。
  3. 在格式化成功后,继续输入start-all.sh开启hadoop(这个是同时开启HDFS和YARN,也可以分别启动,命令为start-dfs.sh,然后start-YARN.sh),期间会输入好几次密码(设置免密了的就不需要输入了)
  4. 查看hadoop是否开启,在终端输入jps,出现如图,表示启动成功,少了则是前面的步骤哪错了
    在这里插入图片描述
  5. 到此,hadoop伪分布式搭建成功,不要关闭hadoop,继续操作
安装eclipse及其插件
  1. 直接在桌面解压eclipse的安装包,解压完成后先不要启动(好像启动了也没关系),然后在Windows下解压eclipse的hadoop插件压缩包,然后只要release中的hadoop-eclipse-kepler-plugin-2.6.0.jar,把这个jar包搞到ubuntu下,放在eclipse的安装目录的plugins文件夹下,然后打开eclipse
    在这里插入图片描述
  2. 打开eclipse后,左侧有
    在这里插入图片描述
    说明插件安装成功,接着在eclipse里面设置
  3. 依次点击window–》perference,点击
    在这里插入图片描述
  4. 将MapReduce Location调出来(已经出现了的跳过此部),依次点击Window–》show view–》other,在输入框输入map,自动出现这个,点击open,将会出现在底部卡片栏
    在这里插入图片描述
  5. 在底部卡片栏找到刚刚调出来的视图,右键空白区域,选择new MapReduce Location
    在这里插入图片描述
  6. OK,然后你就可以点击左侧的DFS locations,查看HDFS的文件,如果连接失败就是前面的操作出问题了,在这个DFS locations下就可以直接下载,上传,新建文件夹,等操作,但是每次操作不会自动刷新,得自己刷新一下
  7. 到这一步,所有环境都准备好了,开始编写代码
编写WordCount程序,并运行
  1. 新建MapReduce project,没有就搜一下
  2. 创建Mapper类,代码如下
import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

/**
 * 
 * @author Dong
 *
 */
public 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);
		}

	}
}

  1. 创建Reduce类
import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

/**
 * 
 * @author Dong
 *
 */
public 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);
    }
}


  1. 创建驱动程序
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 
/**
 * 
 * @author Dong
 *
 */
public class WordCount {
    public WordCount() {
    }
 
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs=new String[]{"hdfs://localhost:9000/test/input","hdfs://localhost:9000/test/output"}; /* 直接设置输入参数 */
        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(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(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);
    }
}
  1. 在hdfs目录下,新建文件结构,新建/test/input(你也可以叫别的名字,但是代码里面记得改),要注意的是,不能跨级建文件夹,你必须先建/test,再去建/test/input。然后在input目录下上传需要Word count的文件
  2. 代码编写完成后,先将hadoop目录下的etc里面的core-site.xml和hdfs-site.xml和log4j.properties复制到项目的src路径下,然后右键main方法,Run as–》Run on Hadoop,然后就会运行了,手动刷新hdfs的目录(不会自动刷新),如果自动生成output目录,并且目录下有一个空的SUCCESS文件,则表示运行成功,output目录下的另一个文件就是统计的文件,否则就是失败,至于为什么要放那三个文件,来解释一下,如果没有这几个文件的话,程序会自动到本地去找需要WordCount的文件,具体是在哪个目录下找我忘了,反正是本地,所以要用core-site.xml和hdfs-site.xml两个文件的配置去覆盖默认的,这样就会去HDFS下找文件。至于log4j.propertys,就是为了控制打印的输出,你不放过来也可以,就是控制台不会输出map100%,reduce100%这样的东西了。
  3. 至此,整个程序完成
总结
  • 这是我写的第一条博客,写了好久,写的不好请见谅(但是我自己觉得挺详细了)
  • 这个是我们大数据的作业,因为最近帮了四个猪在搞这个,所以干脆写一遍博客,以后估计还得继续写
  • 前面说了,ubuntu14没有自带的右键打开终端的功能,所以得自己安装一下,就一条指令搞定sudo apt-get install nautilus-open-terminal,然后重启ubuntu就OK
  • 我自己用的是ubuntu14,然后帮那四个猪装的是CentOS7,所以不同的Linux操作可能会有一些差别
  • 最重要的一点就是这个hadoop启动,特别多的坑,有时候jps之后,框的那几个总会缺一个两个的,然后特别麻烦,大部分都是权限问题,所以hadoop的安装目录和hadoop_data文件夹的所有者一定要是自己,不然总会有很多麻烦
  • 在终端下不要随意切换到root,虽然功能强大,但是不知不觉,很多权限就变成了root的
  • 还有就是hadoop namenode -format别随便用,在安装成功后再用这个指令的话会造成数据丢失,频繁使用好像也会导致datanode和namenode不同步
  • 技术问题不要找我了,如果是版权问题的话,可以联系我,大部分都是自己的理解写出来的,代码部分就有些借鉴了
资料参考

本文参考

dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值