您的位置:首页 > 编程语言 > Java开发

Hadoop学习(3):利用Java操作HDFS

2018-01-09 16:24 537 查看
  首先说一个命令:hdfs dfsadmin -report,可以在NameNode查看整个集群HDFS的状况:



  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());
}
  查看结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: