(防坑笔记)hadoop3.0 (二) HDFS结构及对接操作

防坑留言:

   不但要能简单写出伪分布式,还要对其配置文件为什么这么写有一定理解才容易找出bug,分析原因,解决问题


其实详细api官网是提供的,我这里简单介绍一下我用的

HDFS结构

NameNode:名字节点

       1、 整个文件系统的管理节点。文件系统的文件目录树。

       2、接收用户的操作请求

       包括 hdfs-site.xml  文件

        dfs.name.dir  HDFS的URI,就是我们操作文件的地址  ,当然官方文档新属性名是 dfs.namenode.name.dir ,但是目前版本依旧能用

         包含内容:

                    ①  fsimage(元数据):元数据镜像文件。存储某一时段NameNode内存元数据信息。

                    ② fstime:保存最近一次checkpoint的时间

                    ③ edits:操作日志文件。


DataNode:数据节点
        文件系统的工作节点,他们根据客户端或namenode的调度存储检索数据,且同时定期向namenoede发送他们所储存块(block)的列表

          hdfs-site.xml

         

          ① 文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.

可以在配置里指定dfs.block.size属性的大小.    当然官方新属性名是dfs.blocksize

         ②不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间

         ③Replication。多复本。默认是三个,如果为1则不备份。dfs.replication属性。



Secondary NameNode

作用:

     ①镜像备份 

              备份fsimage(元数据) 即在 元数据发送检查点时写入文件;

     ②日志与镜像和定期合并

              将Namenode中edits(日志)和fsimage (元数据)合并,更新快照点,防止宕机造成的巨大伤害

(如果Namenode节点故障,namenode下次启动的时候,会把fsimage(元数据)加载到内存中,应用edit log,edit log往往很大,导致操作往往很耗时。)


注意: 以上2个过程是同时进行而不是分开的,也称为checkpoint

    

      checkpoint的时机

        ①fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。  当然官方新属性名是dfs.namenode.checkpoint.period

        fs.checkpoint.size规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。(鄙人没有试过)


常用Shell命令

   

格式:hdfs  dfs  【选项】【参数】
常用的选项如下:
-help [cmd]	//显示命令的帮助信息
-ls(r) <path>	//显示当前目录下所有文件
-du(s) <path>	//显示目录中所有文件大小
-count[-q] <path>	//显示目录中文件数量
-mv <src> <dst>	//移动多个文件到目标目录
-cp <src> <dst>	//复制多个文件到目标目录
-rm(r)		//删除文件(夹)
-put <localsrc> <dst>	//本地文件复制到hdfs
-copyFromLocal	//同put
-moveFromLocal	//从本地文件移动到hdfs
-get [-ignoreCrc] <src> <localdst>	//复制文件到本地,可以忽略crc校验
-getmerge <src> <localdst>		//将源目录中的所有文件排序合并到一个文件中
-cat <src>	//在终端显示文件内容
-text <src>	//在终端显示文件内容
-copyToLocal [-ignoreCrc] <src> <localdst>	//复制到本地
-moveToLocal <src> <localdst>
-mkdir <path>	//创建文件夹
-touchz <path>	//创建一个空文件

java接口及常用api

     从

    /usr/hadoop/hadoop-3.0.0/share/hadoop  为根目录 (自己的hadoop目录)

必须步骤

   ①获取 common 下的 jar包,及common下面lib的所有jar包

   ②获取 hdfs  下的jar包,及hdfs下lib的所有jar包

   ③$HADOOP_HOME/share/etc/hadoop/下的core-site.xml 和 hdfs-site.xml 导入工程的src下


1、上/下载文件及删除

      基础配置

private  static final String hdfs = "hdfs://192.168.88.129:9000";
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();
		conf.set("fs.name.default", hdfs);//其实这个有和没有是一样的,如果不设置,就用xml配置文件的属性
		conf.set("fs.hdfs.impl",org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
		System.setProperty("hadoop.home.dir", "E:/lg_file/leaning/hadoop-3.0.0-alpha4");//先标记这个为onePoint
               //获得filesystem对象
              // FileSystem fs = FileSystem.get(new URI(hdfs),conf,"root");  //触发权限问题时用这个,root是用户名
                 FileSystem fs = FileSystem.get(conf);

onePoint缺失引发的异常,参数二是本地hadoop的文件地址,同时需要下载一个winutils.exe,供给window端调用,否则会出现FileNotFountException


-----------------------------------------下载------------------------------------------ 

  模拟底层(简单翻源码装逼日常)

	/**
	* @Title: downLoadMethod
	* @Description: 底层调用下载方法
	* @param fs   filesystem对象
	* @param path   文件相对路径
	* @throws IOException
	* @throws FileNotFoundException    设定文件 
	* @return void    返回类型 
	* @throws
	*/
	@SuppressWarnings("unused")
	private static void downLoadMethod(FileSystem fs, String path) throws IOException, FileNotFoundException {
		//打开输入流
		FSDataInputStream in = fs.open(new Path(hdfs+path));
		//设置输出流
		FileOutputStream out = new FileOutputStream("E:/lg_workspace/hadoopDemo/root/"+path);
		//调用IOUtils的copy方法,复制文件
		IOUtils.copy(in, out);
	}

   调用api

fs.copyToLocalFile(new Path(hdfs+"/linge.txt"),new Path("E:/lg_workspace/hadoopDemo/root/linge.txt"));


------------------------------------上传---------------------------------------

正常操作模拟

	/**
	* @Title: upLoadMethod
	* @Description: 底层调用上传方法
	* @param fs   filesystem对象
	* @param path   文件相对路径
	* @throws IOException
	* @throws FileNotFoundException    设定文件 
	* @return void    返回类型 
	* @throws
	*/
	@SuppressWarnings("unused")
	private static void upLoadMethod(FileSystem fs, String path) throws IOException, FileNotFoundException {
		//打开输入流
		FileInputStream in = new FileInputStream("E:/lg_workspace/hadoopDemo/root/"+path);
		//设置输出流
		FSDataOutputStream  out = fs.create(new Path(hdfs+path));
		//调用IOUtils的copy方法,复制文件
		IOUtils.copy(in, out);
	}

api

fs.copyFromLocalFile(new Path("E:/lg_workspace/hadoopDemo/root/ha.txt"), new Path(hdfs+"/linge.txt"));


--------------------------创建文件夹-----------------

fs.mkdirs(new Path("/linge"));


---------------------------删除---------------------------------------------

fs.delete(new Path("/linge"),true); //参数2决定是否递归删除

----------------------------显示目录------------------------------------

FileSystem fs = FileSystem.get(new URI(hdfs),conf,"root");
		RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
		while (listFiles.hasNext()) {
			System.out.println(listFiles.next().toString());
		}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值