前一篇介绍了eclipse搭建hadoop开发环境,这一篇通过代码来实现hdfs的上传和下载文件功能
上传文件
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestHdfsDemo {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("dfs.client.use.datanode.hostname", "true");
FileSystem fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "hadoop");
fs.copyFromLocalFile(new Path("D:/tokens.txt"), new Path("/a/"));
fs.close();
}
}
很简单的几行代码,这里需要注意配置的hdfs://master:9000中,master是在云服务器hosts文件中配置了域名和ip(配置内网ip,因为namenode和datanode在云服务器上是通过内网ip通信的)的对应,当然,master也是我的云服务器的主机名,是为了通过主机名与datanode通信。程序中,也可以明确指定ip地址,但是在hdfs-site.xml配置的是主机名
需要注意的是,conf.set("dfs.client.use.datanode.hostname", "true");这句话是表示按照主机名进行通信,否则无法上传文件和下载文件。
下载文件
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TestHdfsDemo {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("dfs.client.use.datanode.hostname", "true");
FileSystem fs = FileSystem.get(new URI("hdfs://193.112.188.113:9000"), conf, "hadoop");
fs.copyToLocalFile(new Path("/a/tokens.txt"), new Path("D:\\"));
// fs.copyFromLocalFile(new Path("D:/student.txt"), new Path("/a/"));
fs.close();
}
}
也非常简单。
注意项
之前一直很困惑configuration中设置hdfs,不清楚什么时候运行在搭建的hadoop集群上,后来看到一篇文章https://blog.csdn.net/qq_36411874/article/details/68936734
看到里面讲的,如果configuration不设置,则默认读写local目录运行,如果设置了hdfs就可以在hdfs上跑,如果引入hdfs-site.xml文件,也可以在hdfs上跑,通过hdfs.addResource引入。
如果要设置eclipse代码提交jar到集群,也要设置jobtracker,或者引入mapred-site.xml文件。