Maven 依赖

  1. <!-- 内部依赖了hadoop-common和hadoop-hdfs-->
  2. <dependency>
  3. <groupId>org.apache.hadoop</groupId>
  4. <artifactId>hadoop-client</artifactId>
  5. <version>2.6.0</version>
  6. </dependency>

注意: 版本最好和集群版本对应。上面的注释提到client中已经包含了common和hdfs.

image.png

配置

image.png

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

  1. 如果提示操作无权限,需要做如下设置:

    运行时指定hadoop_userimage.png

  2. 外网无法访问hdfs

    读数据的时候,namenode返回的是datanode的ip地址,此ip地址默认是集群内网的地址,我们java客户端肯定是访问不了的。所以需要加上这么一个配置 config.set("dfs.client.use.datanode.hostname", "true"); 返回datanode的hostname。