在非HA模式下,只須如下代碼就可以輕松實現上傳文件,標紅的這句是關鍵
public class CopyToHDFS {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://master:9000");
FileSystem fs = FileSystem.get(conf);
fs.copyFromLocalFile(new Path("/home/lance/log.txt"), new Path("/log"));
}
}
但是當是HA模式下,就不能簡單地把hdfs://master:9000改為hdfs://mycluster,單純這樣的話系統會報如下錯誤:
Exception in thread "main" java.lang.IllegalArgumentException: java.net.UnknownHostException: mycluster
主要還是工程缺少必要的Hadoop屬性配置,配置屬性方式一般有兩種:一種是直接把hadoop的配置文件放到工程目錄下,在配置文件里面設置屬性;一種是如上所示,用set方法設置。
以下就是所需的關鍵屬性,屬性值得和自己集群的配置的屬性值一樣
core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> </configuration>
hdfs-site.xml
<configuration> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1, nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>192.168.11.2:9000</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>192.168.11.7:9000</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> </configuration>