架构(40%) 配置(30%) 编程(30%)
Hadoop笔记
互联网的发展
8、90年 书信
95年-2000年 email
2000年-2010年 2G、3G半智能手机(塞班)
2010年 4G
2019年 5G(万物皆物联,物联网,人工智能,神经网络)
数据的存储,数据的挖掘,数据的分析
大数据应用最好的时代
大数据:TB PB ZB
-
大数据(big data,mega data)或称巨量资料,指的是无法在一定时间范围内用常规软件工具进行捕捉,需要新处理模式才能具有更强的决策力、洞察力和流程优化能力的海量、高增长率和多样化的信息资产。 在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》中大数据指不用随机分析法(抽样调查)这样的捷径,而采用所有数据进行分析处理。
-
大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(价值密度)【数据有价值的和无价值的,原始数据是低价值密度】、Veracity(真实性)【数据有效】。
一:概述
Hadoop:大数据入门级技术(Apache家)
1. Hadoop 核心
HDFS Hadoop Distibuted File System
MapReduce MR
2. Hadoop 生态圈技术
特点:对HDFS MR进行更高阶的封装,便于程序员使用
Zookeeper
HBase 基于Hadoop的NoSql 列类型产品
Hive 基于Hadoop的数据仓库
3. Hadoop辅助工具
Flume
Sqoop
Oozie
Hue
是什么:
-
是一个开源的、可靠的、可扩展的分布式计算框架。允许用户在一个超大规模的服务器集群中对大数据集进行分布式的处理计算,支持单个(伪分布式集群)或者上千台的商用服务器(完全分布式集群)构成。该集群的每一个服务器都提供了本地计算和存储的能力,并不是通过硬件实现的高可用,而是通过应用层的检测处理错误,这样的集群可以建立在廉价的商用服务器之上
模块狭义的Hadoop(五大模块)
- Hadoop Common(通用):用来支持一些其他的Hadoop模块,通用支持库
- Hadoop Distributed File System(HDFS):一个分布式文件系统,提供高吞吐能力的数据访问,解决数据存储问题
- HadoopYarn一个框架用来任务的调度以及集群资源的管理
- Hadoop MapReduce:一个基于yarn的系统,为了大数据集分布式进行并行计算
- Hadoop Ozone:对象存储系统
- Hadoop Submarine:机器学习引擎
广义的Hadoop(Hadoop生态体系)
-
Apache HBase:Big Table,用来存储海量的结构化数据(上百亿条数据,上百亿列)
-
Apache Zookeeper(动物园管理员,铲屎官):为了解决分布式协调服务系统,解决Hadoop生态体系各个分布式系统存在的通用问题
-
Apache Hive(小蜜蜂):数据仓库的基础设施,用来简化Hadoop的操作
-
Apache Flume(数据采集):负责采集各种数据类型的数据,并且进行简单的预处理操作
-
Apache Spark(Scala语言,函数编程):更为高效的分布式计算引擎
-
Apache Flink(最火的,在阿里,京东):高效的分布式计算引擎,第三代
二、HDFS(基于java语言编写)
做备份,海量数据,服务器(处理客户端的请求和响应,计算和数据存储)TFS fastDfs(淘宝)
- HDFS是Hadoop的分布式文件系统(Hadoop Distributed File System),类似于其他的分布式文件系统,HDFS支持高度容错,可以部署在廉价的硬件设备上,特别适宜于大型的数据集的分布式存储。(来源于Google开源论文GFS)
三、环境搭建
构建HDFS伪分布式集群
- 流程
1、网络操作 防火墙 JDK(环境变量)
2、解压缩 Hadoop
3、修改五个配置文件
hadoop-env.sh(设置jdk安装目录(讲究的改))
core-site.xml(解决全局性的内容)
hdfs-site.xml(解决HDFS相关的内容)
mapred-site.xml(解决MapReduce相关内容)
yarn-site.xml(yarn相关操作)
slaves(从节点的相关问题,即DataNode相关问题)
4、NameNode格式化
5、启动进程
-
安装CentOS 7.2版本
-
文件,稍后安装 ,7 .64位,存储位置e:vm,命名Hadoop
-
设置镜像,cd,映像文件
-
开启虚拟机,Install
-
中文,安装位置,不做操作,点击完成
-
root用户设置密码123456 点击完成 等待安装进度条跑完 重启
-
-
关防火墙(之间的信息传递)
- systemctl stop firewalld(本次关闭防火墙)
- systemctl sisable firewalld(永久关闭防火墙)
-
配置网络
-
ip a 查看当前服务器的网络设置IP地址
-
vi /etc/sysconfig/network-scripts/ifcfg-ens33
-
最后一行no->yes(把网卡改成开机自启)
-
systemctl restart network重启
-
-
修改服务器的主机名(简化连接服务器操作)
- 将localhost改成主机名
- vi /etc/hostname
- dd删除localhost那一行
- 添加自定义主机名(hadoop)
- reboot重启
-
配置主机名和ip地址的映射(简化日后操作集群,写主机名,自动翻译成主机地址)
- cd /usr/
- vi /etc/hosts(域名映射的配置文件,域名背后都对应一个IP地址)
- 最后一行添加 192.168.12.129(当前服务求的IP地址) Hadoop(自定义的主机名)
- 测试是否配置成功 ping 主机名(hadoop)
-
配置SSH(Secure Shell,加密的网络传输协议)远程免密登录
- 基于免密非对称加密算法 基于口令 两种远程登录方式
- 自已远程登录自己
- ssh-keygen -t rsa -P ‘’ -f ~/.ssh/id_rsa
- cd .ssh/
- cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- chmod 0600 ~/.ssh/authorized_keys
- ssh hadoop
- exit 登出
-
安装JDK
- jdk8.rpm
- rpm -ivh jdk-8u191-linux-x64.rpm
- java -version
-
安装Hadoop
- 2.6.0_x64.tar.gz-DLL
- tar -zxf hadoop-2.6.0_x64.tar.gz -C /usr
- ll /usr
- cd /usr/hadoop-2.6.0/
- ll
- include(相关模块知识)
- lib(可执行文件的jar包)
- sbin(系统管理指令)
- share(共享jar包,共享配置文件)
-
修改HDFS集群的配置文件
-
vi etc/hadoop/core-site.xml(解决全局性的内容)
-
在中拷贝
-
<property> <name>fs.defaultFS</name> <value>hdfs://hadoop:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/hadoop-2.6.0/hadoop-${user.name}</value> </property>
-
vi etc/hadoop/hdfs-site.xml(解决HDFS相关的内容,数据库的冗余备份只做一份,实际上设置为3/2)
-
在中拷贝
-
<property> <name>dfs.replication</name> <value>1</value> </property>
-
vi etc/hadoop/slaves
-
删掉localhost改成hadoop
-
-
添加环境变量的配置
-
java和Hadoop的环境变量配置到系统
-
vi .bashrc(修改root用户的环境)
【user_home/ .bashrc和user_home/ .bash_profile一样,两个相互连接修改当前用户的环境变量,开发使用】
【/etc/profile修改所有用户的环境变量】
-
在最先面 粘下来
-
HADOOP_HOME=/usr/hadoop-2.6.0 JAVA_HOME=/usr/java/latest CLASSPATH=. PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export JAVA_HOME export CLASSPATH export PATH export HADOOP_HOME
-
cd
-
source .bashrc(重新加载配置文件)
-
start-(管理指令)
-
四、使用
-
初始化操作(只需要在第一次启动HDFS集群之前执行,后续不需要执行,跳过即可)
- hdfs namenode -format
-
start-dfs.sh(启动)
-
stop-dfs.sh(停止)
-
验证服务是否启动成功
- 1、jps(java指令)
- 看到是三个node
- 10995 SecondaryNameNode # HDFS小蜜
- 10796 NameNode # HDFS Master
- 10877 DataNode # HDFS Slaves
- 2、http://服务器地址:50070
- 3、cd /usr/hadoop-2.6.0/logs/(分布式系统学会查看日志)
- ll
- 如果Namenode没有,查看nameNode的log文件
- 根据异常查看问题
#启动NameNode DataNode resourcesmanager nodemanager [root@hive1 hadoop-2.6.0]# sbin/hadoop-daemon.sh start namenode [root@hive1 hadoop-2.6.0]# sbin/hadoop-daemon.sh start datanode [root@hive1 hadoop-2.6.0]# sbin/yarn-daemon.sh start resourcemanager [root@hive1 hadoop-2.6.0]# sbin/yarn-daemon.sh start nodemanager
指令操作
- HDFS分布式文件系统操作类似于Linux文件系统
cp,mv,rm,cat,mkdir(常用指令十分相似) 没有vi (Hadoop专注于存和拿,不修改)
hdfs dfs -参数
/ 根目录
~ 用户家目录
上传 下载 删除
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...] # 查看文本文件内容
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...] # 修改属组
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] # 修改权限
[-chown [-R] [OWNER][:[GROUP]] PATH...] # 修改属主
[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>] # 从本地拷贝到HDFS
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] # 从HDFS拷贝到本地
[-count [-q] [-h] <path> ...] # 计数
[-cp [-f] [-p | -p[topax]] <src> ... <dst>] # 拷贝
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] # 下载
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]] # 帮助
[-ls [-d] [-h] [-R] [<path> ...]] # 查看目录列表
[-mkdir [-p] <path> ...] # 创建文件夹
[-moveFromLocal <localsrc> ... <dst>] # 从本地移动到HDFS
[-moveToLocal <src> <localdst>] # 将HDFS中的文件移动到本地
[-mv <src> ... <dst>] # HDFS中的文件或文件夹的移动
[-put [-f] [-p] [-l] <localsrc> ... <dst>] # 上传
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...] # 删除
[-rmdir [--ignore-fail-on-non-empty] <dir> ...] # 删除文件夹
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>] # 查看文本文件的末尾内容
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-usage [cmd ...]]
hdfs dfs -ls /usr/local
JAVA API操作(FileSystem对象)
-
环境搭建(Windows平台为例)
- 解压缩Hadoop的安装包(放在根目录)
- 把hadoop_dll2.6.0_64bit中的winutils.exe和hadoop.dll拷到hadoop-2.6.0下的bin目录中(Hadoop在Windows平台开发的两个兼容文件)
- C:\Windows\System32\drivers\etc
- 192.168.108.146 hadoop
- 在hosts文件中添加主机名和IP地址的映射关系
- 重启开发工具加载配置文件
- 配置Hadoop环境变量
- 新建HADOOP_HOME
-
实战
- 创建Maven工程,并导入
-
解决权限问题
@org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/baizhi":root:supergroup:drwxr-xr-x * 解决方案: 1. 修改权限 (UGO) o+w 2. 修改操作hdfs用户身份:-DHADOOP_USER_NAME=root 3. 关闭hdfs权限检查功能: hdfs-site.xml vi /usr/hadoop-2.6.0/etc/hadoop/hdfs-site.xml <property> <name>dfs.permissions.enabled</name> <value>false</value> </property>
-
测试代码
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; 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 org.apache.hadoop.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; /** * hdfs java api测试 * FileSystem */ public class HDFSDemo { /** * hdfs 客户端操作对象 */ private FileSystem fileSystem = null; private Configuration configuration = null; @Before public void doBefore() throws URISyntaxException, IOException { URI uri = new URI("hdfs://hadoop:9000"); configuration = new Configuration(); fileSystem = FileSystem.get(uri, configuration); } /** * 文件上传 * put * copyFromLocal * moveFromLocal * * @org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/baizhi":root:supergroup:drwxr-xr-x * 解决方案: 1. 修改权限 (UGO) o+w 2. 修改操作hdfs用户身份:-DHADOOP_USER_NAME=root 3. 关闭hdfs权限检查功能: hdfs-site.xml <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> */ @Test public void testUpload() throws IOException { Path src = new Path("G:\\apache-tomcat-7.0.85.zip"); Path dst = new Path("/baizhi"); fileSystem.copyFromLocalFile(src, dst); } @Test public void testUpload2() throws IOException { FileInputStream src = new FileInputStream("F:\\生态图.png"); Path dst = new Path("/baizhi/test"); FSDataOutputStream dstOutputStream = fileSystem.create(dst); IOUtils.copyBytes(src, dstOutputStream, configuration); } /** * 下载文件 * get * copyToLocal * moveToLocal */ @Test public void testDownload() throws IOException { Path src = new Path("/baizhi/test"); Path dst = new Path("G:\\1.png"); fileSystem.copyToLocalFile(src, dst); } @Test public void testDownload2() throws IOException { FSDataInputStream inputStream = fileSystem.open(new Path("/baizhi/test")); FileOutputStream outputStream = new FileOutputStream("G:\\2.png"); IOUtils.copyBytes(inputStream, outputStream, configuration); } /** * 删除文件 */ @Test public void testDelete() throws IOException { // fileSystem.delete(new Path("/baizhi/test"),false); // true代表递归删除 fileSystem.delete(new Path("/baizhi"), true); } @Test public void testOther() throws IOException { // rwxrw-r-- /baizhi // fileSystem.mkdirs(new Path("/baizhi"), new FsPermission(FsAction.ALL, FsAction.READ_WRITE, FsAction.READ)); boolean exists = fileSystem.exists(new Path("/baizhi")); System.out.println(exists?"存在":"不存在"); } @After public void doAfter() throws IOException { fileSystem.close(); } }
HDFS架构(开发时操作的是NameSpace)
-
HDFS集群的核心架构,标准的主从架构(master\slave)
-
NameNode(master)名称节点
-
协调者,管理者,负责集群管理和元数据的管理
-
主要作用:负责对nameSpace进行操作,以及处理客户端的请求与响应,一个nameSpace背后对应一到N个数据块
-
存储数据
-
第一次:客户端通过Path(dst),即NameSpace请求到NameNode,NameNode对数据进行处理,分散存储到DateNode里,返回DateNode的地址列表给客户端
-
第二次:发送真正的数据请求,数据被切割,分块存放到DateNode里,block块(128M/块,早期64M/块)
-
-
取数据
- nameNode使用内存存放元数据MetaData(nameSpace和数据块的映射信息以及数据块的冗余信息【针对block进行冗余备份,DataNode1的第一块存放在DataNode2里,第二块存放在DateNode3里,包含本身默认三个备份replicas】)
-
-
DateNode(slave)…(多个)
- 作用:存放数据,block管理数据,提供读写访问接口,数据块冗余同步等
- Rack:机架(快的冗余备份机制)
- 一个备份放在同机架的数据节点里面(快)
- 一个备份放在不能机架的不同数据节点里面(容灾)
-
-
HDFS适合小文件存储吗?(面试)
-
一个大文件 1000MB
- 10000/128=79个Blok
- 占用率:10000MB存储
- NameNode(内存存储):一条元数据
- HDFS设计思量:针对大文件,寻址时间不能大于IO读写的时间,下载1M文件,寻找时间会大于IO读写
- yarn集群中MapperReduce应用的Application启动类中2、设置计算数据的输入格式combineInputFormat整合小文件到一个分片数据中
-
10000个小文件总共10000MB
-
10000个block
-
占用率:10000MB存储
-
NameNode(内存存储):一万条元数据,导致大量内存空间被占用
-
-
答:小文件过多,浪费block,并会过多占用Namenode的内存,HDFS适用于高吞吐量,而不适合低时间延迟的访问。文件过小,寻道时间大于数据读写时间,这不符合HDFS的设计原则
-
元数据的持久化机制
-
好处:保证数据绝对不会丢失,并且fsimage加速NameNode元数据的恢复速度
-
内存快照+追加日志的方式(同redis)
-
hdfs Namenode-format(第一次使用,格式化操作)
-
在nameNode中产生fsimage(内存快照)和editslog(编辑日志)文件
-
start-dfs.sh启动
-
数据存储在Namenode中(内存)
-
先在editslog中记录用户对Namenode的写操作
-
SecondaryNameNode辅助NameNode(不存在也行,只是做优化)
- 定期到NameNode中下载fsimage和editslog文件
- 在自己的内存空间中先加载fsimage再执行editlog,重建元数据,NameNode会新建new_editslog文件,记录用户新的写操作日志。SecondaryNameNode产生快照文件fsimage,将fsimage响应给NameNode,替换掉NameNode中的fsimage,NameNode中的new_editslog重命名为editlog
-
如果不存在SecondaryNameNode,fsimage和editslog合并的默认触发时机是集群重启的时候也就是nameNode重启的时候(每次重启的时候都会存一个集群的版本号【烦人】)
-
-
fsimage和new_editslog,持久化到磁盘中
-
Namenode和SecondaryNameNode区别?(面试)
- Namenode主要维护两个⽂件,⼀个是 fsimage ,⼀个是 editlog
- fsimage保存了最新的元数据检查点,包含了整个HDFS⽂件系统的所有⽬录和⽂件的信息。
对于⽂件来说包括了数据块描述信息、修改时间、访问时间等;对于⽬录来说包括修改时间、
访问权限控制信息(⽬录所属⽤户,所在组)等。 - editlog主要是在NameNode已经启动情况下对HDFS进⾏的各种更新操作进⾏记录,HDFS客户端执⾏所有的写操作都会被记录到editlog中。
- fsimage保存了最新的元数据检查点,包含了整个HDFS⽂件系统的所有⽬录和⽂件的信息。
- 为了避免editlog不断增⼤,secondary namenode会周期性合并fsimage和editlog成新的fsimage
- Namenode主要维护两个⽂件,⼀个是 fsimage ,⼀个是 editlog
-
age,NameNode中的new_editslog重命名为editlog
- 如果不存在SecondaryNameNode,fsimage和editslog合并的默认触发时机是集群重启的时候也就是nameNode重启的时候(每次重启的时候都会存一个集群的版本号【烦人】)
-
fsimage和new_editslog,持久化到磁盘中
-
Namenode和SecondaryNameNode区别?(面试)
- Namenode主要维护两个⽂件,⼀个是 fsimage ,⼀个是 editlog
- fsimage保存了最新的元数据检查点,包含了整个HDFS⽂件系统的所有⽬录和⽂件的信息。
对于⽂件来说包括了数据块描述信息、修改时间、访问时间等;对于⽬录来说包括修改时间、
访问权限控制信息(⽬录所属⽤户,所在组)等。 - editlog主要是在NameNode已经启动情况下对HDFS进⾏的各种更新操作进⾏记录,HDFS客户端执⾏所有的写操作都会被记录到editlog中。
- fsimage保存了最新的元数据检查点,包含了整个HDFS⽂件系统的所有⽬录和⽂件的信息。
- 为了避免editlog不断增⼤,secondary namenode会周期性合并fsimage和editlog成新的fsimage
- Namenode主要维护两个⽂件,⼀个是 fsimage ,⼀个是 editlog