使用Java API之副本系数深度剖析
问题描述:
(1)使用Java API创建HDFS文件并写入内容的副本系数为3
(2)使用命令上传至HDFS中的文件副本数为1:举例[hadoop@hadoop000 software]$ hadoop fs -put jdk-8u91-linux-x64.tar.gz /
问题回答:
(1)使用Java方式传上去的就不是,因为我们新new了一个configuration,初始为空,程序会重新寻找Java程序中的hdfs-site.xml,这里副本数为3。(图1、图2显示)
(2)在/home/hadoop/app/hadoop-2.6.0-cdh5.15.1/etc/hadoop中的hdfs-site.xml,设置的副本系数为1。
1 <property> 2 <name>dfs.replication</name> 3 <value>1</value> 4 </property>
1 package com.imooc.bigdata.hadoop.hdfs; 2 3 import org.apache.hadoop.conf.Configuration; 4 import org.apache.hadoop.fs.FSDataOutputStream; 5 import org.apache.hadoop.fs.FileSystem; 6 import org.apache.hadoop.fs.Path; 7 import org.junit.After; 8 import org.junit.Before; 9 import org.junit.Test; 10 11 import java.net.URI; 12 13 /** 14 * 使用Java API操作HDFS文件系统 15 * 16 * 因为是放在test下面,所以最好使用单元测试的方式 17 * 在pom中引入的jUnit单元测试的方式 18 * 单元测试有两个方法:(1)在单元测试之前进行;(2)在单元测试之后进行 19 * 20 * 关键点: 21 * 1)创建Configuration 22 * 2)获取FileSystem 23 * 3)剩下的是HDFS API的操作 24 */ 25 26 public class HDFSApp { 27 28 public static final String HDFS_PATH = "hdfs://hadoop000:8020"; 29 //Configuration、FileSystem是每一个方法使用之前必须构建的 30 Configuration configuration = null; 31 FileSystem fileSystem = null; 32 33 @Before 34 public void setup() throws Exception{ 35 System.out.println("-----setup-----"); 36 configuration = new Configuration(); 37 configuration.set("dfs.replication", "1"); 38 /* 39 *构造一个访问指定HDFS系统的客户端对象 40 * 第一个参数:HDFS的URI 41 * 第二个参数:客户端指定的配置参数 42 * 第三个参数:客户的用户名 43 */ 44 fileSystem = FileSystem.get(new URI("hdfs://hadoop000:8020"), configuration, "hadoop"); 45 } 46 47 /* 48 * 创建HDFS文件并写入内容 49 */ 50 @Test 51 public void create()throws Exception{ 52 //FSDataOutputStream out = fileSystem.create(new Path("/hdfsApi/test/t.txt")); 53 FSDataOutputStream out = fileSystem.create(new Path("/hdfsApi/test/x.txt")); 54 out.writeUTF("hello JieQiong Replication 1"); 55 out.flush(); //立即将缓冲区的数据输出到接收方 56 out.close(); 57 } 58 59 @Test 60 public void testReplication(){ 61 //get(name, value) 62 System.out.println(configuration.get("dfs.replication")); 63 } 64 65 @After 66 public void tearDown(){ 67 System.out.println("-----tearDown-----"); 68 69 //置空 70 configuration = null; 71 fileSystem = null; 72 } 73 }