淘先锋技术网

首页 1 2 3 4 5 6 7

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这三个放在一起使用