在非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>