开发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。
總結
以上是生活随笔為你收集整理的开发MapReduce程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站建设中关于eclipse启动参数的优
- 下一篇: Lisp 的单行注释和多行注释