在hadoop中使用javaAPI操作hdfs

一、大数据概况

(1)大数据的特征(4V)

Volume(大数据量):90% 的数据是过去两年产生
Velocity(速度快):数据增长速度快,时效性高
Variety(多样化):数据种类和来源多样化
结构化数据(表)、半结构化数据(json xml)、非结构化数据(视频 音频 日志文件)
Value(价值密度低):需挖掘获取数据价值

(2)分布式计算:将大数据拆分成小数据进行计算

在这里插入图片描述

二、Hadoop生态系统

在这里插入图片描述
**Zookeeper:**是一个分布式应用程序协调服务
解决分布式集群中应用系统的一致性问题
提供的功能
配置管理、命名服务、分布式同步、队列管理、集群管理等

hadoop是一个开源分布式系统架构
主要架构为:HDFS 分布式文件存储系统 解决大数据存储 但是其不适合低延迟的数据访问,不适合小文件的存取(解决方法:合并小文件 或者使用hbase)不适合并发写入。文件的随机修改。

HDFS中的角色:

(1)客户端
(2)NameNode 元数据节点
其是一个 管理者 一个集群中只有一个活动的namenode 主要负责管理文件系统命名空间和控制用户的访问
主要功能:提供名称查询功能 保存元数据信息(文件包含哪个块,块包含在哪个块中等)
(3)DataNode数据节点
是文件系统中真正存储数据的地方 一个集群中可以有多个datanode,客户端向namenode发起存储请求,然后去到对应的DataNode上操作数据块
(4)Secondary NameNode (SNN):从元数据节点
合并NameNode的edit logs到fsimage文件中
辅助namenode将内存中元数据信息持久化

在这里插入图片描述
HDFS副本机制:
数据块:block
HDFS最基本的存储单元
默认块大小:128M(2.x)
副本机制
作用:避免数据丢失
副本数默认为3
存放机制:
一个在本地机架节点
一个在同一个机架不同节点
一个在不同机架的节点
向hdfs中写入数据:
在这里插入图片描述
客户端发送一个请求上传第一个数据块请求给namenode ,namenode收到请求后判断目标路径是否存在 不存在抛异常 存在返回一个存储数据的DataNode列表给客户端(空闲的节点DN1,DN2,DN3),客户端根据获得列表,建立pi’peline,根据路由计算出离得最近的节点 把数据写到这个节点中 ,同时Datanode像这个节点的内存中写,同时传输给下一个datanode进行备份,如图所示,都完成后,回应客户端一个写入成功的响应,完成一个数据块的写操作。其他数据块重复以上步骤
注意:在向datanode中写入数据的时候,一边往内存中写,一边传输给下一个datanode
传输的过程中是以packet形式传输的,一般大小为64kb
而下图中的filesystem 和FSDataOutputStream是hdfs的API 为外界进行写服务的
java代码如下:

public class test{
	public static void writeToHdfs(String hdfsFile,String hdfsUrl,String fineName){
	Configuration conf=new Configuration();
	conf.set("fs.defaultFS",hdfsUrl)
	FileSystem fs=FileSystem.get(conf);
	if (fs.exits(new Path(hdfsFile))){
		FSDataOutputStream fsdos=fs.creat(new Path("hdfsFile"));
		FileInputStream fis=new FileInputStream(fileName);
		byte[] bytes=new byte[2048];
		//首次读
		int count=fis.read(bytes,0,2048);
		while(count>0){
			fsdos.write(bytes.0,2048);
			count=fis.read(bytes,0,2048);
		}
		fis.close();
		fsdos.close();
		fs.close();
	}

	}
	public static void main(String[] args) {
        writeToHdfs(args[0].args[1],args[3]);
    }
}

在hdfs中运行此java代码的语句为:

hadoop jar /opt/hadoop/share/hdfstest.jar cn.kgc.hdfs.test /b.txt hdfs://hadoop1:9000 /etc/profile

/opt/hadoop/share/hdfstest.jar
//在hdfs中存放打的上面的java工程的jar包 怎么打jar包,请看作者的另一篇博客
cn.kgc.hdfs.test
//java工程中的此代码的文件路径
/b.txt
//写到hdfs中的b.txt下
hdfs://hadoop1:9000
//连接hdfs的地址
/etc/profile
//本地路径
在这里插入图片描述

