開發MapReduce程序


配置Configuration

一條configuration的名稱可以是任意字符串,值可以是任意數據類型。

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

在代碼中設置只對本次代碼運行有效,而在配置文件中設置則長久有效。

configuration-1.xml

<?xml version="1.0"?>
<configuration>
<property>
<name>color</name>
<value>yellow</value>
<description>Color</description>
</property>

<property>
<name>size</name>
<value>10</value>
<description>Size</description>
</property>

<property>
<name>weight</name>
<value>heavy</value>
<final>true</final>
<description>Weight</description>
</property>

<property>
<name>size-weight</name>
<value>${size},${weight}</value>
<description>Size and weight</description>
</property>
</configuration>

注意上面的weight屬性被標記為<final>true</final>,表示只讀,不可被更改或覆蓋。屬性中可以引用其他屬性,比如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<String, String> entry : conf) {
22             System.out.printf("%s=%s\n", 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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM