大数据学习笔记(未完待续)

大数据学习笔记(未完待续)

Hadoop简介

一、概述

  1. Hadoop时Apache提供的开源的、可靠的、可扩展的、分布式的计算框架
  2. Hadoop除了管网提供的发行版外,各大厂商也提供了发行版:Cloudera的CDH、华为的HDP

二、发展

  1. 创始人:Doug Cutting(道格卡丁)和 Mike Cafarella
  2. 在2002年,Doug和Mike为了实现搜索引擎Nutch爬取了全网10亿个网页的数据
  3. 在2003年,Google发表了《The Google FileSystem》阐述了google分布式存储的原理,但是并没有对外公开这个框架
  4. 在2004年,Doug和Mike根据谷歌论文设计实现了NDFS-Nutch Distributed FileSystem,决解了海量数据的存储问题
  5. 在2004年,Google发表了《Google MapReduce》阐述了Google的分布式计算思想,同样也没有公开框架
  6. Doug和Mike又根据这篇文章,实现了Nutch和ReMapduce
  7. 在Nutch0.8版本,Doug将NDFS和MapReduce从Nutch中分离出来组成了Hadoop,同时将NDFS更名为HDFS
  8. 在2008年,Doug加入了Yahoo,开源了Hadoop,在Yahoo期间设计实现了Pig、HBase等框架
  9. 后来,Yahoo将Hadoop、Pig、HBase等全部贡献了Apache

三、模块划分

  1. Hadoop Comoon:基本模块,用于支撑其他模块
  2. Hadoop Distributed File System:分布式文件系统,用于存储数据
  3. Hadoop Yarn:用于资源管理和任务调度
  4. Hadoop MapReduce:基于Yarn进行并行计算的框架
  5. Hadoop Ozone:用于进行对象存储-基于HDFS
  6. Hadoop Submarine:用于机器学习的引擎-2019.03出来的新模块

四、版本

  1. Hadoop1.0:包含了HDFS和MapReduce
  2. Hadoop2.0:包含了HDFS和MapReduce和Yarn。Hadoop2.0和Hadoop1.0完全不兼容,在Hadoop2.0的高版本中也支持Ozone
  3. Hadoop3.0:包含了Hadoop所有的模块-从2017.12

五、Hadoop 伪分布式安装

  1. 关闭防火墙
service iptables stop
chkconfig iptables off
或者 
systemctl stop firewalld
systemctl disable firewalld
  1. 修改主机名
vim /etc/hostname
  1. 增加主机名和ip的映射
vim /etc/hosts
  1. 安装并配置JDK
export JAVA_HOME=/root/software/jdk1.8.0_201
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin

  1. 上传并解压hadoop压缩包
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz

tar -xvf hadoop-2.7.7.tar.gz
  1. 进入到hadoop的配置文件目录
cd /root/software/hadoop-2.7.7/etc/hadoop
  1. 配置hadoop-env.sh
vim hadoop-env.sh 

修改内容为:

export JAVA_HOME=/root/software/jdk1.8.0_201

export HADOOP_CONF_DIR=/root/software/hadoop-2.7.7/etc/hadoop

立即生效

source hadoop-env.sh 
  1. 配置core-site.xml
vim hadoop-env.sh 

修改内容为:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://node1:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/root/software/hadoop-2.7.7/tmp</value>
        </property>

</configuration>
  1. 配置 hdfs-site.xml
vim hdfs-site.xml

修改内容为:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>
</configuration>
  1. 配置mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml

修改内容:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
</configuration>

  1. 配置 yarn-site.xml
vim yarn-site.xml

修改内容为:

<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>

<!-- Site specific YARN configuration properties -->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>node1</value>
	</property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>
  1. 修改 slaves
vim slaves

修改内容为当前节点的主机名:

node1
  1. 修改环境变量
vim /etc/profile

增加如下配置:

export HADOOP_HOME=/root/software/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

立即生效:

source /etc/profile
  1. 启动hadoop
    首次启动需要先执行:
hadoop namenode -format

上述执行没有问题后,执行如下命令:

start-all.sh
  1. 查看是否启动成功:
jps

出现如下结果,则成功:

[root@node1 hadoop]# jps
4450 NodeManager
4035 DataNode
4213 SecondaryNameNode
3942 NameNode
4358 ResourceManager
4925 Jps
  1. 访问hadoop的页面
http://192.168.3.10:50070

六、安装模式

  1. 单机:安装包解压之后直接使用,就是单机模式。单机模式下,智能使用Hadoop的MapReduce组件,其他组件不生效,此时的数据默认存储在本机文件系统中
  2. 伪分布式:利用一个节点来模拟集群环境,则一个节点上去启动集群中所有需要的进程-优势在于可以使用Hadoop的所有组件
  3. 完全分布式:利用集群来部署Hadoop

HDFS

一、概述

  1. Hadoop中的分布式的存储文件系统
  2. 根据Google的论文设计实现

