防坑留言:
不但要能简单写出伪分布式,还要对其配置文件为什么这么写有一定理解才容易找出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> //创建一个空文件
从
/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());
}