1.缺少jar包依赖
maven依赖需要引入hadoop-common/hadoop-auth/hadoop-hdfs等,我在开发过程中还遇到以上三个jar包使用google的jar包依赖缺少/版本不对的问题,依次引入就好。
2.windows环境下使用开发工具进行远程连接测试,报could not locate executable null\bin\winutils.exe in hadoop binaries
这是本地没有安装hadoop调试环境工具,
(1)下载工具
hadoop2.2版本可以在这里下载https://github.com/srccodes/hadoop-common-2.2.0-bin
hadoop2.6版本可以在这里下载https://github.com/amihalik/hadoop-common-2.6.0-bin
(2)配置环境变量
①增加系统变量HADOOP_HOME,值是下载的zip包解压的目录,我这里解压后将其重命名为hadoop-common-2.6.0
②在系统变量path里增加%HADOOP_HOME%\bin
3.connection refused连接被拒
这个问题的原因有很多,暂且说一下我遇到的,刚开始没有搞清楚java api是通过哪种方式与hdfs建立连接,从hdfs-site.xml配置文件中可以看到,提供了两种连接方式,一种RPC、还有一种HTTP,后者是可以通过界面对hdfs进行查看。java api使用的是RPC通信。
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>ydbmaster:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>myslave1:8020</value>
</property>
一般namenode会配置两个节点nn1和nn2,若使用域名,则需要在服务器端的hosts文件中配置,例如10.0.9.39 ydbmaster,此处配置成域名,无需加前缀hdfs://
URI uri = null;
Configuration conf = null;
FileSystem fs = null;
try {
uri = new URI("hdfs://10.0.9.39:8020");
conf = new Configuration();
fs = FileSystem.get(uri,conf);
//TODO
}catch (Exception e){
//TODO
}