#hadoop 开发环境搭建 (ubuntu + idea ) @(hadoop笔记)[idea|开发环境]java
基于ubuntu 和 idea 搭建 hadoop开发环境,实际上是搭建MR的开发环境。这里简单说一下为何采用idea,就由于一点,idea比eclipse爽的太多,虽然eclipse有hadoop插件,可是能用idea解决战斗,我宁愿牺牲一点的便利性。git
[TOC]程序员
##目的 首先,抛出该开发环境须要达到的目的和效果。github
基于以上三点,展开对开发环境的搭建。shell
##hadoop本地client环境搭建 这个是为了方便本地操做集群,包括管理hdfs和提交做业。因为只是提供了本地客户端的功能,因此配置很是简单(固然,若是远程集群开启了kerberos的话,本地也要初始化相应的Keytab)apache
vi /etc/profile
ubuntu
#配置java环境 export JAVA_HOME=/opt/jdk1.7.0_79 export PATH=$PATH:$JAVA_HOME/bin #配置hadoop环境,HADOOP_CONF_DIR用来读取配置文件,HADOOP_HOME用来加载hadoop程序和脚本 export HADOOP_CONF_DIR=/etc/hadoop/conf export HADOOP_HOME=/path/to/your/hadoop #第一步里解压出来的那个路径 export PATH=$PATH:$HADOOP_HOME/bin
core-site.xml
,hdfs-site.xml
,yarn-site.xml
,mapred-site.xml
到第二步配置的HADOOP_CONF_DIR目录下执行hdfs dfs -ls /
命令,测试一下是否成功显示远程hdfs的文件目录app
##IDEA开发环境搭建 这一部分会比较详细,可能会有点啰嗦。。。 ###第一步:新建一个wordcount工程 新建一个maven工程wordcount,初始化建立之后以下图目录结构 eclipse
把hadoop MR的wordcount示例代码拷贝到工程目录下,源代码传送门,并在pom.xml添加所需依赖maven
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.6.0</version> <!--<scope>provided</scope>--> </dependency>
到这里,代码就彻底不报错了
拷贝远程集群上core-site.xml
,hdfs-site.xml
,yarn-site.xml
,mapred-site.xml
到 src/main/resources目录下(若是没有就手动建立,并该目录为resource),这样所须要的配置也有了。固然也能够conf.setXXX方式把全部须要的配置都设置上,可是拷贝配置文件更省事,也跟远程集群配置统一。
这里若是把core-site.xml中的fs.defaultFS配置为file:///
表示使用本地文件系统,测试数据生成在本地就行了
<property> <name>fs.defaultFS</name> <!--<value>hdfs://DataCenterCluster</value>--> <value>file:///</value> </property>
生成本地文件系统上的测试数据
mkdir /tmp/in # 生成测试数据 echo "this is a test file , test word count" > /tmp/in/test.txt cat /tmp/in/test.txt
若是core-site.xml中的fs.defaultFS配置为hdfs://DataCenterCluster
(这个是ha的配置)表示使用远程的hdfs文件系统,测试数据就用hdfs上的,也能够在hdfs上手动生成测试数据,以下:
hdfs dfs -mkdir /tmp/in echo "this is a test file , test word count" | hdfs dfs -put - /tmp/in/test.txt hdfs dfs -cat /tmp/in/test.txt
固然对于真正MR程序,抽取一小部分真实数据做为测试数据是最好的
配置本地debug运行,配置一个叫WordCount_local的Application,配置参数/tmp/in /tmp/out就是wordcount程序须要的参数。
修改成本地运行模式 重要!!!修改mapred-site.xml的mapreduce.framework.name为local(本来的值为yarn),即表示map和reduce都运行在本地的一个JVM中,方便调试。
运行debug模式 运行debug模式,进行断点调试测试
能够看到map和reduce的断点都能正常的进行断点调试,并能看到如今全部变量的值。这样就解决了文章开头目的的第一点“支持debug”,显然这个debug只能调试小数据量,用来调试程序的正确性。
运行run模式 运行完整的MR程序,这个其实跟debug模式结果一致,只是不进入断点,只测试一下结果数据是否正确。至此,咱们使用了远程集群上的数据(第四步配置为集群),配置,只有map和reduce是运行在本地的JVM里,这样排除了yarn的调度的话已经很是接近真正集群的运行情况了(提交到集群其实就是把map和reduce在集群的某台机器的JVM里去运行)。在这里若是运行是预期结果的话已经能够直接打包提交运行了,若是不关心单元测试,能够直接跳到第七步。
这里单元测试用到了mrunit,能够很简单的模拟测试map和reduce方法,当修改了map的逻辑以后能够用单元测试测试修改以后的程序的正确性。 先添加mrunit的依赖到pom.xml文件中
<dependency> <groupId>org.apache.mrunit</groupId> <artifactId>mrunit</artifactId> <version>1.1.0</version> <classifier>hadoop2</classifier> </dependency>
而后编写测试代码
package com.ottowu.test; import junit.framework.TestCase; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mrunit.mapreduce.MapDriver; import org.apache.hadoop.mrunit.mapreduce.ReduceDriver; import java.io.IOException; import java.util.Arrays; /** * Created by whl on 16-12-12. */ public class WordCountTest extends TestCase { //单元测试map public void testMap() throws IOException { Text value = new Text("this is test"); IntWritable one = new IntWritable(1); new MapDriver<Object, Text, Text, IntWritable>() .withMapper(new WordCount.TokenizerMapper()) .withInput(NullWritable.get(), value) //模拟输入 .withOutput(new Text("this"), one) //模拟输出,多行输出 .withOutput(new Text("is"), one) .withOutput(new Text("test"), one) .runTest(); //运行测试 } //单元测试reduce public void testReduce() throws IOException { IntWritable one = new IntWritable(1); IntWritable two = new IntWritable(2); new ReduceDriver<Text, IntWritable, Text, IntWritable>() .withReducer(new WordCount.IntSumReducer()) .withInput(new Text("this"), Arrays.asList(new IntWritable[]{one, one}))//模拟输入,多行 .withInput(new Text("is"), Arrays.asList(new IntWritable[]{one})) .withOutput(new Text("this"), two) //模拟输出,多行 .withOutput(new Text("is"), one) .runTest(); //运行测试 } }
运行测试,查看测试结果 运行成功,如图
若是运行失败,则会提示哪个期待结果是不正确的,如图
更多有趣的用法请自行查阅资料
执行mvn clean package
获得wordcount-1.0-SNAPSHOT.jar
运行命令 hadoop jar wordcount-1.0-SNAPSHOT.jar com.ottowu.test.WordCount /tmp/in /tmp/out
便可运行到远程集群上,接下来就是按照部署发布就行了,至此一次完整的开发结束。
一个很是有趣的尝试,能够直接在IDEA中提交任务,不过有点小瑕疵,留待之后补充吧。