Maven 依赖
<!-- 内部依赖了hadoop-common和hadoop-hdfs-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency>
注意: 版本最好和集群版本对应。上面的注释提到client中已经包含了common和hdfs.
配置
hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
参数优先级排序:(1)客户端代码中设置的值 >(2)ClassPath下的用户自定义配置文件 >(3)然后是服务器的默认配置
log4j.properties
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
上传、下载、删除、查看
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
Configuration config = new Configuration();
config.set("dfs.client.use.datanode.hostname", "true");
config.set("fs.defaultFS","hdfs://ecs-1111-0001:8020");
FileSystem fs = FileSystem.get(config);
//上传文件
fs.copyFromLocalFile(new Path("/Users/twx/Downloads/test_data.csv"),new Path("/user/twx/test_data.csv"));
//下载
fs.copyToLocalFile(false,new Path("/user/twx/test_data.csv"),
new Path("/Users/twx/Documents"),true);
//删除
fs.delete(new Path("/user/twx"), true);
//查看
FSDataInputStream instream = fs.open(new Path("/user/twx/test_data.csv"));
try {
IOUtils.copyBytes(instream,System.out,config);
} catch (IOException e) {
e.printStackTrace();
}finally {
IOUtils.closeStream(instream);
}
fs.close();
FA&Q
如果提示操作无权限,需要做如下设置:
运行时指定hadoop_user
外网无法访问hdfs
读数据的时候,namenode返回的是datanode的ip地址,此ip地址默认是集群内网的地址,我们java客户端肯定是访问不了的。所以需要加上这么一个配置
config.set("dfs.client.use.datanode.hostname", "true");
返回datanode的hostname。