hdfs的API操作(写入数据到集群),hdfs写入数据原理

1.引包
1.传统引包
hadoop.tar.gz解压—》share–》搜索.jar,—>搜索source–》剪切到新建文件夹source—》收缩test—》剪切到新建文件夹test—》lib中还剩下144个jar包
打开idea–》file–》projectStructure—》libraries–》引包
2.maven
在pom文件中修改依赖。


mysql
mysql-connector-java
5.1.47



org.apache.hadoop
hadoop-common
h a d o o p . v e r s i o n < / v e r s i o n > < / d e p e n d e n c y > < ! − − h t t p s : / / m v n r e p o s i t o r y . c o m / a r t i f a c t / o r g . a p a c h e . h a d o o p / h a d o o p − h d f s − − > < d e p e n d e n c y > < g r o u p I d > o r g . a p a c h e . h a d o o p < / g r o u p I d > < a r t i f a c t I d > h a d o o p − h d f s < / a r t i f a c t I d > < v e r s i o n > {hadoop.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version> hadoop.version</version></dependency><!https://mvnrepository.com/artifact/org.apache.hadoop/hadoophdfs><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoophdfs</artifactId><version>{hadoop.version}



org.apache.hadoop
hadoop-client
${hadoop.version}


代码:

Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        System.out.println(fs);
        fs.close();

关于hdfs里的相关配置信息的3种方式。
1.core-default.xml(位置是在引的包中的Maven:org.apache.hadoop:hadoop-common:2.7.6中)
2.core-site.xml:将hadoop中的配置文件core-site.xml复制粘贴到resource目录下。
3.conf.set(“fs.defaultFS”,“hdfs://node101:9000”);
在代码执行过程中,是先看是否代码中有3,其次,2,再其次是1.

本地文件向hdfs中传输文件栗子:

import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class HDFSAPI {
    @Test
    public void testHdfsConn() throws  Exception {
        Configuration conf = new Configuration();
        conf.set("fs.defualtFS","hdfs://192.168.44.9:9000");
        FileSystem fs = FileSystem.get(conf);
        fs.copyFromLocalFile(new Path("file:///D:/hh.txt"),new Path("hdfs://node101:9000/animal/tiger"));
        fs.close();
    }
}

3.权限问题:
当window用户向hdfs传输文件时,会报错,权限不够。那么就要在本机设置一下,使本机的用户伪装成hdfs中的用户。
方法1.在代码中设置

  Configuration conf = new Configuration();
        conf.set("fs.defualtFS","hdfs://192.168.44.9:9000");
        **FileSystem fs = FileSystem.get(new URI("hdfs://node101:9000"),conf
        ,"user");**
        fs.copyFromLocalFile(new Path("file:///D:/hh.txt"),new Path("hdfs://node101:9000/animal/tiger"));

**第二种方法:**点击idea上方,Run–》Edit Configurations–》HDFSAPI.testHdfsConn–》VMo ptions
将VM options的值改为-DHADOOP_USER_NAME=user(等于你的用户名 )
第三中方法:(不提倡)
改变hdfs中文件的权限:

hdfs dfs -chmod -R 777 /animal

之后就能用本机的用户向hdfs上传文件了。

hdfs上传文件的(写入数据的原理):
1.客户端向hdfs namenode发出请求,namenode接受到请求之后,返回客户端响应建立连接
2.计算客户端传送文件的大小,计算出block块数量,并且向namenode发送存储的第一块的请求,namenode会响应客户端,并且告知客户端数据存储的哪些datanode节点
3.客户端向其中一个datanode发送来连接请求,datanode会向其中的内部其他的datanode节点发送请求。之后在响应客户端建立连接(为什么客户端不直接向各个datanode发送请求,而是某个datanode自己向内部发送请求?)(RPC高速传输协议,在局域网内采用RPC进行连接传输,速度非常的快。)传输完毕之后,datanode会告知客户端传输完毕。
4.客户端向namenode发送请求,告知传输完毕,namenode记录元数据。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值