设为首页 加入收藏

TOP

(防坑笔记)hadoop3.0 (二) HDFS结构及对接操作
2019-01-06 12:19:55 】 浏览:77
Tags:笔记 hadoop3.0 HDFS 结构 对接 操作
版权声明:如有出错,请指出 https://blog.csdn.net/CoffeeAndIce/article/details/78902239

防坑留言:

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


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

HDFS结构

NameNode:名字节点

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

2、接收用户的操作请求

包括 hdfs-site.xml 文件

dfs.name.dirHDFS的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属性。



SecondaryNameNode

作用:

①镜像备份

备份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());
		}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇storm整合hdfs—将数据写到hdfs 下一篇初识HDFS(10分钟了解HDFS、NameN..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目