在之前的环节进行了HDFS 的搭建过程,接下来学习的内容是通过java代码实现对HDFS中文件进行操作。
这部分学习是为了之后在使用到的MapRedce对HDFS 文件进行操作。
在eclipse上编写java代码对HDFS上的文件进行操作首先要在项目中进行jar包导入。这里我们通过建立maven项目,方便jar包的导入。
需要注意的是在使用mave时导入本地不存在的jar包需要在有网的环境下进行
这里我们导入的jar包有以下几部分,在pom.xml中配置以下几个部分,会自动下载相关jar包
<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.8</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency> </dependencies>
建立HDFSClient类,进行操作其中:
write:写入操作,文件不存在时自动创建文件并写入数据
append:追加写入操作,写入文件需存在
read:读取文件操作
代码如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HDFSClient { public static void main(String[] args) { write(); //append(); read(); } //主加写入文件,必须是已有文件 public static void append(){ Configuration conf=new Configuration(); conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000"); conf.set("dfs.support.append", "true"); conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");//配置权限 conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");//配置权限 try { FileSystem fs=FileSystem.get(conf); FSDataOutputStream outpustream = fs.append(new Path("/hp/abc.txt"));//FSDataOutputStream文件输出流 //追加文件 outpustream.writeBytes("xxxxxx");//追加内容 outpustream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //写入文件 public static void write(){ Configuration conf=new Configuration(); conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000"); try { FileSystem fs=FileSystem.get(conf); FSDataOutputStream outputStream = fs.create(new Path("/hp/abc.txt")); outputStream.writeBytes("abcde"); outputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void read(){ // 配置对象 Configuration conf=new Configuration(); // 在配置对象中设置 namenode conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000"); try { // 创建 FileSystem FileSystem fs=FileSystem.get(conf) ; // 穿件输入流 FSDataInputStream inputstream = fs.open(new Path("/hp/abc.txt")); // 字节流转字符流 InputStreamReader isr=new InputStreamReader(inputstream); BufferedReader br=new BufferedReader(isr); String str=br.readLine(); while(str!=null){ System.out.println(str); str=br.readLine(); } br.close(); isr.close(); inputstream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
注:这里不能write append方法同时使用会报出错误,具体如何解决和原因我也没有弄清楚