《进击大数据》系列教程之hadoop大数据基础

网友投稿 639 2022-05-29

目录

前言

一、使用http的方式访问hdfs

二、hdfs各组件及其作用

三、hdfs中的数据块(Block)

四、java api 操作hdfs

五、java 开发 hdfs 应用时注意的事项

六、DataNode心跳机制的作用

七、NameNode中EditsLog 和FSImage 的作用

八、SecondaryNameNode 帮助NameNode 减负

九、NameNode 如何扩展?

十、创建文件的快照(备份)命令

十一、平衡数据

十二、safemode 安全模式

前言

时隔一年多,忙忙碌碌一直在做java web端的业务开发,大数据基本忘的差不多了,此次出一个大数据系列教程博文将其捡起。

hadoop,hdfs的下载安装以及启动,停止在这里就不一一介绍了,不会的可以查看我的历史博客。

默认我们已经搭建好了一个三节点的主从hadoop节点,一个master,两个salve

《进击大数据》系列教程之hadoop大数据基础

一、使用http的方式访问hdfs

在hdfs-site.xml中增加如下配置,然后重启hdfs:

dfs.webhdfs.enabled

true

使得可以使用http的方式访问hdfs

使用http访问:

查询user/hadoop-twq/cmd 文件系统中的error.txt文件

http://master:50070/webhdfs/v1/user/hadoop-twq/cmd/error.txt?op=LISTSTATUS

http://master:50070/webhdfs/v1/user/hadoop-twq/cmd/error.txt?op=OPEN

支持的op见:

http://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-hdfs/WebHDFS.html

二、hdfs各组件及其作用

三、hdfs中的数据块(Block)

数据块的默认大小:128M

设置数据块的大小为:256M = 256*1024*1024

在${HADOOP_HOME}/ect/hadoop/hdfs-site.xml增加配置:

dfs.block.size

268435456

数据块的默认备份数是3

设置数据块的备份数

对指定的文件设置备份数

hadoop  fs  -setrep  2 /user/hadoop-twq/cmd/big_file.txt

全局文件备份数是直接在hdfs-site进行设置:

dfs.replication

3

数据块都是存储在每一个datanode 所在的机器本地磁盘文件

四、java api 操作hdfs

使用javaapi 写数据到文件

package com.dzx.hadoopdemo;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataOutputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import java.io.IOException;

import java.net.URI;

import java.net.URISyntaxException;

import java.nio.charset.StandardCharsets;

/**

* @author duanzhaoxu

* @ClassName:

* @Description:

* @date 2020年12月17日 17:35:37

*/

public class hdfs {

public static void main(String[] args) throws Exception {

String content = "this is a example";

String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt";

Configuration configuration = new Configuration();

FileSystem fileSystem = FileSystem.get(URI.create(dest), configuration);

FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path(dest));

fsDataOutputStream.write(content.getBytes(StandardCharsets.UTF_8));

fsDataOutputStream.close();

}

}

使用java api 读取文件

package com.dzx.hadoopdemo;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.URI;

/**

* @author duanzhaoxu

* @ClassName:

* @Description:

* @date 2020年12月17日 17:35:37

*/

public class hdfs {

public static void main(String[] args) throws Exception {

String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt";

Configuration configuration = new Configuration();

FileSystem fileSystem = FileSystem.get(URI.create(dest), configuration);

FSDataInputStream fsDataInputStream = fileSystem.open(new Path(dest));

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fsDataInputStream));

String line = null;

while (bufferedReader.readLine() != null) {

System.out.println(line);

}

fsDataInputStream.close();

bufferedReader.close();

}

}

使用java api 获取文件状态信息

package com.dzx.hadoopdemo;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FileStatus;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.fs.permission.FsAction;

import org.apache.hadoop.fs.permission.FsPermission;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.URI;

/**

* @author duanzhaoxu

* @ClassName:

* @Description:

* @date 2020年12月17日 17:35:37

*/

