使用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 }

 

posted @ 2021-07-02 15:08  酱汁怪兽  阅读(115)  评论(0编辑  收藏  举报