Windows下开发Hadoop程序遇到的坑及解决方案


背景

过几天工作需要用到Hadoop,于是就弄了本PDF看。看了半天也是晕晕乎乎的。干脆直接动手,这样还能掌握的快一点。于是我就在本地要搭建一个Hadoop的开发环境。


环境前提

1、Hadoop部署在测试服务器上。
2、开发人员在Windows上使用eclipse进行开发。(即运行和开发环境是分开的)
3、环境参数

Linux:CentOS release 6.7 (Final) x86_64

Java ,version:1.7.0_80 (x86_64)

Hadoop ,version:1.2.1

------------------------------

windows ,version:Windows 7 professional x86_64

eclipse ,version:Luna Service Release 2 (4.4.2)

------------------------------

4、其他需要使用的开源库

Apache Ant ,version:1.9.4


开始前准备

1、千万不要有中文路径!!!

2、如果Windows用户名是中文的,改掉它!!!变成英文的用户名!!!


Linux上的Hadoop安装

Java安装

1、Java安装还是相对简单的

2、首先去oracle官网下载对应的Java程序包,下载的时候需要登录,这个比较麻烦。Java下载页面

3、下载好之后是一个tar.gz文件,放到Linux下的某个目录(此处我放在了/opt下)

4、执行命令,解包

cd /opt
tar xvf 刚刚下载的tar.gz的文件名
// 示例
tar xvf jdk-7u80-linux-x64.tar.gz
// 解压出来的文件夹名称太长,这里我把文件夹重命名,这一步不是必须的
mv 解压出的文件名 新文件名
// 示例
mv jdk-7u80-linux-x64 jdk1.7.0_80
5、设置PATH环境变量

vim /etc/profile
// 增加JAVA_HOEM
export JAVA_HOME=/opt/jdk1.7.0_80
export PATH=$PATH:$JAVA_HOME/bin
6、加载当前环境变量

source /etc/profile
7、查看是否成功

java -version
若出现Java的版本信息等文本,证明安装成功。

Hadoop安装

