Hadoop组件——HDFS
namenode
Namenode是HDFS中的主节点,它的作用是负责管理整个文件系统的元数据。
元数据:管理数据的数据即为元数据。
datanode
Datanode是HDFS中的从节点,它的作用是负责管理用户的文件的数据块(block)。在hadoop2中,一个文件会被切成若干的block,每个快的大小为128M。hadoop3.0的时候快的256M。每一个块会有多个副本,这些被存放在不同datanode节点之中。datanode会定期的向namenode汇报自己的block的信息,而namenode会负责保持副本的数量。
secondary namenode
作用:就是将namenode的edits日志合并到fsimage中。
说白了secondary namenode的作用就是为namenode提供了checkpoint的作用。
HDFS shell
hadoop fs 运行文件系统相关的命令(重点)
1、-cat
2、-chomd
3、-chown
4、-copyFromLocal
5、-copyToLocal
6、-cp
7、-df
8、-du
9、-find
10、-get
11、-getmerge(文件的合并)
12、-ls
13、-mkdir
14、-mv
15、-moveFromLocal
16、-moveToLocal
17、-put
18、-rm
19、-rmdir
20、-stat
21、-tail
hadoop fs -ls
hadoop fs -mkdir /test
hadoop fs -put 1.txt /test
hadoop fs -get /test/1.txt
hadoop jar 运行一个jar
hdfs
dfs 就和hadoop fs等价。
namenode -format 格式化namenode
secondarynamenode 启动secondary namenode
namenode 启动namenode
journalnode 启动journalnode
zkfc 启动ZK Failover Controller
daemon
datanode 启动datanode
dfsadmin 运行admin client的权限功能(全
分布式/伪分布式)
haadmin 运行HA admin client
hdfs namenode -format
HDFS的安全模式
安全模式是什么:
主要用于保证HDFS整个的集群(数据)安全。所以一旦HDFS进入到安全模式,那么HDFS将是只读的。
如何才能进入到安全模式
1. 通过命令行的方式进入/退出安全模式
hdfs dfsadmin -safemode <enter | leave>
2. 当你的集群中的datanode节点的比例低于%99.9它就会自动的进入到安全模式
hdfs-site.xml
dfs.namenode.safemode.threshold-pct=0.999f
3. 当你开启集群的时候,会有那么几秒自动进入安全模式(因为在开启集群的时候datanode没有被namenode所完全识别)
如何退出安全模式
1. 立刻修复你的服务器(推荐)
2. 使用命令hdfs dfsadmin -safemode
leave | forceExit(强制退出)
3. 修改hdfs-site.xml中的
dfs.namenode.safemode.threshold-pct=0.999f
配置文件
1、core-site.xml/hdfs-site.xml/yarn-site.xml/mared-site.xml : 站点文件,自定义
2、core-default.xml/hdfs-default.xml/yarn-default.xml/mapred-default.xml : 默认文件,预定义
3、查询默认配置文件所在的目录
1、/opt/apps/hadoop-2.8.1/share/doc/hadoop/hadoop-yarn/hadoop-yarn-common/yarn-default.xml(查yarn)
2、/opt/apps/hadoop-2.8.1/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml(查hdfs)
3、/opt/apps/hadoop-2.8.1/share/doc/hadoop/hadoop-project-dist/hadoop-common/core-default.xml(查core)
4、/opt/apps/hadoop-2.8.1/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml(查mapred)
4、在hadoop集群中加载配置文件的优先级
1、从代码中加载配置:如果你的代码中对这个属性进行了配置,以代码设置的为主
2、如果代码中没有这个属性的配置,集群会去加载站点文件,以站点文件为主
3、如果站点文件也没有,就会加载default的配置文件
启动和关闭单个集群
1、在主节点上启动HDFS namenode
hadoop-daemon.sh start namenode
2、在每个从节点上开启HDFS datanode
hadoop-daemon.sh start datanode
3、在主节点上启动YARN resourcemanager
yarn-daemon.sh start resourcemanager
4、在每个从节点上使用Yarn nodemanager
yarn-daemon.sh start nodemanager
5、在设置的节点上启动secondarynamenode
hadoop-daemon.sh start secondarynamenode
关闭是把start换成stop
重点命令
hdfs dfsadmin -safemode leave/forceExit
HDFS API执行前的相关连接配置问题
在这里报的异常问题只有在连接云服务器的时候会出现
异常一:
这个异常的原因:是因为hadoop在执行的时候默认会以当前操作系统的用户名来操作HDFS,但是服务器端的HDFS中的文件权限是root,所以产生了这个异常:
解决方案1:
System.setProperty("HADOOP_USER_NAME", "root");
异常二:
这个异常原因:
原因一:是因为我们通过远程ip开放9000端口去访问了云端的服务器,9000端口是namenode组件的,namenode链接了之后如果没有问题会将你需要请求的datanode地址返回给客户端,客户端需要自行的去访问datanode,而我们只开放了9000端口,没有开放datanode的50010端口。
原因二:由于我们是云端,所以我们客户端是通过公网ip访问的namenode,但是namenode的主机名是一个内网ip,它返回给用户去访问的datanode给的也是内网ip。所以客户端在得到了这个内网ip的时候无法寻找到指定的真正的datanode位置。
(这里面是通过一个hadoop中间变量把公网ip转换成内网IP)
解决方案:
1. 开放50010端口即可
2. 第二个处理方式:但凡修改了服务器的配置,都需要重启服务器
2.1 hdfs-site.xml
<!-- 使用datanode所在的服务器的主机名称 -->
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
2.2 修改vi /etc/hosts
10.206.0.4 hadoop(在这里的ip地址一定要换成内网的ip地址)
2.3 修改core-site.xml : namenode的这个配置就不能使用ip了,得直接使用主机名称,所有设计到ip的地方都用主机名称替代
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop:9000</value>
</property>
HDFS API
具体的JAVA-api可以在博客中查看
@Before:这个注解申明在方法的前面的时候表示,这个方法会在所有的@Test注解执行之前执行
@After:这个注解申明在方法的前面的时候表示,这个方法会在所有的@Test注解执行之后执行
正常的是@Before,@Test,@After这三个放在一起使用