从hdfs中读文件
在这里插入图片描述
客户端发送一个请求下载第一个数据块请求给namenode ,namenode收到请求后判断目标路径是否存在 不存在抛异常 存在返回一个存储数据的DataNode列表给客户端(存有数据的节点DN1,DN2,DN3),客户端根据获得列表,建立pi’peline,根据路由计算出离得最近的节点 下载第一个数据块,完成后,回应客户端一个下载成功的响应,完成一个数据块的读操作。其他数据块重复以上步骤。client对获得数据块进行拼接,获得完整的文件数据。也是通过packet的形式进行传输的。

而下图中的filesystem 和FSDatainputStream是hdfs的API 为外界进行读服务的
java代码如下:

public class testto {
    public static void readTohdfs(String hdfsfile ,String hdfsUrl,String filename) throws IOException {
        Configuration cfg=new Configuration();
        cfg.set("fs.defaultFS",hdfsUrl);
        FileSystem fs=FileSystem.get(cfg);
        if (fs.exists(new Path(hdfsfile))) {
            FileOutputStream fis=new FileOutputStream(filename);
            FSDataInputStream fsis = fs.open(new Path(hdfsfile));
            byte[] bytes=new byte[2048];
            //首次读
            int count=fsis.read(bytes,0,2048);
            while (count>0){
                fis.write(bytes,0,2048);
                count=fsis.read(bytes,0,2048);
            }
            fsis.close();
            fis.close();
            fs.close();
        }
    }
    public static void main(String[] args) {
        readToHdfs(args[0].args[1],args[3]);
    }
}

在hdfs中运行此java代码的语句为:
hadoop jar /opt/hadoop/share/testto.jar cn.kgc.test.testto /b.txt hdfs://hadoop1:9000 /data/z.txt
代表的含义如上

在这里插入图片描述
通过javaAPI操作hdfs的其他实例:

public class hdfsClient {
    //这是一种本地没有hadoop的情况下。创建hdfs的对象
    @Test
    public void testMkdir() throws URISyntaxException, IOException, InterruptedException {
        //创建配置
        Configuration conf =new Configuration();
        //获取文件系统
        //根据远程的NN节点,获取配置信息,创建HDFS对象 用户名(普通用户 需要先给做操作的文件附读写权限)
        FileSystem fs=FileSystem.get(new URI("hdfs://192.168.255.105:9000"),conf,"root");
        //调用API操作
        fs.mkdirs(new Path("/hdfs"));
        //关闭文件
        fs.close();
    }
    //上传一个文件
    @Test
    public void testCopyFromLocal() throws URISyntaxException, IOException, InterruptedException {
        //创建配置
        Configuration conf =new Configuration();
        //获取文件系统
        FileSystem fs=FileSystem.get(new URI("hdfs://192.168.255.105:9000"),conf,"root");
       fs.copyFromLocalFile(new Path("C:\\Users\\晴儿和小乐子\\Desktop\\mobile.txt"),new Path("/hdfs"));
      fs.close();
    }
    //下载文件
    @Test
    public void testcopyTolacal() throws URISyntaxException, IOException, InterruptedException {
        //创建配置
        Configuration conf =new Configuration();
        //获取文件系统
        FileSystem fs = new Path("hdfs://192.168.255.105:9000").getFileSystem(conf);
        //FileSystem fs=FileSystem.get(new URI("hdfs://192.168.255.105:9000"),conf,"root");
        fs.copyToLocalFile(false,new Path("/hdfs/mobile.txt"),new Path("I:/"),true);
        fs.close();
    }
    //删除文件
    @Test
    public void testDelete() throws URISyntaxException, IOException, InterruptedException {
        //创建配置
        Configuration conf =new Configuration();
        //获取文件系统
        FileSystem fs=FileSystem.get(new URI("hdfs://192.168.255.105:9000"),conf,"root");
        //b代表是否递归删除 true是
        fs.delete(new Path("/hdfs"),true);
        fs.close();
    }

Mapreduce:分布式计算框架 解决大数据的计算
YARN:分布式资源管理系统
特点:
高扩展性,可伸缩
高可靠性
多副本机制,容错高
低成本
无共享架构
灵活,可存储任意类型数据
开源,社区活跃

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值