分布式系统详解--框架(Hadoop--JAVA操作HDFS文件)
前面的文章介绍了怎么将整个集群系统搭建起来,并进行了有效的测试。为了解决登录一台服务器登录其他服务器需要多次输入密码的问题,提供了SSH免密码登录解决方案。还有一些hadoop的简单操作shell命令。今天我们就结合eclipse来用JAVA语言来读取和操作我们的hadoop文件系统中的文件。
一、POM文件
1.1 让我们来先看一下mvnrepository里面关于hadoop中的JAR包
1.2 需要引进的JAR包。
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>2.7.5</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>
二、代码
2.1 前提我先在hdfs dfs 系统根目录下建立一个test文件夹,将README.txt复制了进去。
2.2 查看文件
/** * */ package com.yuyi.hadoop; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; /** * @author mcb * * 2018年10月11日 下午5:49:28 */ public class ReadFileToConSoleTest { public static void main(String[] args) throws Exception { // 该路径为你想获取的文件的路径,就是想着读取那一个文件 String filePath = "/test/README.txt"; readFileToConSole(filePath); // readFileToLocal(filePath); localToHDFS(); } static FileSystem fs = null; static { Configuration conf =new Configuration(); try { fs = FileSystem.get(new URI("hdfs://192.168.71.233:8020"), conf, "root"); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (URISyntaxException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } // 文件读取 public static void readFileToConSole(String filePath) throws Exception { // 获取配置 Configuration conf = new Configuration(); // 配置 conf.set("fs.defaultFS", "hdfs://192.168.71.233:8020"); // 获取hdfs文件系统的操作对象 FileSystem fs = FileSystem.get(conf); // 具体对文件操作 FSDataInputStream fin = fs.open(new Path(filePath)); // 输入流读取,读出到何处,读出大小和是否关闭 IOUtils.copyBytes(fin, System.out, 4096, true); } // 文件下载到本地 public static void readFileToLocal(String filePath) throws Exception { FSDataInputStream fin = null; OutputStream out = null; try { // 获取配置 Configuration conf = new Configuration(); // 配置 // conf.set("fs.defaultFS", "hdfs://192.168.71.233:8020"); // 获取hdfs文件系统的操作对象 FileSystem fs = FileSystem.get(new URI("hdfs://192.168.71.233:8020"), conf, "root"); // 具体对文件操作 fin = fs.open(new Path(filePath)); out = new FileOutputStream(new File("F:\\hadoop\\testout\\a.txt")); // 输入流读取,读出到何处,读出大小和是否关闭 IOUtils.copyBytes(fin, out, 4096, true); } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } finally { fin.close(); out.close(); } } // 文件从本地上传到hdfs系统中 public static void localToHDFS() throws IllegalArgumentException, IOException { String localPath="F:\\hadoop\\testout"; String hdfsPath="/test/b.txt"; fs.copyFromLocalFile(new Path(localPath), new Path(hdfsPath)); System.out.println("传输完成~~"); } }