1、下载hadoop的包,可以去官网 http://hadoop.apache.org/ 进行下载
2、与Java安装一样,使用tar命令解压,然后配置环境变量
3、
vim /etc/profile
export HADOOP_HOME=/opt/hadoop-1.2.1
export PATH=$PATH:$HADOOP_HOME/bin
source /etc/profile
4、对hadoop进行相关的配置( hadoop文件夹下的conf,这里我的路径为/opt/hadoop-1.2.1
(1)进入conf目录,vim编辑core-site.xml,编辑如下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>

<property>
    <name>hadoop.tmp.dir</name>
    <value>/hadoop</value>
</property>
<property>
    <name>dfs.name.dir</name>
    <value>/hadoop/name</value>
</property>
<property>
    <name>fs.default.name</name>
    <value>hdfs://hostname:9000</value>
</property>
<property>
    <name>dfs.permissions</name>
    <value>false</value>
</property>

</configuration>
这里我遇到了第一个坑就是
hdfs://hostname:9000
这一行配置,我根据网上的教程配置自己的hostname,于是变成了这样
hdfs://localhost:9000
几乎网上所有的教程都是这么写的。但是。请最好不要这样,因为这会再你配置eclipse时带来无尽的麻烦。(不要问我是怎么知道的)。我的建议是这样
hdfs://Linux服务器的IP地址:9000
(2)vim 编辑hadoop-env.sh

找到这一行

# export JAVA_HOME=/usr/lib/j2sdk1.5-sun
将它变为

export JAVA_HOME=/opt/jdk1.7.0_80
也就是把刚刚配置的JAVA_HOME的内容复制到此

(3)vim编辑hdfs-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>

<property>
    <name>dfs.data.dir</name>
    <value>/hadoop/data</value>
</property>
<property>
    <name>dfs.permissions</name>
    <value>false</value>
</property>

</configuration>


(4)vim编辑mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>

<property>
    <name>mapred.job.tracker</name>
    <value>Linux的IP地址:9001</value>
</property>

</configuration>

说明一下,dfs.permissions配置默认为true,由于是测试用,这里将其关闭,避免过多的麻烦

这里的配置是最简单的一个配置,目的是为了能让用户快速开始hadoop的使用。
IP:端口号中的端口号可以进行自定义,不一定非要9000和9001,自己能区分就ok

5、进入/opt/hadoop-1.2.1/bin下

./start-all.sh

会出现让你输入root密码的选项,3次。输入就ok

之后格式化hdfs

hadoop fs -format
执行jps命令,若出现以下字样,代表启成功了(前边的数字可能不太一样)


windows下的开发环境搭建

eclipse插件的安装

之前一般eclipse插件都是能在网上下载到的,这次出乎我的意料,很少有下载的,网上的教程几乎清一色都是要自己编译的。我偏不信。。下载了几个。。果然不能用,有几个能用的,但是各种出错。最好的办法还是自己编译一下。

编译很简单的。

首先将刚刚下载的hadoop的tar.gz解压出来,这里我解压到了D盘。

eclipse插件编译

(1)进入D:\hadoop-1.2.1\src\contrib\eclipse-plugin目录下
(2)build.properties文件最下边新增2个配置,注意不要有空格
eclipse.home=D:/eclipse
version=1.2.1
第一行就是你的eclipse的安装目录。第二个的意思就是你的hadoop的版本
(3)修改build.xml
在节点<path id="eclipse-sdk-jars">内新增一个节点
<fileset dir="../../../">  
	<include name="hadoop*.jar"/>  
</fileset>
整个path节点就变成了这样
  <path id="eclipse-sdk-jars">
    <fileset dir="${eclipse.home}/plugins/">
      <include name="org.eclipse.ui*.jar"/>
      <include name="org.eclipse.jdt*.jar"/>
      <include name="org.eclipse.core*.jar"/>
      <include name="org.eclipse.equinox*.jar"/>
      <include name="org.eclipse.debug*.jar"/>
      <include name="org.eclipse.osgi*.jar"/>
      <include name="org.eclipse.swt*.jar"/>
      <include name="org.eclipse.jface*.jar"/>

      <include name="org.eclipse.team.cvs.ssh2*.jar"/>
      <include name="com.jcraft.jsch*.jar"/>
    </fileset> 
	<fileset dir="../../../">  
		<include name="hadoop*.jar"/>  
    </fileset>
  </path>
在<target name="jar" depends="compile" unless="skip.contrib">节点内注释掉2行,新增2行,最终target节点变成了这样
  <target name="jar" depends="compile" unless="skip.contrib">
    <mkdir dir="${build.dir}/lib"/>
	<!-- 
        <copy file="${hadoop.root}/build/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>
        <copy file="${hadoop.root}/build/ivy/lib/Hadoop/common/commons-cli-${commons-cli.version}.jar"  todir="${build.dir}/lib" verbose="true"/>
	-->
    <copy file="${hadoop.root}/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>  
    <copy file="${hadoop.root}/lib/commons-cli-${commons-cli.version}.jar"  todir="${build.dir}/lib" verbose="true"/>
	
    <jar
      jarfile="${build.dir}/hadoop-${name}-${version}.jar"
      manifest="${root}/META-INF/MANIFEST.MF">
      <fileset dir="${build.dir}" includes="classes/ lib/"/>
      <fileset dir="${root}" includes="resources/ plugin.xml"/>
    </jar>
  </target>
之后使用windows的smd命令行工具,进入 D:\hadoop-1.2.1\src\contrib\eclipse-plugin,输入“ant”命令。等待几分钟就ok了(期间需要联网)。

编译成功后,进入D:\hadoop-1.2.1\build\contrib\eclipse-plugin目录下,可以看到有一个hadoop-eclipse-plugin-1.2.1.jar文件,将其复制到eclipse的安装目录下的plugins文件夹内,重启eclipse即可。


eclipse插件配置

(1)首先调出hadoop的view,右上角,打开新的view,选择蓝色的大象,map/reduce


然后选择windows-->preferences


选择刚刚解压到D盘的hadoop路径
(2)配置Location


右键,选择“new hadoop location”,出现新的选项卡


需要填写的地方有几个,
Location Name,自己随便起个名字。
左侧的Master Host和Port,写之前字啊Linux下配置IP与端口号,右侧也是,端口号的对应关系是:
mapred.job.tracker节点的value对应左侧,core-site.xml里的fs.default.name节点value对应右侧。
username写root,因为我之前在Linux一直是用root用户操作的。
(3)修改advanced参数

有好多个参数,这里只要把我们之前在Linux上配置过的节点的值改过来即可。

比如之前我们配置的hadoop.tmp.dir的值是/hadoop,而这里默认的值不是这个,需要改正过来。改好之后,点击完成即可。

eclipse插件使用


我们可以看见刚刚创建的location在左侧显示出来了,点击箭头,可以查看什么在HDFS中的目录结构,在对应目录上右键,可以进行创建,修改文件之类的操作。

遇到的问题

是不是感觉上边太容易了?没有什么坑嘛,是因为我都拿在这里说了。。。

(1)刚刚第一步编译的hadoop-eclipse-plugin-1.2.1.jar,直接使用的话,在配置location时会有各种错误,通过分析错误日志可以发现是由于缺少jar包导致的,我们先关闭eclipse,对这个jar处理一下。

(2)用压缩工具打开jar包,是打开,不是解压,然后进入lib文件夹下,右键添加文件,在D:\hadoop-1.2.1\lib路径下选择要增加的jar包,如图所示


添加这几个jar包之后,我们回到上级目录,进入META-INF,修改MANIFEST.MF文件。

在倒数第二行,将原来的Bundle-ClassPath值修改为

Bundle-ClassPath: classes/,lib/hadoop-core.jar,lib/commons-cli-1.2.jar,lib/commons-configuration-1.6.jar,lib/commons-httpclient-3.0.1.jar,lib/commons-lang-2.4.jar,lib/jackson-core-asl-1.8.8.jar,lib/jackson-mapper-asl-1.8.8.jar
注意,要在一行上写,也就是说中间不要有空格,不要打回车

弄好之后我们保存一下,替换原来的jar包即可。



第二个问题是关于权限问题的,由于在windows上和linux上的文件权限不尽相同,会带来不必要的麻烦,所以我们需要对D:\hadoop-1.2.1\hadoop-core-1.2.1.jar进行修改,不过我按照网上的教程,注释掉部分源码之后,在进行编译,还是会出现错误,不知道是不是我的操作不正确,后来我在网上找到一个修改过的hadoop-core-1.0.3.jar,经测试可以正常使用,我在下边给出连接,大家可以下载使用


hadoop实例

新建Map/Reduce工程,复制如下代码
package xavier.hadoop.wordcount;

import java.io.IOException;
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.LongWritable;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class WordCount {

	public static class WordCountMap extends
			Mapper<LongWritable, Text, Text, IntWritable> {

		private final IntWritable one = new IntWritable(1);
		private Text word = new Text();

		public void map(LongWritable key, Text value, Context context)
				throws IOException, InterruptedException {
			String line = value.toString();
			StringTokenizer token = new StringTokenizer(line);
			while (token.hasMoreTokens()) {
				word.set(token.nextToken());
				context.write(word, one);
			}
		}
	}

	public static class WordCountReduce extends
			Reducer<Text, IntWritable, Text, IntWritable> {

		public void reduce(Text key, Iterable<IntWritable> values,
				Context context) throws IOException, InterruptedException {
			int sum = 0;
			for (IntWritable val : values) {
				sum += val.get();
			}
			context.write(key, new IntWritable(sum));
		}
	}

	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		Job job = new Job(conf);
		job.setJarByClass(WordCount.class);
		job.setJobName("wordcount");

		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);

		job.setMapperClass(WordCountMap.class);
		job.setReducerClass(WordCountReduce.class);

		job.setInputFormatClass(TextInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);

		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));

		job.waitForCompletion(true);
	}
}
这是一个比较简单的wordcount的入门例子,本人也刚刚接触,就不在讲解代码了。

要运行,需要先配置输入参数,选择run confignation

里边的IP换成自己的就ok。

需要注意的是,input/file01需要自己去创建的,file01随便写几个英文单词的句子就可以,最后会输出文件内每个单词出现的数量。


感觉最后叙述的有些混乱了。。。大家明白意思就好。不一定非要按我的配置来,可以灵活变动的。

以上是我首次配置hadoop的过程,其中花费我不少时间,希望这篇文章能帮更多的初学者少走一些弯路。

最后奉上连接

链接: http://pan.baidu.com/s/1qY3thZQ 密码: g53i








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值