Hadoop学习(3):利用Java操作HDFS
2018-01-09 16:24
537 查看
首先说一个命令:hdfs dfsadmin -report,可以在NameNode查看整个集群HDFS的状况:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/ff44c5532b6573652c5d6334c82ad02a)
hadoop默认会把数据保存到/tmp中,这个文件夹用来存放Linux的临时数据,系统重启的话,会不定时清除这个目录的内容,如果不修改hadoop的数据保存目录,hadoop可能会不正常。所以我们需要修改配置文件core-site.xml的hadoop.tmp.dir属性,其中我把hadoop装在/usr/local/haoop文件夹下边,core-site.xml位于安装目录的etc/hadoop目录下边。下边我们在core-site.xml文件中加入如下代码:
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
编辑完毕后,将NameNode重新格式化(输入hdfs namenode -format命令),最后再重启集群。
下边使用Java来访问HDFS,首先需要关闭权限检查,因为windows传文件到hdfs的话,不仅系统的管理员用户名可能不一样,也可能名字一样但是没有写权限,需要编辑/usr/local/hadoop/etc/hadoop/hdfs-site.xml中的一个属性,添加如下代码即可:
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
在Eclipse中新建一个名为HelloHadoop的Java Project,然后导入在Hadoop目录/share/hadoop文件夹中的一些包,其中包括common包及其lib文件夹下面的包,另外还有hdfs文件夹下的jar包:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/7b4e9b7976b7128bfd34b912cdc95b08)
接着新建一个名为HelloHDFS的类:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/d50bbd56526e1af3db9131a552203ad3)
现在将一个名为hello.txt的文件上传到HDFS中,其内容为:
hello beijing
hello shanghai
hello nanjing
hello Intel
然后运行如下命令hadoop fs -put ./hello.txt /将文件上传到HDFS的根目录并查看:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/075be27a0a5fa930de775082512e15a6)
下面尝试用Java将其读出来,首先尝试使用URL和IOUtils:
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
public class HelloHDFS {
public static void main(String[] args) throws Exception {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); //用来设定URL的协议,这样可以使用HDFS协议来访问
InputStream in = new URL("hdfs://192.168.56.100:9000/hello.txt").openStream();
IOUtils.copyBytes(in, System.out, 4096, true);
}
}
下面是读取的内容:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/da7d6e6462192969eb07f85864f2e498)
现在我们尝试用FileSystem类来对HDFS进行访问和操作,编写如下Java代码:
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;=
public class HelloHDFS {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.56.100:9000");
FileSystem fileSystem = FileSystem.get(conf);
boolean b;
//b = fileSystem.mkdirs(new Path("/zhe"));
//System.out.println(b);
//这里用来创建一个名为zhe的目录,b用来检测是否创建成功
b = fileSystem.exists(new Path("/zhe"));
System.out.println(b);
//这里用来检测是否存在一个名为zhe的目录
b = fileSystem.delete(new Path("/zhe"), true);
System.out.println(b);
//这里删除刚刚创建的文件夹zhe
b = fileSystem.exists(new Path("/zhe"));
System.out.println(b);
}
}
下边利用Java将本地文件写到HDFS中:
FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true);
FileInputStream in = new FileInputStream("D:/test.txt");
IOUtils.copyBytes(in, out, 4096, true);
可以输入hadoop fs -text /test.data来查看文件:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/00755f29faf91398e2f55e1443a8617f)
刚刚使用的是IOUtils的方式读取文件,现在使用较为传统的方法来读写,首先输入hadoop fs -rm /test.data删除原来保存在HDFS中的文件,接着再输入如下代码:
FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true);
FileInputStream in = new FileInputStream("D:/test.txt");
byte[] buf = new byte[4096];
int len = in.read(buf);
while(len != -1) {
out.write(buf, 0, len);
len = in.read(buf);
}
in.close();
out.close();
运行后查看结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/7def8441f093e892d6a52e50e92cfe61)
下边查看各个文件的信息,输入如下Java代码:
FileStatus[] statuses = fileSystem.listStatus(new Path("/"));
//查看/目录下边各个文件的状态
for(FileStatus status : statuses) {
System.out.println(status.getPath());
System.out.println(status.getPermission());
System.out.println(status.getReplication());
}
查看结果:
hadoop默认会把数据保存到/tmp中,这个文件夹用来存放Linux的临时数据,系统重启的话,会不定时清除这个目录的内容,如果不修改hadoop的数据保存目录,hadoop可能会不正常。所以我们需要修改配置文件core-site.xml的hadoop.tmp.dir属性,其中我把hadoop装在/usr/local/haoop文件夹下边,core-site.xml位于安装目录的etc/hadoop目录下边。下边我们在core-site.xml文件中加入如下代码:
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
编辑完毕后,将NameNode重新格式化(输入hdfs namenode -format命令),最后再重启集群。
下边使用Java来访问HDFS,首先需要关闭权限检查,因为windows传文件到hdfs的话,不仅系统的管理员用户名可能不一样,也可能名字一样但是没有写权限,需要编辑/usr/local/hadoop/etc/hadoop/hdfs-site.xml中的一个属性,添加如下代码即可:
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
在Eclipse中新建一个名为HelloHadoop的Java Project,然后导入在Hadoop目录/share/hadoop文件夹中的一些包,其中包括common包及其lib文件夹下面的包,另外还有hdfs文件夹下的jar包:
接着新建一个名为HelloHDFS的类:
现在将一个名为hello.txt的文件上传到HDFS中,其内容为:
hello beijing
hello shanghai
hello nanjing
hello Intel
然后运行如下命令hadoop fs -put ./hello.txt /将文件上传到HDFS的根目录并查看:
下面尝试用Java将其读出来,首先尝试使用URL和IOUtils:
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
public class HelloHDFS {
public static void main(String[] args) throws Exception {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); //用来设定URL的协议,这样可以使用HDFS协议来访问
InputStream in = new URL("hdfs://192.168.56.100:9000/hello.txt").openStream();
IOUtils.copyBytes(in, System.out, 4096, true);
}
}
下面是读取的内容:
现在我们尝试用FileSystem类来对HDFS进行访问和操作,编写如下Java代码:
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;=
public class HelloHDFS {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.56.100:9000");
FileSystem fileSystem = FileSystem.get(conf);
boolean b;
//b = fileSystem.mkdirs(new Path("/zhe"));
//System.out.println(b);
//这里用来创建一个名为zhe的目录,b用来检测是否创建成功
b = fileSystem.exists(new Path("/zhe"));
System.out.println(b);
//这里用来检测是否存在一个名为zhe的目录
b = fileSystem.delete(new Path("/zhe"), true);
System.out.println(b);
//这里删除刚刚创建的文件夹zhe
b = fileSystem.exists(new Path("/zhe"));
System.out.println(b);
}
}
下边利用Java将本地文件写到HDFS中:
FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true);
FileInputStream in = new FileInputStream("D:/test.txt");
IOUtils.copyBytes(in, out, 4096, true);
可以输入hadoop fs -text /test.data来查看文件:
刚刚使用的是IOUtils的方式读取文件,现在使用较为传统的方法来读写,首先输入hadoop fs -rm /test.data删除原来保存在HDFS中的文件,接着再输入如下代码:
FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true);
FileInputStream in = new FileInputStream("D:/test.txt");
byte[] buf = new byte[4096];
int len = in.read(buf);
while(len != -1) {
out.write(buf, 0, len);
len = in.read(buf);
}
in.close();
out.close();
运行后查看结果:
下边查看各个文件的信息,输入如下Java代码:
FileStatus[] statuses = fileSystem.listStatus(new Path("/"));
//查看/目录下边各个文件的状态
for(FileStatus status : statuses) {
System.out.println(status.getPath());
System.out.println(status.getPermission());
System.out.println(status.getReplication());
}
查看结果:
相关文章推荐
- hadoop学习:Java对HDFS的基本操作
- hadoop学习(五)----HDFS的java操作
- hadoop 学习(四)之java操作hdfs
- hadoop学习1 java操作HDFS
- java操作HDFS------Hadoop学习(3)
- Hadoop学习二(java api调用操作HDFS)
- 利用java操作Hadoop文件 /hdfs
- Hadoop学习笔记(3)-java操作hdfs的API接口
- _00002 Hadoop HDFS体系结构及shell、java操作方式
- Hadoop初学指南(4)--使用java操作HDFS
- hadoop java操作hdfs
- [hadoop学习笔记] 之 eclipse插件操作hdfs出现的权限问题
- hadoop1.1.2java操作hdfs
- Hadoop--学习笔记 在Eclipse中操作远程hdfs文件
- hadoop学习笔记3:shell下的hdfs操作
- Hadoop学习<二>--HDFS文件系统操作方式
- hadoop学习笔记1.使用shell和JAVA API操作HDFS
- Hadoop学习记录(3)|HDFS API 操作|RPC调用
- 利用java查看hdfs/hadoop系统的状态与配置
- hadoop学习笔记4:java实现hdfs -ls/-lsr