hadoop入门-hdfs篇

hadoop入门-hdfs篇

 

一、hadoop简介

是由java语言编写,用于在分布式服务器集群上存储海量数据并进行分布式运算分析的开源框架。
特点:

  • 海量数据分布式存储,namnode记录元数据信息,datanode存储数据块,块大小可自定义

  • 多副本存储,保证数据安全,默认3个,当其中一个宕机,触发自动恢复功能

  • 支持动态扩容,提高整体性能,对单个pc性能要求不高
    三大基础组件:

  • hdfs 数据存储

  • mapreduce 数据运算模型(分类-聚合)

  • yarn 资源调度和任务监控

 

二、hadoop安装

下载解压hadoop安装包后
1.jdk环境
2.多台服务器(或虚拟机),免密配置,域名映射,ip,hostname,虚拟机的话需要设置网卡
3.配置文件
vi ./etc/hadoop/hadoop-env.sh

	export JAVA_HOME=$JAVA_HOME

vi ./etc/hadoop/hdfs-site.xml

<configuration>
   <!-- 集群的namenode的位置  datanode能通过这个地址注册-->
	<property>
	     <name>dfs.namenode.rpc-address</name>
		 <value>${namenode_hostname}:9000</value>
	</property>
	 <!-- namenode存储元数据的位置 -->
	<property>
	     <name>dfs.namenode.name.dir</name>
		 <value>/opt/hdpdata/name</value>
	</property>
	 <!-- datanode存储数据的位置 -->
	<property>
	     <name>dfs.datanode.data.dir</name>
		 <value>/opt/hdpdata/data</value>
	</property>
	 <!-- secondary namenode(可以理解为namenode的检查节点)机器的位置-->
	<property>
		<name>dfs.namenode.secondary.http-address</name>
		<value>${secondary_hostname}:50090</value>
	</property>

</configuration>

vi ./etc/hadoop/yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<!-- resource,manager主节点所在机器-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>${resourcemanager_hostname}</value>
</property>

<!-- 为mr程序提供shuffle服务-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 一台NodeManager的总可用内存资源-->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>

<!-- 一台NodeManager的总可用(逻辑)CPU核数-->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>

<!-- 容器的虚拟内存使用上限:与物理内存的比率-->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
</configuration>

单台配置好后拷贝到其他服务器上进行广播
4.启动(最好把bin和sbin配置到环境变量中)

  • 单节点启动 ./hadoop-daemon.sh start namenode/datanode
  • hdfs集群启动 start/stop-dfs.sh
  • yarn启动(hdfs和yarn都启动) start-all.sh

5.要了解的几个端口

  • 50070 相当于hdfs的index页面,namenode的http服务端口
  • 8088 yarn的http服务端口,查看任务信息等
  • 9000 fileSystem默认端口号,进行上传下载服务
  • 更多请参见https://blog.csdn.net/u011563666/article/details/79026114

 

三、hdfs操作

 

1. shell客户端

hdfs  dfs 
 -ls 路径 //查看路径下的文件信息
 -cat 文件 //查看文件内容
 -chmod -mv -rm -tail等
 
重点说两个,上传和下载
 vi ./etc/hadoop/coresite.xml
 <!-- 文件系统默认根目录-->
 <property>
        <name>fs.defaultFS</name>
        <value>hdfs://${namnode_hostname}:9000</value>
</property>
 **上传文件**:
 	hdfs dfs -put /a.txt   /aa/bb/
 若目录不存在需要先创建
 hdfs dfs -mkdir -p /aa/bb 
 hdfs dfs -put /a.txt   /aa/bb/
浏览器打开${namenode_hostname}:50070页面即可查看
**下载文件**
hdfs dfs -get  /aa/bb/a..txt   /usr

 

2. javaAPI

需要本地配置好hadoop环境,配置好HADOOP_HOME环境变量
以namenode为DJ01为例

package com.djTest;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class HDFSUtils {

    public static FileSystem getFS() throws IOException, InterruptedException, URISyntaxException {
        URI uri = new URI("hdfs://DJ01:9000");
		//conf优先级:代码配置>项目配置>hadoop配置
        Configuration conf = new Configuration();
        return FileSystem.newInstance(uri,conf,"root");
    }

    public static void main(String[] args) throws Exception{
        FileSystem fs = getFS();
        /*
        * 1.上传文件,假设本地是windows环境
        * 参数一:是否删除源文件
        * 参数二:是否覆盖目标文件,false则不会上传
        * 参数三:要上传的文件路径
        * 参数四:上传目标路径
        * */
        fs.copyFromLocalFile(false,false,new Path("D:/b.txt"),new Path("/aa"));
        /*
        * 2.下载文件
        * 参数一:是否删除源文件
        * 参数二:要下载的源文件路径
        * 参数三:目标路径,要保证目标路径存在,否则不会报错不会下载
        * 参数四:是否开启文件校验
        * */
        fs.copyToLocalFile(false,new Path("/aa/b.txt"),new Path("D:/test"),true);
		//其他操作自行研究
        fs.close();
    }
}

 

四、hdfs上传下载原理

 

1. namenode和datanode的心跳机制

 

2. 文件上传

3. 文件下载

4. 检查节点机制

Secondary NameNode实际上可以看做是namenode的检查节点。

hdpdata/name/current下面有两类与元数据存储相关的文件:
	1.fsimage 文件系统的快照
	2.editlogs 记录文件系统即时改动序列的日志文件,只有在namenode重启时,才会合并生成新的image
namenode在使用很长一段时间后会生成大量的edit logs文件,而image文件却不会保持最新,一旦namenode宕机,合并edit logs会消耗很长的时间,由此引发了Secondary NameNode对这两类文件的管理:
假设namenode是机器A,Secondary NameNode是机器B
	1.B定时(默认1H)到A获取edit logs,并更新到B上的fsimage
	2.B中edit logs积压到一定数量(默认64M)会合并到fsimage上
	3.B的fsimage一旦更新,会拷贝到A中,A在重启会使用最新的image
	core-site.xml文件中可设置上述的fs.checkpoint.period和fs.checkpoint.size
	听说hadoop后续版本还有backupnode,这里不做介绍

 

上述图片已经上传附件,看不清的可以免费下载 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值