二、技术细节

  1. 在HDFS中,存在两类主要的节点:NameNode和DataNode
  2. NameNode负责管理DataNode,DataNode负责存储数据
  3. 在存储数据的时候会将数据进行切块
  4. 为了防止数据丢失,会将数据进行备份,备份称之为复本(replication),在Hadoop中默认的复本数量为3。伪分布式下复本数量必须为1。

三、块 Block

  1. 在存储数据的时候会将数据进行切块,每一个块碑称为一个Block
  2. Block 是 HDFS 中的基本存储单位。
  3. 在 HADOOP2.0版本中,每一个 Block 默认是128Mb,可以通过dfs.blocksize来更改快的大小,单位是字节
  4. 如果一个文件不足128Mb,那么这个文件是多大就在HDFS上占多大的地方
  5. 在HDFS中,会对Block进行编号-BlockID
  6. 将数据切块的意义:
    1. 便于存储超大的文件
    2. 便于进行快速的备份

四、NameNode

  1. 管理DataNode和记录元数据Meta
  2. 元数据Meta包含的信息,大小大概在150字节左右
    1. 记录数据的虚拟存储路径
    2. 记录文件切块的数量
    3. 记录数据块的存储位置
    4. 记录数据块的复本数量
    5. 记录文件的权限
  3. NameNode将元数据维系在内存和磁盘中
  4. 元数据维系在内存中的目的是为了快速查询
  5. 元数据维系在磁盘中是为了崩溃恢复
  6. 元数据的存储位置由hadoop.tmp.dir指定,如果不配置则默认使用/tmp
  7. 元数据在磁盘中以edits和fsimage文件形式存在
    1. edits:记录写操作,文件的大小固定为1Mb,如果记录超过1Mb,则会按1Mb累加
    2. fsimage:记录元数据。fsimage中的元数据和内存中的元数据并不同步
  8. 当NameNode接收到写请求后,会将该请求记录到edits_inprogess文件中,如果记录成功,则将该请求同步更新到内存中,修改内存中的元数据,内存修改完成之后会给客户端返回一个ack表示成功
  9. 在HDFS中,会给每一次的写操作分配一个编号,事务id:tx_id
  10. 当edits文件达到条件是会将操作更新到fsimage文件中,及修改fsimage文件中的元数据:
    1. 空间维度:当edits_inprogress文件达到指定大小是会出发更新,默认大小是64Mb,大小可以由fs.checkpoint.size(core-site.xml)来指定,默认单位是字节
    2. 时间维度:当距离上一次更新达到指定间隔时间的时候会出发更新,默认是1H,大小可以由fs.checkpoint.period来指定,默认单位是s
    3. 重启更新:NameNode重启后,会自动的将edits_inprogress中的操作更新到fsimage中
    4. 强制更新:hadoop dfsadmin -rollEdits
  11. 在更新的时候,会将edits_inprogress文件重命名为edits_XXXXXXXXXXXXX-XXXXXXXXXXX,同时产生一个新的edits_inprogress
  12. 在Hadoop中,如果存在SecondaryNameNode,则更新过程发生在SecondaryNameNode
  13. 在HDFS中,最核心的节点是NameNode。但是在Hadoop1.0中只能由1个NameNode,在Hadoop2.0版本中,允许设置2个NameNode,代价是丢掉SecondaryNameNode
  14. NameNode通过心跳机制来管理DataNode:DataNode每隔定长时间会给NameNode发送心跳信息
  15. 默认情况下,DataNode每隔3s给NameNode发送一条信息
  16. 如果NameNode长时间(默认是10min)没有收到某个DataNode的心跳信息,则认为这个DataNode已经 lost(丢失),此时NameNode会将这个DataNode中的数据再次备份,保证复本的数量
  17. 心跳信息包含:
    1. 当前节点的状态
    2. 当前节点所存储的数据块信息
  18. NameNode重新启动时,将edits中的操作更新到fsimage,将fsimage中的元数据加载到内存中,等待DataNode的心跳,这个过程称之为安全模式(safe mode)
  19. 因为安全模式,所以伪分布下,分布数量为序为1——如果复本不是1,则重启NameNode的时候,会导致HDFS一直处于安全模式

五、DataNode

  1. 用户存储数据,注意数据以Block形式存储
  2. 数据咋DataNode上的存储位置由hadoop.tmp.dir属性指定,存储目录是 /dfs/data/current/BP-1095483339-192.168.3.10-1584128665974/current/finalized/subdir0/subdir0
  3. DataNode会通过心跳机制(RPC方式)向NameNode发送心跳信息

六、SecondaryNameNode

  1. SecondaryNameNode只是辅助 NameNode 进行元数据的合并
  2. SecondaryNameNode能做到一定的备份作用,但是并不能做到和NameNode之间进行进行实时热备,一旦用SecondaryNameNode进行了备份,旺旺意味着数据已经产生了丢失
  3. 在HDFS中,最核心的是NameNode,在因此在Hadoop2.0的完全分布式中,为了做到NameNode的热备,舍弃了SecondaryNameNode