public class hdfs {

public static void main(String[] args) throws Exception {

//获取指定文件的文件状态信息

String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt";

Configuration configuration = new Configuration();

FileSystem fileSystem = FileSystem.get(URI.create("hdfs://master:9999/"), configuration);

FileStatus fileStatus = fileSystem.getFileStatus(new Path(dest));

System.out.println(fileStatus.getPath());

System.out.println(fileStatus.getAccessTime());

System.out.println(fileStatus.getBlockSize());

System.out.println(fileStatus.getGroup());

System.out.println(fileStatus.getLen());

System.out.println(fileStatus.getModificationTime());

System.out.println(fileStatus.getOwner());

System.out.println(fileStatus.getPermission());

System.out.println(fileStatus.getReplication());

System.out.println(fileStatus.getSymlink());

//获取指定目录下的所有文件的文件状态信息

FileStatus[] fileStatuses = fileSystem.listStatus(new Path("hdfs://master:9999/user/hadoop-twq/cmd"));

for (FileStatus status : fileStatuses) {

System.out.println(status.getPath());

System.out.println(status.getAccessTime());

System.out.println(status.getBlockSize());

System.out.println(status.getGroup());

System.out.println(status.getLen());

System.out.println(status.getModificationTime());

System.out.println(status.getOwner());

System.out.println(status.getPermission());

System.out.println(status.getReplication());

System.out.println(status.getSymlink());

}

//创建目录

fileSystem.mkdirs(new Path("hdfs://master:9999/user/hadoop-twq/cmd/java"));

//创建目录并指定权限 rwx--x---

fileSystem.mkdirs(new Path("hdfs://master:9999/user/hadoop-twq/cmd/temp"), new FsPermission(FsAction.ALL, FsAction.EXECUTE, FsAction.NONE));

//删除指定文件

fileSystem.delete(new Path("hdfs://master:9999/user/hadoop-twq/cmd/java/1.txt"), false);

//删除指定目录

fileSystem.delete(new Path("hdfs://master:9999/user/hadoop-twq/cmd/java"), true);

}

}

五、java 开发 hdfs 应用时注意的事项

//需要把core-site.xml文件放到resources目录下,自动读取hdfs的ip端口配置

String dest = "user/hadoop-twq/cmd/java_writer.txt";

Configuration configuration = new Configuration();

FileSystem fileSystem = FileSystem.get(configuration);

FileStatus fileStatus = fileSystem.getFileStatus(new Path(dest));

六、DataNode心跳机制的作用

七、NameNode中EditsLog 和FSImage 的作用

八、SecondaryNameNode 帮助NameNode 减负

九、NameNode 如何扩展?

向主节点master的hdfs-site.xml 增加如下配置

查看 master节点的 clusterId

将hdfs-site.xml 从主节点master 拷贝到 slave1 和 slave2

形成三个节点的集群之后,我们使用java api 就不知道指定哪个 nameNode 的ip:端口了,所以我们需要进行viewFs配置

首先将core-site.xml 中的fs.defaultFS 配置项注释掉,然后添加如下配置

fs.default.name

viewfs://my-cluster

然后增加一个 mountTable.xml 文件( 元数据管理分布映射,相当于将namenode 管理的元数据分散到不同的namenode节点上)

然后将修改好的配置文件同步到 slave1 和 slave2 上,重启hdfs集群即可

重启之后在任意节点都可以使用通用的 请求方式,例如:

hadoop  fs  -ls  viewfs:://my-cluster/

十、创建文件的快照(备份)命令

给指定的目录授权创建快照

hadoop dfsadmin -allowSnapshot  /user/hadoop-twq/data

创建快照

hadoop fs -createSnapshot /user/hadoop-twq/data  data-20180317-snapshot

查看创建的快照文件

hadoop fs -ls /user/hadoop-twq/data/.snapshot/data-20180317-snapshot

其他快照相关命令

十一、平衡数据

当我们对hdfs 集群进行扩展的时候,难免新扩展进来的节点,分配的数据量较少,这个时候为了能够均衡的分配数据,可以使用hdfs  balancer命令

十二、safemode 安全模式

开启安全模式之后无法创建,删除目录和文件,只允许查看目录和文件

hadoop  dfsadmin  -safemode  get

Safe  mode is OFF

hadoop dfsadmin -safemode enter

Safe  mode is ON

hadoop dfsadmin -safemode leave

Safe  mode is ON

大数据 Hadoop

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Shell 流程控制
下一篇:华为云FusionInsight MRS跨湖跨仓场景下如何实现海量数据分钟级分析
相关文章