首页 > 开发MapReduce程序

开发MapReduce程序

配置Configuration

一条configuration的名称可以是任意字符串,值可以是任意数据类型。

conf.set("name", "orisun");
conf.setInt("age",24);

在代码中设置只对本次代码运行有效,而在配置文件中设置则长久有效。

configuration-1.xml

xml version="1.0"?>
<configuration>
<property>
<name>colorname>
<value>yellowvalue>
<description>Colordescription>
property><property>
<name>sizename>
<value>10value>
<description>Sizedescription>
property><property>
<name>weightname>
<value>heavyvalue>
<final>truefinal>
<description>Weightdescription>
property><property>
<name>size-weightname>
<value>${size},${weight}value>
<description>Size and weightdescription>
property>
configuration>

注意上面的weight属性被标记为true,表示只读,不可被更改或覆盖。属性中可以引用其他属性,比如size-weight的属性值就是${size},${weight}

assertThat(conf.get("size-weight"), is("14,heavy"));

属性还可以以这种代码形式进行设置:

System.setProperty("length", "2");

也可以通过指定JVM参数的形式来设定:-D property=value 

在代码中添加配置文件后就可以获取这些属性值了。hadoop使用的默认配置文件是core-site.xml。

Configuration conf = new Configuration();
conf.addResource("configuration-1.xml");
String color=conf.get("color");
int size=conf.getInt("size", 0);

当然你可不断调用conf.addResource()添加任意多个配置文件,如果出现属性名称相同,后来的会覆盖先前的(只读属性除外)。

也可以通过hadoop命令选项指定configuration文件。

% hadoop fs -conf conf/hadoop-localhost.xml -ls .

下面的ConfigurationPrinter类负责打印配置文件中的每一条属性的健值对。

 1 package basic;
 2 
 3 import java.util.Map.Entry;
 4 
 5 import org.apache.hadoop.conf.Configuration;
 6 import org.apache.hadoop.conf.Configured;
 7 import org.apache.hadoop.util.Tool;
 8 import org.apache.hadoop.util.ToolRunner;
 9 
10 public class ConfigurationPrinter extends Configured implements Tool {
11     static {
12         Configuration.addDefaultResource("hdfs-default.xml");
13         Configuration.addDefaultResource("hdfs-site.xml");
14         Configuration.addDefaultResource("mapred-default.xml");
15         Configuration.addDefaultResource("mapred-site.xml");
16     }
17 
18     @Override
19     public int run(String[] args) throws Exception {
20         Configuration conf = getConf();
21         for (Entry entry : conf) {
22             System.out.printf("%s=%s
", entry.getKey(), entry.getValue());
23         }
24         return 0;
25     }
26 
27     public static void main(String[] args) throws Exception {
28         int exitCode = ToolRunner.run(new ConfigurationPrinter(), args);
29         System.exit(exitCode);
30     }
31 
32 }

有几个跟Configuration相关的类需要解释一下。

public interface Configurable{Configuration getConf();void setConf(Configuration conf);
}
public class Configured implements Configurable{public Configured(Configuration conf);
}

Tool接口负责处理通用命令行选项,这里的选项args是由ToolRuuner.run(Tool,String[])带进来的。

public interface Tool extends Configurable{int run(String[] args);
}

ToolRunner用来运行实现了Tool接口的类。它和GenericOptionParser一起工作来解释命令行选项并修改Tool的Configuration。

public class ToolRunner{static void  printGenericCommandUsage(PrintStream out) static int    run(Configuration conf, Tool tool, String[] args) static int    run(Tool tool, String[] args) 
}

事实上负责解释hadoop命令行选项的类正是GenericOptionParser。

GenericOptionParser和ToolRunner的一些选项:

-D property=value

-conf filename

-fs uri    等价于 -D fs.default.name=uri

-jt host:port    指定jobtracker工作的主机及端口,等价于-D mapred.job.tracker=host:port

-files file1,file2,……    把文件得到到所的任务节点上去,使之可以从本地获取

-archives archive1,archive2,……  把archive文件得到到所的任务节点上去,使之可以像本地文件一样unarchive和读取

-libjars jar1,jar2,……    放到所有任务节点的classpath中,使MapReduce程序运行时可以获得到它们

 远程调试

首先把属性keep.failed.task.files设为true,这样tasktracker就会保留足够的信息以便可以在同一个inputsplit上再次运行。然后你需要运行一个IsolationRunner。

当用hadoop解决复杂的问题时,我们更倾向于设计更多的map-reduce而不是把单个map或reduce设计得更加复杂。事实上对于复杂的问题,我们可以使用比MapReduce更高级的语言来解决:Pig,Hive,Cascading。

更多相关:

  • Attached Property是Dependency Property的一种特殊形式,它是用DependencyProperty.RegisterAttached方法注册的,可以被有效地添加到任何继承自DependencyObject的对象中,所以被称为Attached Property。一开始,这可能听起来很奇怪,但这种机制在W...

  •  翻页器

  •     在src/main/resources/springmvc-servlet.xml中加入

  • 本篇仅仅是一个记录 MergeOperator 的使用方式。 Rocksdb 使用MergeOperator 来代替Update 场景中的读改写操作,即用户的一个Update 操作需要调用rocksdb的 Get + Put 接口才能完成。 而这种情况下会引入一些额外的读写放大,对于支持SQL这种update 频繁的场景来说实在是不划...

  • 看了很多人写的好几个去重方法,我在这里精简组合下,适用于已排序与未排序的数组。 废话不多说,上代码。 数组去重