七、复本放置策略

  1. 在HDFS中,默认时多复本放置策略
  2. 复本放置策略
    1. 第一个复本:如果时外部上传,则NameNode会选择一个相对空闲的节点存放复本;如果是内部上传,则第一个复本放在本节点上
    2. 第二个复本:在2.7以前,第二个复本和第一个副本不同的机架上;在2.7以后,第二个复本和第一个副本相同的机架上
    3. 第三个复本:在2.7以前,第三个复本和第二个副本相同的机架上;在2.7以后,第二个复本和第一个副本不同的机架上
    4. 更多复本:随机放在空闲的节点

八、机架感知策略

  1. 在Hadoop所指的机架并不是物理结构二十逻辑结构
  2. 同意通过映射关系来指定节点对应的机架,意味着同一个物理机架上的节点可以映射到不同的逻辑机架上

八、回收站机制

  1. 在HDFS中,回收站默认是不开启的,意味着一旦删除不可恢复
  2. 开启回收站需要在 core-site.xml 中做如下配置
<!-- 表示开启回收站,指定在回收站停留的时间,单位是min -->
<property>
    <name>fs.trash.interval</name>
    <value>1200</value>
</property>

九、dfs目录

  1. dfs目录在NameNode被格式化的时候产生
  2. dfs目录的子目录:data、name、namesecondary
  3. in_use.lock标记当前节点正在启动
  4. HDFS第一次启动的时候,会默认在1min的时候进行一次合并,之后按照更新条件进行合并
  5. edits文件会在开始和结束都会被记录成一次事务
  6. 上传文件:
    1. OP_ADD:在指定目录下创建一个同名的文件._COPYING,此时这个文件允许写入
    2. OP_ALLOCATE_BLOCK_ID:分配BlockID
    3. OP_SET_GENSTAMP_V2:给时间戳分配一个编号
    4. OP_ADD_BLOCK:将数据传输到HDFS上
    5. OP_CLOSE:关流,关闭文件,此时文件不允许写入
    6. OP_RENAME_OLD:重命名
  7. 将edits文件转化为xml格式的命令为:
hdfs oev -i edits_XXXXXXX -o aaaa.xml
  1. 将fs文件转化为xml格式的命令为:
hdfs ovi -i fsimage_00000000000000001 -o bbbb.xml -p XML

十、HDFS流程

一、读流程

  1. 客户端发起RPC请求到NameNode
  2. NameNode收到请求之后,校验是否存在,如果存在,NameNode会将这个文件所对应的Block的存储地址放入一个队列(顺序)中返回给客户端
  3. 客户端收到队列后,将队列中的Block地址依次去除,从3个地址中取出一个较近的地址来读取
  4. 读取完一个Block之后,对这个Block进行一次checksum的验证-验证这个Block的数据总量是否准确;如果不一致,则说明该Block产生损坏,客户端会通知NameNode,然后再从其他节点上重新读取该Block
  5. 如果读完一个BLock会读取下一个Block,只到这一次的所有Block全部读完
  6. 客户端在读完这一批地址会想NameNode要下一批地址
  7. 等所有的BLock读完,客户端会给NameNode发送消息通知NameNode关闭文件

二、写流程

  1. 客户端发起RPC请求到NameNode,请求包含文件的信息描述
  2. NameNode收到请求之后,校验路劲是否有写入权限;如果校验通过,校验有没有同名文件,如果没有则允许写入
  3. NameNode计算这个文件需要的地址数量,然后会给每一快分配对应的地址,并且将地址加入队列中返回给客户端
  4. 客户端收到地址后,将数据进行封包(packets),写入DataNode
  5. 在写入的时候,会找一个较近的节点将数据写入,在写完第一个Block后,这个DataNode自动通过Pipeline(管道,基于NIO的Channel)将这个Block备份到其他节点上构成指定的复本数
  6. 节点之间一次传递ACK信号表示备份成功,在客户端收到ACK之后会继续写下一个Block
  7. 客户端写完所有的Block之后会通知NameNode关流,此时这个文件更改为不可写

三、删流程

  1. 客户端发起RPC请求到NameNode
  2. NameNode收到请求之后,校验是否存在,如果存在校验这个客户端是否有删除权限
  3. 通过校验之后,NameNode就会将这个操作记录到edits_inprogress文件中,然后修改内存中的元数据,最后向客户端返回ack表示删除成功。次数数据并没有从HDFS上移除
  4. NameNode等待DataNode的心跳,通过DataNode的心跳信息校验DataNode上是否有要删除的数据,如果有需要删除的数据,则NameNode会给对应的DataNode发送指令删除指定数据,DataNode在接收到指令才会删除。此时数据才真正从HDFS上移除

MapReduce

一、概述

  1. 是Hadoop中的一套分布式计算框架
  2. 将整个计算过程拆分为2个阶段:Map和Reduce阶段
  3. Map阶段负责数据的整理,Reduce阶段负责数据的汇总

Yarn

Flume

Hive

Sqoop

Hbase

Kafka

Scala

Spark

Storm

Python

机器学习