HDFS的Java API 操作
HDFS的JavaAPI操作
1.Windows 下 eclipse 远程连接 Hadoop 集群
(1)下载 eclipse 开发工具,解压并安装。
下载网址:https://www.eclipse.org/downloads/
(2)下载Hadoop Eclipse 插件 hadoop-eclipse-plugin-2.6.5.jar,将其放入 eclipse 安装目录 plugins 文件夹中。
(3)解压安装windows平台编译hadoop2.6.5安装包windows-hadoop-2.6.5.zip,解压路径最好不要带中文。
(4)在Windows系统中配置Hadoop环境变量。
HADOOP_HOME:windows-hadoop-2.6.5.zip的解压路径
PATH:%HADOOP_HOME%\bin;%HADOOP_HOME%\sbin;
(5)启动eclipse,在 eclipse 的左侧“Project Explorer”下会看到“DFS Locations”。
(6)“Window”->“Preferences” -> “Hadoop Map/Reduce”,配置hadoop2.6.5 解压的路径,配置完成,点击“Apply”->“OK”。
注:如果不行把步骤2安装目录改为dropins下的plugin,没有的话新建一个plugin放入
(7)“Window”->“Show View”->“Other”-> “Map/Reduce Locations”-> “OK”。
(8)在 eclipse 的下端出现一个显示框,点击图中蓝色的小象图标。
(9)根据对话框的提示修改相应的信息,如图所示。
(10)修改完成,点击“Finish”。在 eclipse 的下端会出现如图信息。
(11)在 eclipse 的左侧“Project Explorer”的“DFS Locations”下会看到如图信息。
2.搭建开发环境(建立普通 Java 工程,加入操作 HDFS 的 jar 包)
先创建一个工程:
(1) 在项目名称上右键单击“Build Path”,然后单击右边出现的“Configure Build Path”,选择“Libraries”,单击“Add Library…”,如图所示:
(2) 选择“User Library”->“Next”,如图所示:
(3) 之后单击“User Libraries…”,如图所示:
(4) 点击“New…”,如图所示:
(5) 在弹出的对话框中输入 User library name,这里我输入的是“HDFSLib”,之后点击“OK”,如图所示
:
(6) 选择“HDFSLib”,点击“Add External JARs…”,如图所示:
(7) 将“hadoop-2.6.5.tar.gz”解压到一个文件夹下,我这里解压的目录是D:\software\hadoop-2.6.5。在弹出的对话框中选择D:\software\hadoop-2.6.5\share\hadoop\common下的3个jar包和lib下所有的jar包,如图所示:
(8) 再继续添加D:\software\hadoop-2.6.5\share\hadoop\hdfs下的3个jar包和lib下所有的jar包,如图所示:
(9) 添加完毕之后,点击“OK”,再点击“Finish”,再点击“OK” ,看到 eclipse 左侧“Project Explorer”项目名称下出现我们添加的依赖库,如图所示:
3.FileSystem 实例获取讲解
1.引入
在Java中操作HDFS,首先要获取一个客户端实例:
Configuration conf=new Configuration();
FileSystem fs=FileSystem.get(conf);
get 方法是从何处判断具体实例化哪种客户端类呢?
从 conf 中的一个参数 fs.defaultFS 的配置值判断。
2.获取fs对象
第一种:通过配置获取fs对象
代码中没有设置“fs.defaultFS”参数;工程 classpath 下没有相应的配置文件
读取hadoop jar包core-default.xml的默认值 file:///,获取的是本地文件系统的实例
配置信息:
第二种:直接获取fs对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI(“hdfs://hadoop01:9000”), conf, “shiny”);
不需要配置“fs.defaultFS”参数,直接传入URI和用户身份
4.利用Java API操作HDFS文件
配置信息:
Configuration conf = null;
FileSystem fs = null;
@Before
public void setup() throws IOException, InterruptedException, URISyntaxException {
//获取配置信息类
conf = new Configuration();
//获取fs对象
fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "theone");
}
创建目录:
fs.mkfirs(Path f)
示例: boolean mkdirs=fs.mkdirs(new Path("/1213"));
System.out.println(mkdirs);
上传文件:
src:源路径;dst:目标路径
fs.copyFromLocalFile(path src, path dst) //默认不删除本地源文件,覆盖HDFS同名文件
示例:Path src=new Path("D:/software/hadoop-2.6.1/README.txt");
Path dst=new Path("/");
fs.copyFromLocalFile(src, dst);
下载文件:
fs.copyTpLocalFile(Path src,Path dst)
示例:
Path src=new Path("/hi.txt");
Path dst=new Path("D:/");
fs.copyToLocalFile(src, dst);
重命名文件或者文件夹
//重命名文件
fs.rename(new Path("/hi.txt"), new Path("/hello.txt"));
//重命名文件夹
fs.rename(new Path("/123"), new Path("/456"));
删除文件或者文件夹
fs.delete(Path f, boolean recursive);
recursive:是否递归,若是文件或空文件夹则为false,非空文件夹则为true
//删除文件夹
fs.delete(new Path("/456"), true);
查看指定路径中文件状态和块信息
文件信息
文件路径:.getPath();
文件名称:.getPath().getName();
文件父目录:.getPath().getParent();
文件拥有者:.getOwner();
文件所属组:.getGroup();
文件块的大小:.getBlockSize();
文件长度:.getLen();
文件权限:.getPermission();
文件副本个数:.getReplication();
块信息
//数据块信息
BlockLocation[] blockLocations = next.getBlockLocations();
//遍历数组
for (BlockLocation block : blockLocations) {
System.out.println("数据块的大小:" + block.getLength() + "\t偏移量" + block.getOffset());
//获取数据块所在的DataNode信息
String[] hosts = block.getHosts();
System.out.println("所在DataNode信息");
for (String datanode : hosts){
System.out.println(datanode + "");
}
查看指定路径中文件/目录的状态
fs.listStatus(Path f);
是否是目录:.isDirectory();