修改虚拟机IP
复制网卡的配置
第一种方式:配置文件向识别的网卡兼容
1、 通过一个主机复制出多个主机
2、 开启复制的主机,启动时选择“复制”
3、 启动后查看IP ifconfig
查看系统识别的网卡
Ifconfig -a
这里ifconfig看不到IP 是因为系统识别的设备名称与系统配置文件不同导致。
配置文件名称
解决方案:
修改配置文件名为系统识别的名称(将eth0改为eth1)
修改eth1内的配置
保存退出,重启网卡(报错)
错误原因:VM软件为新系统分配了新的mac地址,配置文件中还是原始的。两个不匹配
查看系统分配的mac地址,并记录。
方案:将配置文件中的历史的mac改为新的Mac地址
重启网卡
查看IP ifconfig
第二种方式:识别的网卡向配置文件兼容
通过一个主机复制出多个主机
开启复制的主机,启动时选择“复制”
启动后
查看IP ifconfig
查看系统识别的网卡
Ifconfig -a
这里ifconfig看不到IP 是因为系统识别的设备名称与系统配置文件不同导致。
配置文件名称
方案:让系统识别的eth1变为eth0
第一步:修改配置文件
文件中有两个配置,删除其中任意一个,修改剩下的一个配置将address改为系统新分配的mac地址,将NAME改成eth0,保存退出
第二步:修改配置文件
中的mac地址为系统重新分配的地址。保存退出
第三步:重启系统 reboot
002_Linux_随堂笔记_终版
操作系统
Windows 10
操作系统的分类
* 桌面操作系统
* 服务器操作系统
* 嵌入式操作系统
* 移动设备操作系统
桌面操作系统
* Window 系列
* macOS
* Linux
服务器操作系统
Linux
Windows Server
嵌入式操作系统
Linux
Linux创始人
林纳斯 托瓦兹
脱发兹 linux是开源免费
Linux分类
商业版 Redhat
稳定版 6.4 6.6 6.8 7.0(偶数)
开发板 6.5 5.7 6.9 (奇数)
免费版 CentOS
稳定版6.4 6.6 6.8 7.0
开发板 6.5 5.7 6.9
界面最好的
Ubuntu
国内的
红旗 中标麒麟
Linux 系统需要记住的目录
/etc: 系统配置,启动程序
/home:普通用户的家,目录默认数据存放目录
/mnt:临时挂载储存设备的挂载点,u盘插入光驱无法使用,需要挂载然后使用
/opt:额外的应用软件包
/root:Linux超级权限用户root的家目录
/tmp:临时文件目录,这个目录被当作回收站使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GSWVWcxj-1624768770724)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps161.png)]
文件夹的增删改查
添加 mkdir XXX
mkdir –p XXX
删除 rm –rf XXX
修改 mv XX XXX
查询 ll [-a]
ls [-a] [-l]
复制 cp [-a/-r] 原文件夹 目标文件夹
文件的增删改查
添加 touch 空文本
echo ‘XXXX’ > 或 >> 文本
删除 rm –rf xxx
修改 mv XX XXX
查询 ll [-a]
ls [-a] [-l]
查看内容
前10行 head 文件名
head -10 文件名
后10行 tail -10 文件名
查看所有
cat 文件名
赤壁
数据过滤
grep [参数] 关键字 文件名
编辑 ???
其他
当前所在的目录 pwd
清空屏幕 clear
软连接 ln -s 目标文件绝对路径 快捷方式路径
帮助文档 命令 --help
&& 前面的命令执行成功再执行后面的。
|| 前面的命令执行失败再执行后面的。
Vi编辑器的常用命令
1、 VI编辑器的三种模式
a) 命令模式
b) 编辑模式
c) 末行模式末行模式
保存并退出 :wq / x!
不保存强制退出 :q!
行内移动
以单词为单位向后移动 w
以单词为单位向前移动 b
光标移动到行首 0 / ^
光标移动到行尾 $
行数移动
移动到首行 gg
移动到尾行 G
定位到某一行 数字gg / 数字G / :数字
段落
以段落为单位后移 }
以段落为单位前移 {
撤销
撤销命令 u
取消撤销/恢复撤销 Ctrl r
删除文本
删除多行 数字dd
删除一行 dd / 1dd
在光标所在的位置删除至行尾 D
在光标所在的位置删除至行首 d0 / d^
剪切 x
复制
复制多行 数字yy
复制一行 yy
粘贴 p
替换的命令
替换的是光标所在的位置以及后面的数据 R
只替换光标右侧的第一个字符 r
文件夹内查找
通过文件名指定路径查找 find 路径 -name *.txt
通过文件名在当前路径查找 find -name *.txt
文件内查找
/查找的内容
向上查找 N
向下查找 n
文件内替换
:%s/旧文本/新文本/g [c]
进入编辑模式【插入】
I、A、O / i、a、o
压缩命令
gzip
制作压缩文件 tar zcvf 压缩文件名.tar.gz 被压缩的文件/文件夹
解压压缩文件 tar zxvf 压缩的文件名.tar.gz -C 路径
bzip2
制作压缩文件 tar jcvf 压缩文件名.tar.bz2 被压缩的文件/文件夹
解压压缩文件 tar jxvf 压缩的文件名.tar.bz2 -C 路径
关机
halt
重启
reboot
用户权限
drwxr-xr-x. 2 root root 4096 9月 14 23:15 aa
d:表示文件夹
rwx:当前用户具备的权限
r-x:当前用户所属的组具备的权限
r-x:其他用户所具备的权限
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mKqGTGaI-1624768770725)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps165.jpg)]
root:文件所属的用户
root:文件所属的用户所属的组
4096 :文件大小
9月 :文件创建的月份
14 23:15 文件创建的日期
aa:文件名
读权限:数字表示4
写权限:数字表示2
执行权限:数字表示1
读写执行能够构成的数字和是1、2、3、4、5、6、7
用户和组的添加
组的操作
添加组 groupadd 组名
删除组 groupdel 组名
查询当前所有的组 cat /etc/group
修改组 chgrp 组名 文件/目录名
用户的操作
添加用户同时指定组 useradd -g 组名 用户名
添加用户 useradd 用户名 【未指定组时,创建一个与用户名相同的组】
删除用户(删除家目录):userdel –r 用户名
查看当前用户 cat /etc/passwd
为用户设置密码 passwd 用户名
用户切换
Su 用户名
Root用户 切换到普通用户无需密码,普通用户之间切换需要密码
退出用户 exit
普通用户临时借用root权限使用sudo 命令【普通用户已经添加到/etc/sudoers文件中】
修改权限
1、chmod [-R] 777 文件名/文件夹名
2、chmod /- rwx 文件名|目录名
3、chmod -R u=rwx,g=rwx,o=rwx 文件名|目录名
修改文件所属的组
chown -R 新用户:新用户的组 文件名/文件夹名
其他命令
获取当前日期 date
更新当前日期 date -s “yyyy-MM-dd HH:mm:ss”
查看磁盘空间 df -h
查看某一目录所占空间大小 du -h
查看进程详细信息 ps aux
查看cpu内存等使用情况 top
杀死某一进程 kill [-9] 进程号
查看内存使用率 free –h [-m/-g]
/opt目录下创建文件夹“dashuju”
在/opt/dasguju内创建10个文件,文件名为wenjian1.txt wenjian2.txt wenjian3.txt
… … wenjian10.txt
在目录/opt中,将dashuju文件夹中的内容添加到gzip格式的压缩文件dashuhu.tar.gz中
将压缩命令和过程截图发群里
进入 /opt/dasguju内 将文件wenjian1.txt wenjian2.txt wenjian3.txt
… … wenjian10.txt 添加到bzip2.tar.bz2 压缩文件中
将bzip2.tar.bz2的解压命令以及过程发到群里
添加“mingren”“woailuo”用户,属于huoying组
Mingren 密码:123321
Woailuo 密码:456654
使用mingren用户,添加新用户“kakaxi”
使用mingren用户在/tmp目录下创建文件1.txt, 将权限修改成rw-r-x-wx
使用woailuo用户在/tmp目录下创建文件2.txt, 文件所属组从woailuo: huoying
使用woailuo用户将系统日期修改成“2020-12-12 12:12:12”
使用woailuo用户查看系统磁盘使用情况【不显示单位】,记做截图1
查看cpu使用率 截图2,内存使用率 截图3。将三个截图截到一个图中发到群里。【添加姓名】
添加用户mignren1、mignren2、… … mingren5,所有人归属于mignren组
添加用户xiaoying1、xiaoying2、… …xiaoying5,所有人归属于xiaoying组
添加用户dou1、dou2、… …dou5,所有人归属于dou组
使用root用户创建文件huoying.txt
修改huoying.txt所属的用户和组。修改为mignren4用户,mignren组
修改权限使得
mignren4用户具有读写执行
mignren组所有成员具有读写权限,没有执行权限。
Xiaoying组和dou等其他组具有读权限,没有写和执行权限
Cut
按照字符提取 head -2 1.txt | cut -c 5
指定分隔符 head -2 1.txt | cut -d ‘:’ -f 1,2
Sort
文本排序 sort 文件名
文本排序反转 sort -r 文件名
文本排序去重 sort -u 文件名
数值按大小排序 sort -n 文件名
指定分隔符、指定排序列 sort -t ‘分隔符’ -k2nr 文件名
Wc
查看文件基本信息 wc 文件名
查看文件行数 wc – l 文件名
查看文件单词数 wc -w 文件名
查看文件字节 wc -c 文件名
查看多个文件信息 wc 文件1 文件2 文件3
Uniq
与sort连用
排序、去重 cat 5.txt | sort | uniq
排序、去重计算总数 cat 5.txt | sort | uniq -c
Tee
数据定位到多个文件 cat 5.txt | tee a.txt b.txt c.txt
Tr
小写i 替换成 echo “itheima” | tr ‘i’ ‘I’
把 HELLO 转成 小写 echo “HELLO” |tr ‘[A-Z]’ ‘[a-z]’
删除数字 echo ‘abc1d4e5f’ | tr -d ‘[0-9]’
Split
按照文件大小切分 split -b 10k 被切分的文件
按照行数进行切分 split -l 1000 被切分的文件
Awk
模糊查询 awk ‘/zhangsan|lisi/’ score.txt
按照分隔符拆分,根据角标显示
awk -F ‘,’ ‘{print 1, 2,
按照分隔符拆分,根据角标显示并指定分隔符
awk -F ‘,’ ’ {OFS="==="}{print
支持函数 awk -F ‘,’ ‘{print toupper(2),3*100}’ 1.txt
If判断语句
awk -F ‘,’ ‘{if(4>60) print 4, “及格”; else print 1,
Shell编程
Shell 脚本的解释器
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
脚本的编写规范
首行描述解释器 #!/bin/bash
执行脚本的三种方式
1、bash 脚本名称 脚本参数
2、 sh 脚本名称 脚本参数
3、 ./脚本名称 脚本参数【./脚本名称之间没有空格】【chmod 777 脚本名称】
变量的声明
变量名=”值”【中间不能有空格】
变量名要求 字母或下划线或数字(开头不能是数字)构成
变量的引用
使用 或 {}引用变量
删除变量 只读变量
删除 unset 变量名
只读 readonly 变量名
字符串使用
双引号(””):内部可以使用变量
反引号(``):表示可执行
单引号(‘’):内部所有的原样输出
字符串长度及截取
长度: echo ${#skill}
截取: echo ${str:2:2} 【在第二个字符开始截取截取两位】
脚本参数传递
bash 脚本名 参数1 参数2 参数3 。。。。。。
脚本内
$0 脚本名称
$1 参数1
$2 参数2
$n 参数n
$* 所有参数
$# 参数的个数
算数运算符
加法计算 expr 2 2
乘法计算 expr 2 * 2
流程控制if
if [ $a -gt 10 ];then
代码1
elif [ $a -lt 10 ];then
代码2
else
代码3
fi
关系运算符
大于 | 小于 | 大于等于 | 小于等于 | 等于 | 不等于 |
---|---|---|---|---|---|
-gt | -lt | -ge | -le | -eq | -ne |
循环
For 循环
For aa in XXXX
do
循环体
done
While循环
While 条件 ;
do
循环体
done
跳出循环
跳出所有循环 break
跳出当前循环,进入下一次循环 continue
case ()
case 值 in
结果1)
结果1对应的操作;;
结果2)
结果2对应的操作;;
结果3)
结果3对应的操作;;
esac
接收控制台数据
read 变量名
函数的使用
函数声明: [function] 函数名(){
函数体
$参数1
$参数2
$参数3
}
函数调用
函数名 参数1 参数2 参数3
数组
数组声明: 数组名称=(元素1 元素2 元素3 元素4)
数组的使用
单个使用 echo 数组名[角标] 【角标从0开始】
遍历数组 for var in ${my_arr[*]}
do
echo $var
done
文件加载
在文件中添加 . 脚本名称 或者 source 脚本名称
#!/bin/bash
source ./test1.sh # 加载test1.sh 的文件内容
实操部分
1、linux 服务器添加硬盘并进行分区,实现自动挂载
1、添加硬盘:在虚拟机中添加硬盘(忽略),添加后重启服务器,发现新硬盘
2、硬盘分区:查看硬盘 fdisk –l
Fdisk /dev/sdb
n
p
分区一的开始 1
分区一的结尾 自定义1
分区二的开始 自定义1 1
分区二的结尾 自定义2
w
3、磁盘格式化
mkfs -t ext4 /dev/sdc1
mkfs -t ext4 /dev/sdc2
4、硬盘挂载(临时挂载:重启linux系统后,不会挂载)
mount /dev/sdc2 /mnt/disk1/
mount /dev/sdc2 /mnt/disk2/
取消挂载
umount /mnt/disk2/
5、开机自动挂载(自动挂载:重启linux系统后,会自动挂载)
修改/etc/fstab
添加UUID=新硬件的UUID 挂载点路径 格式等
重启
其他说明
硬盘删掉后,/fstab没有删除UUID重启报错
使用 mount -o remount rw / 重新挂载,能够编辑/etc/fstab
删掉 添加UUID=新硬件的UUID
重启
光驱的挂载
目标虚拟机, 右键 设置
选中 CD/DVD, 浏览 选中本地的 centOS 镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tApR2o3c-1624768770730)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps174.png)]
创建目录 mkdir -p /mnt/cdrom
第一种方式挂载(仅限于VM):
挂载镜像文件 mount /dev/sr0 /mnt/cdrom
df -h
第二种方式挂载(上传ISO文件)
mount –o loop /tmp/CentOS-6.9-x86_64-bin-DVD1.iso /mnt/cdrom
2、软件的相关操作
安装部署
a: rpm -ivh 软件包名 【不能解决依赖问题】
b: yum install –y 软件名 【Yum解决依赖问题,用户无需关注】
查看
rpm -qa | grep 关键字(软件名)
卸载软件
rpm –e [–nodeps] 软件包名
3、 本地资源库安装部署
前提:本地需要有一个系统的ISO镜像文件 或 光盘,并且挂载到系统的某一目录(/mnt/cdrom)
进入系统目录/etc/yum.repos.d中,创建文件夹old。将目录中的所有.repo文件移动到old中。【系统自动到/etc/yum.repos.d找.repo文件】
拷贝CentOS-Media.repo 文件到/etc/yum.repos.d中,修改该文件。
将
[c6-media]name=CentOS-$releasever - Mediabaseurl=file:///media/CentOS/file:///media/cdrom/file:///media/cdrecorder/gpgcheck=1enabled=0gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
改为
[c6-media]name=CentOS-$releasever - Mediabaseurl= file:///mnt/cdrom/gpgcheck=0enabled=1
保存退出
清空yum 缓存 yum clean all
查询mysql软件包是否能找到 yum search mysql
安装mysql yum install -y mysql-server
4、网络yum源的配置过程
原理:一个节点配置资源库,其他节点通过http服务访问该节点资源,其他节点无需安装资源库。
Node01:资源库节点
Node02:其他节点
1、 在Node01安装httpd软件,并启动
a) yum install –y httpd
b) /etc/init.d/httpd status
i. /etc/init.d/httpd start
ii. /etc/init.d/httpd status
2、 到Node01节点的/var/www/html路径下,创建资源库路径的软连接
a) ln -s /mnt/cdrom /var/www/html/cdrom
b) 通过浏览器查看(关闭防火墙 /etc/init.d/iptables stop【重启系统时会启动】)防火墙开机不自启命令 chkconfig iptables off(on自启)
3、进入Node02节点的系统目录/etc/yum.repos.d中,创建文件夹old。将目录中的所有.repo文件移动到old中。【系统自动到/etc/yum.repos.d找.repo文件】
拷贝CentOS-Media.repo 文件到/etc/yum.repos.d中,修改该文件。
将
[c6-media]name=CentOS-$releasever - Mediabaseurl=file:///media/CentOS/file:///media/cdrom/file:///media/cdrecorder/gpgcheck=1enabled=0gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
改为
[c6-media]name=CentOS-$releasever - Mediabaseurl= http://192.168.10.132/cdrom gpgcheck=0enabled=1
保存退出
清空yum 缓存 yum clean all
查询mysql软件包是否能找到 yum search mysql
安装mysql yum install -y mysql-server
5、JDK安装部署
1、软件包的上传大到/export/soft
2、加压安装包到/export/servers
tar -zxvf jdk-8u65-linux-x64.tar.gz -C /export/servers/
3、 修改系统配置创建vi /etc/profile.d/java.sh文件,添加一下内容,保存并退出
export JAVA_HOME=/export/servers/jdk1.8.0_65
export PATH=
JAVA_HOME/bin
4、使配置生效
source /etc/profile
5、更新/usr/bin/java 软链接
a) 删除/usr/bin/java链接 rm -rf /usr/bin/java
b) 创建新的软连接(将java1.8解压路径下的bin/java链接到/usr/bin/) ln -s /export/servers/jdk1.8.0_65/bin/java /usr/bin/java
6、验证是否生效
java -version
补充: 查看软件包安装在哪里 whereis java
查看历史所有的命令 history
6、TomCat安装部署【不用背】
1、软件包的上传与解压
tar zxvf apache-tomcat-6.0.53.tar.gz -C …/servers/
2、直接启动,并查看启动日志
./startup.sh && tail -100f …/logs/catalina.out
3、验证,在浏览器访问http://192.168.10.132:8080/
7、Mysql安装部署
7.1
a、安装部署 yum install -y mysql-server
b、启动mysql /etc/init.d/mysqld start
c、设置用户名密码 /usr/bin/mysqladmin -u root password ‘123456’
d、使用root登录 mysql -uroot -p123456
Mysql命令
查看数据库列表 show databases;
查看数据表 show tables;
数据库切换 use 数据库名
7.2
解决中文乱码
A: 查看当前编码集
mysql -uroot -p123456
show variables like ‘character_set_%’;
B:修改配置/etc/my.cnf
在/etc/my.cnf中添加一下内容
[client]default-character-set=utf8[mysql]default-character-set=utf8[mysqld]character-set-server=utf8
最终结果
C: 重启mysql
/etc/init.d/mysqld restart
D: 查看编码集
7.3 解决mysql远程连接失败
远程连接工具连接mysql报错如下
原因:mysql允许远程连接的服务器收到限制
修改mysql配置
A: mysql -uroot -p123456
B: mysql> use mysql
C: select host, user ,password from user;
D: 修改远程限制,让root用户在任意节点使用123456都能够访问
grant all privileges on *.* to ’ root ‘@’ % ’ identified by ’ 123456 ’ with grant option;
E: 刷新配置
flush privileges;
F: 查看最终结果
select host, user ,password from user;
G:再次连接
8、定时任务crontab
基本操作
查看已经配置的定时任务 crontab -l
编辑/添加新的定时任务 crontab -e
删除当前用户所有的任务 crontab -r
基本语法
* * * * * 命令/操作/动作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQ6WXzKa-1624768770736)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps187.jpg)]
9、时钟同步
A:与阿里云同步 ntpdate ntp4.aliyun.com
B: 局域网内部与某一个节点同步
1、 服务节点安装ntpd软件,并启动。
2、 修改配置/etc/ntp.conf
a) 解开第18行的注释,并将网段设置正确restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
b) 注释掉第22-25行#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c) 在文档最后 添加两个设置server 127.127.1.0
fudge 127.127.1.0 stratum 10
3、 修改配置文件/etc/sysconfig/ntpd保证BIOS与系统时间同步 添加SYNC_HWLOCK=yes ,保存退出
4、 重启ntpd 服务/etc/init.d ntpd restart
5、 到其他节点执行同步命令ntpdate 192.168.10.132(时钟同步服务器的IP)
6、验证
10、集群部署及无密码访问
1、部署多台服务器(linux系统)
2、修改每个节点的主机名 /etc/sysconfig/network
注意:重启后生效
3、配置ip [动态或者静态]
4、配置每个主机的 主机名和IP的对应关系 /etc/hosts
5、验证
远程拷贝命令
scp [-r] 文件/文件夹 目标节点:/目标路径
scp /export/aaa/01.txt root@192.168.100.202:/export
scp /export/aaa/02.txt root@hadoop02:/export
scp /export/aaa/02.txt hadoop02:/export
scp /export/aaa/02.txt hadoop02:/$PWD
11、无密码登录
方式一
1、生成公钥私钥 ssh-keygen 回车 回车 回车 回车
公钥私钥所在的路径 /root/.ssh
2、将公钥内的内容写入到目标服务器(免密码登录的节点)内的/root/.ssh/authorized_keys文件内(没有authorized_keys自己创建)
authorized_keys用户存储可以登录本节点的所有公钥
3、验证(无密码登录)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sNB48NIP-1624768770740)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps193.jpg)]
方式二
1、生成公钥私钥 ssh-keygen 回车 回车 回车 回车
公钥私钥所在的路径 /root/.ssh
2、ssh-copy-id 目标节点主机名/ip
3、验证(无密码登录)
003_大数据基础_随堂笔记_终版
什么是大数据
数据集(数据量)的大小已经超过了现有传统数据库软件的计算、处理能力的数据就是大数据
现有传统数据库软件
MysqlSQL (一亿) SQLServer Oracle(十亿) DB2
大数据的特点(4v)
海量化:数据量庞大 Tb是基本单位
多样化:数据类型比较多。例如:结构化数据(关系型数据库)、半结构化数据、非结构化数据
快速化:数据量的增长速度非常快
高价值:海量数据中含有的价值比少量数据更高。
本质:少量数据是微观角度,海量数据是宏观角度。宏观角度看待数据相对更真实。
大数据能做什么
前提:在海量数据的背景下
1、 海量数据的快速查询
2、 海量数据的存储
3、 海量数据的快速计算
4、 海量数据的实时计算
5、 海量数据的数据挖掘大数据从事的岗位
1、ETL工程师
2、数据仓库工程师
3、大数据开发工程师
4、Hadoop工程师
5、Spark/Flink工程师
6、大数据分析师
7、大数据算法工程师
8、大数据运维工程师
9、大数据解决方案
学习的技术
大数据项目流程
1、 数据生产
2、 数据收集
3、 数据存储
4、 需求分析
5、 数据预处理
6、 数据计算
7、 结果数据存储
8、 结果数据展示什么是服务器
也称伺服器,是一种高性能计算机,提供计算服务的设备。
服务器的类型
用途
通用性和专用型服务器
按机箱划分
1U 2U 4U 价值2w-15w
塔式服务器
刀片机
小型机 价值几百万
大型机 价值几千万
硬盘的划分
机械硬盘
SSD固态硬盘
混合硬盘
RAID
RAID0: 物理层连不做备份(冗余)空间使用率100%
RAID1: 两块硬盘做一个Raid1,物理层连做一份数据备份,空间使用率50%
什么是集群
集群是一组相互独立的、通过高速计算机网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。
什么是网络
计算机网络是指 将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
什么是交换机
交换机(Switch)意为“开关”是一种用于电(光)信号转发的网络设备。
什么是局域网
局域网是指在某一区域内由多台计算机互联成的计算机组
什么是网络拓扑
网络拓扑(Network Topology)结构是指用传输介质互连各种设备的物理布局
类型
以太网
优点:价格低廉、随处可见、软件支持比较丰富
缺点:网络传输时延时较大,吞吐量较小
适用场景:构建常用的局域网络
InfiniBand网络
优点:吞吐量高,速度快、延时低
缺点:价格昂贵,软件支持比较少
适用场景:在高速网络环境中适用
和谐号复兴号为什么那么快
1、和谐号分布式动力。每节车厢都有动力
004_HDFS_随堂笔记_10-12
复制网卡的配置
第一种方式:配置文件向识别的网卡兼容
4、 通过一个主机复制出多个主机
5、 开启复制的主机,启动时选择“复制”
6、 启动后查看IP ifconfig
查看系统识别的网卡
Ifconfig -a
这里ifconfig看不到IP 是因为系统识别的设备名称与系统配置文件不同导致。
配置文件名称
解决方案:
修改配置文件名为系统识别的名称(将eth0改为eth1)
修改eth1内的配置
保存退出,重启网卡(报错)
错误原因:VM软件为新系统分配了新的mac地址,配置文件中还是原始的。两个不匹配
查看系统分配的mac地址,并记录。
方案:将配置文件中的历史的mac改为新的Mac地址
重启网卡
查看IP ifconfig
第二种方式:识别的网卡向配置文件兼容
通过一个主机复制出多个主机
开启复制的主机,启动时选择“复制”
启动后
查看IP ifconfig
查看系统识别的网卡
Ifconfig -a
这里ifconfig看不到IP 是因为系统识别的设备名称与系统配置文件不同导致。
配置文件名称[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHFWR9Jz-1624768770748)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps211.jpg)]
方案:让系统识别的eth1变为eth0
第一步:修改配置文件[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLqDKjxr-1624768770748)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps212.jpg)]
文件中有两个配置,删除其中任意一个,修改剩下的一个配置将address改为系统新分配的mac地址,将NAME改成eth0,保存退出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5iuXk5Cj-1624768770748)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps213.jpg)]
第二步:修改配置文件[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXl5Rgks-1624768770749)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps214.jpg)]中的mac地址为系统重新分配的地址。保存退出
第三步:重启系统 reboot
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nnUOcH6h-1624768770749)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps215.jpg)]
004_HDFS_随堂笔记_10-12
传统数据与大数据的对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LnKkEXxm-1624768770749)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps216.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MX7yZ18K-1624768772937)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps217.png)] |
传统Linux系统与大数据linux系统安装的区别
传统
系统硬盘(与数据硬盘100%隔离)
两块硬盘做一个RAID1
引导分区 200M
交换分区 内存的两倍
根分区 /(所有的空间)
数据硬盘
多个硬盘制作一个逻辑卷,即将多个物理硬盘制作成一个大的逻辑硬盘
大数据
系统硬盘
两块硬盘做一个RAID1
引导分区 200M
交换分区 可以不设置或设置的很小。因为在大数据中需要将其关闭
根分区 /(所有的空间)
数据硬盘
多个硬盘,每个硬盘独立挂载,有多少个硬盘,挂载多少个目录
数据硬盘优先不做RAID,必须做时,做RAID0
做RAID: 优点:数据的读写效率稍高,缺点:不支持热插拔。一个硬盘损坏,整个服务器需要全部关机再能处理该硬盘。不做RAID: 优点:支持热插拔。硬盘损坏即把即插。不用关机。缺点:数据的读写效率稍低。
传统数据与大数据处理方式对比
大数据技术快的原因
1、分布式存储
2、分布式并行计算
3、移动程序到数据端
4、更前卫、更先进的实现思路
5、更细分的业务场景
6、更先进的硬件技术 更先进的软件技术
Hadoop发展史
Hadoop之父 Doug Cutting
2003-2004年 谷歌发布了三篇论文,Doug Cutting基于这三篇论文进行了实现,构成了hadoop的原型。
Hadoop三大公司
1、 apache
2、 hortonWorks
3、 Cloudera
4、 星环科技(国内)
创建三台虚拟机
主机名 node01、node02、node03
Ip 自己定
磁盘大小50G
Hadoop集群安装部署
1、 服务器主机名和IP配置(三台)
2、 修改每个主机的/etc/hosts文件,添加IP和主机名的对应关系(三台)
3、 管理节点到从节点配置无密码登录
4、 配置jdk 1.8(三台)
5、 关闭防火墙(三台)
6、 关闭selinux(三台)vi /etc/selinux/config
SELINUX=enforcing à SELINUX=disabled
重启系统
安装流程
1、 上传软件包到管理节点,在管理节点解压并配置
2、 将修改完的解压包,远程拷贝到所有的从节点
3、 启动软件Hadoop安装部署
1、 软件包上传并解压
a) tar -zxvf hadoop-2.6.0-cdh5.14.0-with-centos6.9.tar.gz -C …/servers/
2、 第二步查看hadoop支持的压缩方式以及本地库
a) ./hadoop checknative
b) 安装opensslyum -y install openssl-devel
./hadoop checknative
3、 修改配置文件
a) core-site.xml
b) hdfs-site.xml
c) Hadoop-env.sh (不用改)
d) mapred-site.xml
i. cp mapred-site.xml.template mapred-site.xml
ii. 修改
e) yarn-site.xml
f) slaves
4、 创建文件夹
mkdir -p /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/tempDatasmkdir -p /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/namenodeDatasmkdir -p /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas mkdir -p /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/editsmkdir -p /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/snn/namemkdir -p /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/snn/edits
5、安装包的分发
scp -r hadoop-2.6.0-cdh5.14.0/ node02:$PWD
scp -r hadoop-2.6.0-cdh5.14.0/ node03:$PWD
6、配置hadoop环境变量
a) 创建文件/etc/profile.d/hadoop.sh 并编辑export HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
export PATH=
HADOOP_HOME/bin
b) source /etc/profile
7、 启动集群
a) 格式化集群在第一个节点执行 hadoop namenode -format
b) 启动
i. 每个组件独立启动
1. 启动namenode node01节点 ./hadoop-daemon.sh start namenode
2. 启动datanode node01、02、03节点 ./hadoop-daemon.sh start datanode
3. 启动resourcemanager node01节点 ./yarn-daemon.sh start resourcemanager
4. 启动nodemanager node01、02、03节点 ./yarn-daemon.sh start nodemanager
ii. 单独启动
1. 单独启动HDFS : ./start-dfs.sh 关闭 ./stop-dfs.sh
2. 单独启动Yarn : ./start-yarn.sh 关闭 ./stop-yarn.sh
iii. 一键启动所有启动: ./start-all.sh 关闭:./stop-all.sh
8、浏览器查看启动页面
http://主节点ip:50070
http://主节点ip:8088
Hadoop集群初体验
数据的上传
创建文件夹:hadoop fs -mkdir /BD19
查看文件夹内容: hadoop fs -ls /BD19
上传数据:hadoop fs -put XXX.txt /BD19
大数据计算
计算pi 3.141592653……
hadoop jar /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/mapreduce/
hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar pi 10 100
背诵次数:
读的遍数(全部):
截止时间:
10月29日
1、传统数据与大数据的对比
2、大数据服务器安装规范
系统硬盘
两块硬盘做一个RAID1
引导分区 200M
交换分区 可以不设置或设置的很小。因为在大数据中需要将其关闭
根分区 /(所有的空间)
数据硬盘
多个硬盘,每个硬盘独立挂载,有多少个硬盘,挂载多少个目录
数据硬盘优先不做RAID,必须做时,做RAID0
做RAID: 优点:数据的读写效率稍高,缺点:不支持热插拔。一个硬盘损坏,整个服务器需要全部关机再能处理该硬盘。不做RAID: 优点:支持热插拔。硬盘损坏即把即插。不用关机。缺点:数据的读写效率稍低。
3、传统数据与大数据处理方式对比
4、大数据技术快的原因
1、分布式存储
2、分布式并行计算
3、移动程序到数据端
4、更前卫、更先进的实现思路
5、更细分的业务场景
6、更先进的硬件技术 更先进的软件技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DjbCmTvY-1624768770757)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps237.png)]分一个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1kE6oNN4-1624768770758)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps238.png)]
5、H adoop内部组成
HDFS: 海量数据的存储
MapReduce: 海量数据 的离线计算
Yarn: 集群资源调度
6、HDFS全称
Hadoop Distribute File System 即 Hadoop分布式文件系统
主要作用:即存储海量数据
为什么能存储海量数据??
因为其空间大,空间大的原因为服务器多、磁盘多。且支持扩展
7、HDFS组成部分
管理者-Master NameNode 集群中有1-2个,用于管理集群中的工作者
工作者-Slave DataNode 集群中有多个 用于存储计算数据
辅助管理 SecondaryNameNode 集群中有0-1 只负责辅助NameNode管理工作
8、HDFS存储数据的方式
以数据块的方式存储数据。默认一个数据块128M,该数值可以修改。
注意:这里的128仅仅是切分数据的阈值。
一个大的数据被切分成多个小的128M的数据块,分别存储在集群多个节点的不同位置。
数据副本机制
数据副本默认是3份。
一个数据存储到HDFS后,数据自动复制两份,共三份(三分相同的数据-数据冗余)
9、数据副本存放机制
第一个副本在客户端所在的节点(客户端也是集群内的节点),若客户端在集群外,那么根据一定的计算规则选一个节点。
第二份副本,在与第一份相同机柜,且不在同一个服务器的节点上。
第三份与第一份第二份不在同一个机柜,且逻辑距离(网络拓扑)最近的机柜选择一个节点存储。
10、什么是名字空间
名字空间:HDFS文件系统的目录树,目录结构。
11、NameNode的作用
1、 维护目录树,维护命名空间。
2、 负责确定指定的文件块到具体的Datanode结点的映射关系。(在客户端与Datanode之间共享数据)3、管理Datanode结点的状态报告
12、DataNode的作用
1、 负责管理它所在结点上存储的数据的读写,及存储数据。
2、 向Namenode结点报告DataNode节点的状态。
3、 通过流水线复制实现三份数据副本,
13、HDFS写入数据的流程
1、 client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传;
2、 client请求第一个block该传输到哪些DataNode服务器上;
3、 NameNode根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的DataNode的地址如:A,B,C;
4、 client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client;
5、 client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。
6、 数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipelineack发送给client;
7、关闭输出流。
8、 当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。
14、HDFS读取数据的流程
1、客户端通过调用FileSystem对象的open()来读取希望打开的文件。
2、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
3、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
4、 Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);
5、 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
6、并行读取,若失败重新读取
7、 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
8、返回后续block列表
9、 最终关闭读流,并将读取来所有的 block 会合并成一个完整的最终文件。
15、数据校验
1、 数据第一次写入成功后,会进行数据校验,获得校验和。
2、 数据读取前,对数据进行校验,获得校验和,计算得到的校验和与第一次上传后的校验和进行对比。
3、 两个校验和相同表示数据相同,可以提读取数据
4、 两个校验和不相同表示数据不相同,节点去其他节点读取
5、 数据节点周期进行校验和计算,防止数据丢失。 16、DataNode节点丢失周期
DataNode节点长时间没有给NameNode汇报心跳,NameNode认为其丢失。
长时间(10分钟 30秒): 2 * 超时时间 10 * 心跳周期
17、HDFS适用场景
1、 海量数据存储
2、 高容错
3、 商用廉价的硬件
4、 存储大文件
5、 一次写入多次读取 18、HDFS不适用场景
1、 查询时效性要求低延迟的场景
2、 大量小文件。
3、 需要频繁修改数据的场景
4、 多个用户同时操作一个文件19、Fsimage,Edits的作用
Fsimage,Edits用于永久存储HDFS文件系统的镜像和操作日志。集群在二次启动时,使用Fsimage,Edits将集群状态恢复到集群关闭前的状态。
20、secondarynameNode如何辅助管理FSImage与Edits文件
1、 secnonaryNN通知NameNode切换editlog,生成edits.new
2、secondaryNN从NameNode中获得FSImage和editlog(通过http方式),将FSImage载入内存,然后开始合并editlog,合并之后成为新的fsimage
3、secondaryNN将新的fsimage.ckpt发回给NameNode
4、NameNode用新的fsimage.ckpt替换旧的fsimage
5、NameNode用新的edits.new替换旧的edits
21、SecondaryNamenode存在的意义是什么?
一:进行Fsimage和Edits的合并操作,减少edits日志大小,加快集群的启动速度
二:将Fsimage与Edits进行备份,防止丢失
22、SecondaryNamenode工作的触发因素有哪些?
1.时间维度,默认一小时触发一次 dfs.namenode.checkpoint.period :3600
2.次数维度,默认100万次触发一次 dfs.namenode.checkpoint.txns : 1000000
3、六十秒判断一次是否达到100W
23、使用SNN还原NN
1、 记录NN存储FSimage和Edits_Log的路径
2、 记录SNN存储FSimage和Edits_Log的路径
3、 删掉NN的FSimage和Edits_Log模拟数据丢失
4、 将SNN的FSimage和Edits_Log复制到NN的FSimage和Edits_Log对应的目录下,
5、 启动集群进行验证注意:SNN的FSimage和Edits_Log和NN的FSimage和Edits_Log不要混用
24、什么时候进入安全模式?
1、在集群重启(二次启动)的时候进入安全模式,状态持续30s
2、人为进入
25、安全模式有什么特点?
安全模式中只能读取数据,不能修改数据(增、删、改)
26、在安全模式下集群在做什么?
1、在安全模式下集群在进行恢复元数据,即在合并fsimage和edits log
2、接受datanode的心跳信息,恢复block的位置信息。
27、被添加到集群的新节点需要做哪些准备?
1.配置JDK
2.配置SSH免密钥
3.关闭防火墙
4.关闭selinux
5.修改主机名
6.修改hosts
28、添加新节点到集群
a) 在hadoop配置文件路径中创建dfs.hosts(白名单:可以和NN通信的所有节点)文件,并添加可以通信的所有DataNode
b) 在hdfs-site.xml中添加一下配置
dfs.hosts /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts
c) 刷新NameNode和ResourceManager
i. hdfs dfsadmin –refreshNodes
ii. yarn rmadmin –refreshNodes
d) 启动新节点的DataNode 和NodeManager sbin/hadoop-daemon.sh start datanodesbin/yarn-daemon.sh start nodemanager
e) 在Slaves中添加新节点
f) 验证
g) 负载均衡29、集群删除节点
a) 创建黑名单文件 dfs.hosts.exclude 并添加需要退役的节点
b) 在hdfs-site.xml中添加一下配置
dfs.hosts.exclude/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts.exclude
c) 刷新集群NameNode 和ResourceManager
i. hdfs dfsadmin -refreshNodes
ii. yarn rmadmin –refreshNodes
d) 在白名单中删掉退役的节点
e) 在slaves文件中删除掉退役的节点
f) 负载均衡30 HA执行流程
1、集群启动NN和NN,每个NN都会有一个ZKFC,每个zkfc到Zookeeper上争抢一个临时节点,哪个优先抢占到了这个临时节点,哪个就是Active,没有抢到的就是standby ,同时变为standby的ZKFC会申请临时节点的watch,监控临时节点的状态,(若节点发生变化,表示Active出现异常)
2. HA方案中有两个NN,一个是ANN,一个是SNN,每个NN都会有一个ZKFC,ZKFC的作用是监控NN健康状态和与Zookeeper 保持连接,ANN 的链接就是申请临时节点的链接。SNN的链接就是链接的watch。3、当ActiveNN出现异常,Active状态的ZKFC得知异常后断开与Zookeeper的链接,此时ZK上的临时节点就会消失。StandbyZKFC收到zk的断开信息,通知standbyNN, standbyNN远程登录到原始activeNN节点,强行killNN进程。
4、通知standbyZKFC抢占Zookeeper上的临时节点,抢占成功,将状态从standby变为active
5、当原始activeNN重新恢复后,优先到Zokeeper上申请临时节点,此时已被申请,他只能申请临时节点的watch充当standbyNN角色。
资料:
31 Zookeeper 节点类型及相应特点
临时节点:会话结束,节点消失,不能有子节点
永久节点:和会话没有关系,可以有子节点
序列节点:在给定的文件名后追加序列号(序列号依次递增)
32 Zookeeper 增删改查 shell命令
创建
Create [-s 序列] [-e 临时节点] 路径 数据
Create -e /dashuju12 dashuju12
修改
Set 路径 数据
Set /dashuju12 dashuju1234
查询
Ls /dashuju12 查看子节点
Ls2 /dashuju12 查看子节点和本节点详细信息
Get /dashuju12 获得本节点数据和详细信息
删除
Delete 删除一个节点
Rmr 删除包含子节点的节点
33Zookeeper选举机制
以五个节点的Zookeeper为例,按照12345顺序启动集群。
1、 第1个节点启动后,投一票给自己。2345节点没有启动,第1个节点的票数不过半,不能是Leader,进入looking状态。
2、 第2个节点启动后,投一票给自己。345节点没有启动,第2个节点id为2,权重大于第1个节点id为1,所以获得第1个节点的1票,此时第2个节点有2票。票数不过半,不能是Leader,进入looking状态。
3、 第3个节点启动后,投一票给自己。45节点没有启动,第3个节点id为3,权重大于第2个节点id为2,所以获得第2个节点的2票,此时第3个节点有3票。票数过半,状态为Leader。第1、2节点变为Follower.4、第4个节点启动后,投一票给自己。 但此时第3个节点为Leader,第4个节点状态变为Follower。
5、第5个节点启动后,投一票给自己。 但此时第3个节点为Leader,第5个节点状态变为Follower。
34 ZooKeeper Watcher
1、客户端向服务端注册某节点的Watcher
2、服务端事件发生触发Watcher
3、客户端回调Watcher得到触发事件情况
MapReduce
读的遍数:
- MapReduce核心思想
答:MapReduce的思想核心是“ 分而治之,先分后合 ”。即将一个大的、复杂的工作或任务,拆分成多个小的任务,并行处理,最终进行合并。
适用于大量复杂的、时效性不高的任务处理场景(大规模离线数据处理场景)。Map负责“分”,Reduce负责“合”。
- Suffle包含哪些步骤
答:分区(partition)---->排序(sort)---->数据优化(combiner)---->分组(group)
- MR从读取数据开始到将最终结果写入HDFS经过哪些步骤
第一步通过inputformat 进行数据读取
第二步split将获取的数据进行逻辑切分
第三步通过recordReader(将数据以n切分,进行再次切分,并输出key(行首字母的偏移量),value(一行的数据))
第四步 Map接收key(行首字母偏移量),value(一行的数据),根据业务需求编写代码,输出(key,value)的list
第五步:partition :按照一定的规则对key,value 的 list 进行分区
输出给Shuffle(sort)
第六步:Sort :对每个分区内的数据进行排序。
输出给Shuffle(combiner)
第七步: Combiner: 在Map端进行局部聚合(汇总)(可选项)
目的是为了减少网络带宽的开销
输出给Shuffle(group)
第八步: Group: 将相同key的key提取出来作为唯一的key,将相同key 对应的value 提取出来组装成一个value 的List
输出给reduce
第九步: Reduce:根据业务需求对传入的数据进行汇总计算
输出给outputFormat
第十步: outputFormat:将最终的结果的写入到HDFS
- combiner的作用
就是对 map 端的输出先做一次合并,以减少在 map 和 reduce 节点之间的数据传输量,降低网络资源的开销,减少IO的使用。
- combiner运行在MapReduce的哪一端?
map 端的输出。
- Maptask 的数量是可以人为设置的吗?
不可以
- Shuffle阶段的Partition分区算法是什么
对map输出的key 取哈希值,用这个哈希值与reducetask的个数值取余。余几,就将这个key,value放在对应的分区编号里(分区有多个编号)。
- Split逻辑切分数据, 切分 大小是多大?和数据块的关系是什么 ?
128M,这里的128 与HDFS数据块的128没有任何关系。
HDFS 128 是存储层面的数据切分
split128 是计算层面的128,只不过数据恰好相等。 两个128相同的原因是,一个集成程序能够正好计算一个数据块。
- 内存角度介绍Map的输出到Reduce的输入的过程。
Map的输出到内存
Map将数据传入环形缓冲区,默认100MB 可修改,环形缓冲区中的数据到达一定的阈值时,默认0.8 可修改,进行溢写生成好多临时文件,多个临时文件到达10个(可以调整)merge合并成一个大文件。
Reduce数据读取
reduce会主动去发起拷贝线程到maptask获取属于自己的数据,数据会进入ReduceTask中的环形缓冲区,当缓冲区中的数据量到达
一定阈值进行溢写,多个临时文件merge合并成一个大文件,最后输入到Reduce。
Yarn相关
Yarn运行流程
1、 client向RM提交应用程序,其中包括启动该应用的ApplicationMaster的必须信息,例如ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
2、 ResourceManager启动一个container用于运行ApplicationMaster。
3、 启动中的ApplicationMaster向ResourceManager注册自己,启动成功后与RM保持心跳。
4、 ApplicationMaster向ResourceManager发送请求,申请相应数目的container。
5、 申请成功的container,由ApplicationMaster进行初始化。container的启动信息初始化后,AM与对应的NodeManager通信,要求NM启动container。
6、 NM启动启动container。
7、 container运行期间,ApplicationMaster对container进行监控。container通过RPC协议向对应的AM汇报自己的进度和状态等信息。
8、 应用运行结束后,ApplicationMaster向ResourceManager注销自己,并允许属于它的container被收回。
详细流程
Yarn 调度器Scheduler
理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。在 Yarn中,负责给应用分配资源的就是Scheduler 。其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景。为此,Yarn提供了多种调度器和可配置的策略供我们选择。
在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler。
1.1. FIFO Scheduler FIFO Scheduler 把应用按提交的顺序排成一个队列,这是一个 先进先出 队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
1.2. Capacity Scheduler Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。 通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
容量调度器 Capacity Scheduler 最初是由 Yahoo 最初开发设计使得 Hadoop 应用能够被多用户使用,且最大化整个集群资源的吞吐量,现被 IBM BigInsights 和 Hortonworks HDP 所采用。
Capacity Scheduler 被设计为允许应用程序在一个可预见的和简单的方式共享集群资源,即"作业队列"。Capacity Scheduler 是根据租户的需要和要求把现有的资源分配给运行的应用程序。Capacity Scheduler 同时允许应用程序访问还没有被使用的资源,以确保队列之间共享其它队列被允许的使用资源。管理员可以控制每个队列的容量,Capacity Scheduler 负责把作业提交到队列中。
1.3. Fair Scheduler 在Fair调度器中,我们不需要预先占用一定的系统资源, Fair调度器会为所有运行的job 动态的调整 系统资源。 如下图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
需要注意的是,在下图Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。
公平调度器 Fair Scheduler 最初是由 Facebook 开发设计使得 Hadoop 应用能够被多用户公平地共享整个集群资源,现被 Cloudera CDH 所采用。
Fair Scheduler 不需要保留集群的资源,因为它会动态在所有正在运行的作业之间平衡资源。
77读的遍数:
1、什么是Hive
是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能(HQL)。
2、Hive诞生的意义
降低学习难度,学习成本,让大部分程序员都能够使用HADOOP集群。
3、 Hive特点
代码语言:javascript复制可扩展,Hive依赖HADOOP,存储使用HDFS,计算使用MapReduce,Hive的扩展能力实际就是HDFS,MapReduce的扩展能力。
延展性,Hive支持自定义函数,用于实现已经提供的函数无法计算的业务。
容错,节点出现问题SQL( HQL )仍可完成执行,本质就是MapReduce的多次重试。
异世之用车不
4、Hive内部组成及执行流程
5、Hive和 Hadoop 的关系
Hive存储依赖HDFS,计算依赖MapReduce。(Hive站在巨人(hadoop)的肩膀上)
Tez 是MapReduce升级版,一个计算引擎比MapReduce更快。
Hive的执行引擎也可以换成Tez.
6、Hive和传统数据库(Mysql/Oracle)的区别
查村直言龟缩
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZkKOpno-1624768770766)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps259.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e3O1X7XW-1624768770767)(C:UsersADMINI~1AppDataLocalTempksohtml25440wps260.jpg)]
7、Hive延迟较高的原因
①Hive内部解析、编译等流程需要时间。
②提交任务后,提交到Yarn,Yarn内部调度机制需要时间。
③Hive内的数据较大,比较耗时。
8、Hive常识(黄色背景需要背)
1. 数据格式。Hive中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”t”、”x001″)、行分隔符(”n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。
2. Hive在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换。
3. Hive 在加载的过程中不会对数据本身进行任何修改,甚至不会对数据进行扫描。而只是将数据内容复制或者移动到相应的 HDFS 目录中。
4. Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
5. Hive 在加载数据的过程中不会对数据中的某些 Key 建立索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于数据的访问延迟较高,决定了Hive 不适合在线数据查询。
6. Hive 是建立在 Hadoop 之上的,因此 Hive 的可扩展性是和 Hadoop 的可扩展性是一致的。 专转修剪不
9、Hive数据库、表在HDFS上存储的路径时什么
/user/hive/warehouse
⭐⭐⭐
10、Hive交互方式
1、hive
2、启动hiveserver2 , 执行beeline链接hiveserver2 3、hive –e “select * from student”
4、hive -f sql
11、Hive 的数据库、数据表、分区 在HDFS上的存在形式是什么。
文件夹
12、数据库操作
创建 create database if not exists 数据库名;
查询 show databases;
删除 drop database数据库名;
13、内部表和外部表的区别是什么?
删除数据表时,内部表删除时,元数据和数据全部被删除。外部表删除时,元数据被删除,数据不删除。
14、分区表
在大量数据的背景下,不使用分区表,在查询,过滤数据时,会暴力扫描所有数据,这样查询时间较长,
使用分区表,在原有的数据结构上添加分区,在查询过滤时指定明确的分区,
这样扫描时只扫描指定的分区,未指定的分区不扫描。这样减少数据扫描的量从而加快查询效率。
注意:分区表的分区字段绝对不能出现在数据表结构中。多层分区,其结构是嵌套结构。
暴添只加爵士
15、分区表数据加载方式
A: 新建表,然后加载数据 (load data local inpath ‘/opt/score.csv’ into table score partition (month=‘201806’);)
B:先将数据上传到HDFS(hive数据库/数据表/分区),然后自动修复分区
(msck repair table score4;)
C:先将数据上传到HDFS(hive数据库/数据表/分区),然后手动修复分区
(alter table score4 add partition(month=‘201805’);)
alter table score4 add partitioon(78=’)
16、分桶表
分桶是在表、分区之上新添加的结构,用于提高数据的join效率,和取样。
分桶需要指定分桶字段,分桶字段必须是数据表中已有的一个字段。
分桶算法,是对分桶字段求哈希,结果与分桶数取余,决定数据写入哪个桶。
注意:分桶表的数据只能通过insert overwrite加载数据。
用必( 笔 )是之
17、表的修改
修改表名 alter table score4 rename to score5;
修改列名以及类型 alter table score5 change column mysco mysconew int
18、Hive数据的导入(加载)
A:直接向分区表中插入数据
insert into table score3 partition(month =‘201807’) values (‘001’,‘002’,‘100’);
B: 通过查询插入数据(先查询-后插入)
insert overwrite table score4 partition(month = ‘201806’) select s_id,c_id,s_score from score;
注: 关键字overwrite 必须要有
C:多插入模式(一次插入到多个表中)
from score
insert overwrite table score_first partition(month=‘201806’) select s_id,c_id
insert overwrite table score_second partition(month = ‘201806’) select c_id,s_score;
D:查询语句中创建表并加载数据(as select)
create table score5 as select * from score;
E:创建表时通过location指定加载数据路径
create external table score6 (s_id string,c_id string,s_score int) row format delimited fields terminated by ‘,’ location ‘/myscore6’;
F:HDFS上的数据导入
import table techer2 from ‘/export/techer’;
19 数据导出
A: 将查询的结果导出到本地
insert overwrite local directory ‘/export/servers/exporthive/a’ select * from score;
B: 将查询的结果格式化导出到本地
insert overwrite local directory ‘/export/servers/exporthive’ row format delimited fields terminated by ‘t’ select * from student;
C:将查询的结果导出到HDFS上
insert overwrite directory ‘/export/servers/exporthive’ row format delimited fields terminated by ‘t’ select * from student;
D:Hadoop命令导出到本地
dfs -get /export/servers/exporthive/000000_0 /export/servers/exporthive/local.txt;
E: hive shell 导出到本地
bin/hive -e “select * from myhive.score;” > /export/servers/exporthive/score.txt
F:export导出到HDFS上
export table score to ‘/export/exporthive/score’;
G:sqoop导出
参见Sqoop内容
20、自定义函数实现过程
1、创建项目,编写自定义函数代码
继承 UDF,在UDF内编写 evaluate方法(有参:有输入。有返回:有输出)
2、将自定义UDF代码打包并上传到“本地”的linux系统
3、在hive shell窗口添加jar。
add jar UDFjar文件的路径和文件名
4、创建函数 并指定调用的方法‘’
create temporary function tolowercase as ‘cn.itcast.udf.ItcastUDF’
5、调用函数
21、Hiv自定义函数的类型
UDF : 一进一出
UDAF: 多进一出
UDTF:一进多出
2 2 where 与having的区别
Where可以作用在表中所有的字段上
Having可以只能作用在结果字段上(select 后面的字段)
23、order by与sort by的区别
order by 全局排序,只有一个reduce,数据量大时效率较慢
sort by 是一个reduce内部排序,不是全局排序。
24、LIKE和 RLIKE区别
Like 后面不能加正则表达式
Rlike 后面能加正则表达式
25、GROUP BY用法
group by的字段,必须是select后面的字段,
且select后面的字段不能比group by的字段多,
若有多的字段,必须使用聚和函数。
26、distribute by sort by(相同字段) 与Cluster by的区别
DISTRIBUTE BY的字段与SORT BY的字段相同时,可以使用CLUSTER BY进行替换, 但CLUSTER BY不能指定排序规则(只能是降序),而DISTRIBUTE BY SORT BY可以指定排序规则(可升可降)
27、Hive设置配置的三种方法 ,
1、hive 配置文件,
2、hive -hiveconf N=M
3、set N=M
级别关系 第3种>第2种>第1种
28、Hive 常用的数据压缩算法
Gzip、Bzip2、Snappy、LZO、LZ4
29、常用的数据存储格式
1、ORC
2、Parquet (Parque 公园)
3、textFile
压缩比
ORC > Parquet > textFile
在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet。压缩方式一般选择snappy。
1.4. 31、什么是MR (mapreduce) 本地计算 任务提交后 , 移动计算到数据端 , 数据在哪个节点 ,计算 任务优先发送到哪个节点上 。
1.5. 32、什么是MR本地模式任务不提交到集群,直接在提交任务的节点上运行。
30、Hive优化
30.1、Fetch 抓取。
当 set hive.fetch.task.conversion=none; 简单查询会转换成MapReduce程序。查询较慢。
当 set hive.fetch.task.conversion=more; 简单查询不会转换成MapReduce程序。查询较快。
30.2、本地模式
计算任务在提交任务的节点上(本地)执行,不提交到yarn
在少量数据前提下,开启本地模式,MapReduce任务不提交到Yarn,任务执行省去了Yarn调度的时间,可以加快查询效率。
在少量数据前提下,不开启本地模式,MapReduce任务提交到Yarn, Yarn调度花费时间,任务执行时间较长。``
30.3、数据倾斜1
当数据倾斜时,使用Group By对倾斜的字段进行分组,此时使用Map聚合可以加快查询效率。
Map聚合会生成。两个MapReduce任务,第一个MapReduce任务对数据进行随机分配,不按照分组字段划分。第二个MapReduce任务,按照分组字段划分做最终的聚合。
注意,不是所有的计算都可以使用该方法,例如求平均数就不可以。
30.4、Count(distinct)换成Count() group by
企业中大量数据Count(distinct) 效率较差,可以使用Count(id) group by(id)替换。
30.5、在join 关联时,尽量不要出现笛卡尔积,即在join 后必须加on条件。
30.6、使用分区剪裁、列剪裁
用哪个列,获取哪个列,多一个都不要获取。
用哪个分区,获取哪个分区,多一个都不要获取。
30.7、Join 和 Where 同时存在的优化
1、先join,后过滤,部分join的结果会被删除 (多出的100条,50条无效的被删除),造成无效join,这样效率较低。
2、先过滤后join,无效数据全部过滤掉,在join时留下的数据100%为有效数据,这样效率较高。
30.8、动态分区调整
以第一个表的分区规则,来对应第二个表的分区规则,将第一个表的所有分区,全部拷贝到第二个表中来,第二个表在加载数据的时候,不需要指定分区了,直接用第一个表的分区即可
执行步骤
1、 准备第一个表、分区、数据,创建第二个表(空表)
2、 设置开启动态分区调整
3、 在第一个表中将分区查询出来写入第二个表
a) 分区字段写在查询的最后。30.9、数据倾斜2,
调整Map或reduce的数量
查询一个文件数据插入到多个文件中,增加文件数量,从而增加Map数量,进一步增加数据查询效率
set mapreduce.job.reduces =10;create table a_1 asselect * from ori_partitioneddistribute by rand();
30.10、Hive 中影响Map数量的因素
文件数量
文件大小
数据块大小
注意:Map数量并不是越多越好
30.11、Hive 中影响reduce数量的因素
方案1、数据总量/每个reduce处理的数据量
方案2、每个任务最大的reduce数量
Min (方案二,方案一)=N(reduce的值)
注意:reduce数量并不是越多越好
30.12、并行执行
Hive中会有很多阶段,如是MapReduce阶段、抽样阶段、合并阶段、limit阶段。在各个阶段之间没有依赖,并相互之间没有影响的前提下,开启并行执行单位时间内计算的任务更多效率更高。
30.13、严格模式
Hive不允许执行高危动作
1、 笛卡尔积。 合法用法 必须加on 条件
2、 扫描所有分区。 合法用法 必须指定分区字段
3、 Orderby 后面不加 limit 。 合法用法 必须加limit 30.14、JVM重用
没有开启JVM重用时,每个task需要单独创建JVM,使用完毕后在删除。当有很多task时,JVM会反复创建,删除。每个JVM的创建时间约1秒中,反复创建浪费很多时间。
开启JVM重用,首次创建一批JVM,这批JVM反复被使用,省区了反复创建JVM的过程,节省任务时间。
弊端:在有任务执行比较慢的情况下,执行完的JVM不会自动释放资源,需所有任务结束后统一释放资源。释放之前,空闲下来的资源,其他人不能使用,造成资源浪费。
30.15、推测执行
当有部分任务区执行较慢,Hadoop会在集群中开启一个和原任务相同的任务,两个任务处理同一个数据,哪个任务先执行完,就以哪个任务的结果为准。
*数据仓库知行教育 *
1、能否简介一下当前这个项目
包含:
• 项目做了什么对业务数据进行集中储存、计算、分析,用可视化界面企业经营提供数据支撑,服务在线教育行业
• 用到了什么技术Hadoop
Hive
Hue
Sqoop
Oozie
FineBI
• 解决了什么问题做数据的集中存储
• 分布式存储 分布式计算
• 用于哪个行业?行业有什么痛点是需要项目解决的教育行业,信息的共享和利用不充分,导致了学校多年信息化应用积累了大量的数据,但信息孤岛的壁垒一直没有打破,如果无法对这些数据进行进一步挖掘,分析,加工,整理,就不能给学校教育,教学,研发,总务等各方面的管理决策提供科学,有效的数据支撑。
2、什么是数据仓库呢?
数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、数据集成的(Integrated)、相对稳定(非易失)的(Non-Volatile)、反映历史变化(时变)(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。
3、数据仓库和传统的业务数据库有什么区别?
4、OLTP和OLAP分别是什么?有什么区别?
OLTP:Online Transaction Processing:在线(联机)事务处理
OLAP:Online Analysis Processing:在线分析处理
1.6. OLTP大白话:OLTP系统主要为了业务能够顺畅、稳定的运行
即联机事务处理,也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作快速响应的方式之一,比如ERP系统,CRM系统,互联网电商系统等,这类系统的特点是事务操作频繁,数据量小。
1.7. OLAP大白话:OLAP系统主要为了数据能够高效的分析处理
即联机分析处理,有时也称为决策支持系统(DSS),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。这类系统的特点是没有事务性操作,主要是查询操作,数据量大。
5、项目是如何分层的
通用可以分为3个层级:
· ODS
· DW
· ADS维度表一般会放到Dimen层
6、数仓一般怎么做分层处理呢?
ODS——》DWD——》DWM——》DWS——》ADS
1.8. ODS层Original data service
原始数据层
记录的是输入数据仓库数据的原始的样子或者经过少量的修改的样子
基本上是和来源的地方一致
作用:一种数据备份,数据溯源(迭代计算的起点)
1.9. DW层Data Warehouse
数据仓库层
在这个层级内就开始进行数据的迭代计算了,在这里会经过一步步的迭代最终得到我们想要的中间数据
DW层的内部详细划分
DW层一般也会在内部详细划分出几个小层级
· 明细层DWD(Data Warehouse Detail):存储明细数据,此数据是最细粒度的事实数据。该层一般保持和ODS层一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。
· 中间层DWM(Data WareHouse Middle):存储中间数据,为数据统计需要创建的中间表数据,此数据一般是对多个维度的聚合数据,此层数据通常来源于DWD层的数据。
· 业务层DWS(Data WareHouse Service):存储宽表数据,此层数据是针对某个业务领域的聚合数据,应用层的数据通常来源与此层,为什么叫宽表,主要是为了应用层的需要在这一层将业务相关的所有数据统一汇集起来进行存储,方便业务层获取。此层数据通常来源与DWD和DWM层的数据。DWD 明细层:存储的数据粒度和ODS基本差不多,但是DWD的数据是从ODS经过清洗、转换、过滤后得到的。 也就是和ODS是很像的,但是里面的数据很规整,没有垃圾数据,没有无效数据,数据的格式都经过了统一化处理
清洗:清除无效数据,比如NULL值,主键ID不存在的,数据超出范围的。
统一格式:时间统一成YYYY-mm-dd HH:mm:ss 这种格式,小数点统一为2位等等做格式上的统一
DWM中间层:进行维度的预聚合,预聚合指的是在通用的范围上进行聚合
比如,时间维度的聚合
DWS 业务层:针对业务主题完成数据聚合计算
很多时候,业务如果数据比较好,可以跳过DWM直接做DWS都是可以的。
有的时候,DWD也可以不要,需要ODS数据质量本身就很好的情况下。
1.10. ADSApplication data service
数据结果层
7、数仓分层的作用是什么?
1.可以让一些公用的计算逻辑复用 2.分层之后整个数仓中的表管理会更加清晰. 3.可以在一定程度上降低一些复杂需求的复杂度. 4.让多个环节之间一定程度上解耦
8、项目中有做按照主题分析吗?若有,有哪些主题
· 访问和咨询主题
· 报名用户主题
· 有效线索主题
· 意向用户主题
· 学生出勤出题9、数据分析能决定企业未来发展,请辩证这个观点
部分同意, 大数据时代已经来临,数据正在迅速膨胀并变大,它甚至决定着企业的未来发展,虽然企业可能现在并没有意识到数据爆炸性增长带来问题的隐患,但是随着时间的推移,人们将越来越清晰地意识到数据对企业的重要性.然而现阶段我国存在的数据分析统计机构并不能很好地满足市场的需求,数据分析公司应运而生. 优秀的数据分析能够指导企业的决策,发现弥补企业的漏洞,提高企业的收益,但“数据不是万能的”,数据只能为决策层提供意见,并不能替代企业做出决策,关键决策仍由领导者决定。
10、什么是事实表,什么是维度表,有什么区别和联系
事实表,就是记录了一个个的事实(事件)信息的表
维度表:记录的是一个事件或者实体的各个维度上的信息,维度表有时候也称之为字典表
区别:
1. 维度表的冗余很大,主要是因为维度一般不大(相对于事实表来说的),而维度表的冗余可以使事实表节省很多空间。
2. 事实表一般都很大,如果以普通方式查询的话,得到结果一般发的时间都不是我们可以接受的。所以它一般要进行一些特殊处理。如SQL Server 2005就会对事实表进行如预生成处理等。
3. 维度表的主键一般都取整型值的标志列类型,这样也是为了节省事实表的存储空间。联系:
基于事实表和维度表的关联,我们可以从多个维度上去分析事实表中的数据
在数据量上,事实表是巨大的,维度表是相对事实表较少。
11、什么是指标,什么是维度,有什么区别和联系
指标是衡量事务发展的标准,也叫度量。大白话:被看待的数据主题
指标也分为:绝对数值指, 相对数值指标
维度是事务的特征。大白话:以不同的视角去看待数据
维度也可以分为:定性维度,定量维度
区别:在数据量上, 事实表 是巨大的,维度表是相对 事实表 较少。
联系:基于事实表和维度表的关联,我们可以从多个维度上去分析事实表中的数据
宽表就是事实表和维度表的集合
12、数据仓库的主要特性是?
1、 面向主题(Subject Oriented)
数仓定位是分析专用的系统,待分析的数据,一般会根据你要分析的主题进行表结构设计存储
2、 数据集成(Integrated)
分散的业务数据(数据孤岛)完成集中化存储
一般企业中,数据仓库只会设计一套。因为目的是集中化存储业务数据待分析
3、相对稳定(非易失)
数据仓库的内容,一般是只进不出。很少会执行DELTE和UPDATE,一般都是INSERT和SELECT
对比起来业务系统一般记录的是事件的状态(最新)
数仓系统一般记录的是事件全生命周期走过的所有状态的记录
4、 反映历史变化(时变)
数仓记录的是事件的全生命周期的状态更迭。所以历史状态等信息均能得到体现。
13、数据仓库主要解决了什么问题
请大体概述一下,企业中遇到什么问题,又用数仓解决了什么问题
企业想做数据分析,但是有数据孤岛问题以及数据量太大,所以做出一个系统解决了集中存储的问题以及解决了海量数据计算的问题,同时还能支持SQL最好。那么这个我们叫做数据仓库。
14、一个企业一般构建几个数据仓库最好,并说明
1个,因为数据仓库本身的构建就是为了解决数据孤岛问题,若构建数大于1个则又形成了数据孤岛
15、什么是缓慢渐变维?适用于什么场景?
维度中的属性可能会随着时间发生改变 就是缓慢渐变维,SCD渐变维也称之为拉链表 也叫缓慢渐变维
SCD1 覆盖,不管老的内容,直接更新维度表 这种模式用的人不会很多
SCD2 记录全量历史变更 使用的最广泛的模式
SCD3 记录少量历史信息(比如上一次)
16、什么是拉链表?适用于什么场景
SCD渐变维也称之为拉链表
适用于记录数据的历史状态情况
17、什么是维度的分层和分级?什么是上钻和下卷?
维度并不是固定的,维度都可以对其进行细化得到其子维度。
在维度上,会有层级关系
表示上层和下层关系,我们叫做分层
同层之间的关系我们叫做分级
上卷:从当前维度向上找其上层维度进行统计分析
下钻:从当前维度向下找其下层温度进行统计分析
18、请简述数据集市
数据集市是用于部门分析的数据集合, 从范围上来讲它属于数据仓库的子集,在数据仓库中 数据集市 不是必须的,看具体需要
19、请简述维度退化,以及其作用
退化维度就是将维度退回到事实表中,以减少关联次数,提高查询性能
作用:减少事实表和维表的关联
20、请简述以下层级的主要作用
ods
原始数据层
记录的是输入数据仓库数据的原始的样子或者经过少量的修改的样子
基本上是和来源的地方一致
作用:一种数据备份,数据溯源(迭代计算的起点)
dwd
DWD 明细层:存储的数据粒度和ODS基本差不多,但是DWD的数据是从ODS经过清洗、转换、过滤后得到的。
dwm
DWM中间层:进行维度的预聚合,预聚合指的是在通用的范围上进行聚合
dws
DWS 业务层:针对业务主题完成数据聚合计算
ads(app)
数据结果层
存储数据的计算结果,就是可以直接拿取用的,无需在执行计算的数据。
21、请简述项目中5个看板各自的建模
怎么分层,为什么这样分层
看板1
数据要从业务数据库采集到数仓中(ODS)
ODS分析
表数量:2个表(业务2个表,ODS原始存储,ODS也是2个表)
表类型:外部表,分区表(采集数据的日期)
数据存储类型:
· TEXTFILE(行存储格式)
· SequenceFile(行存储格式)
· ORC(选择这个)(列存储格式)
· Parquet(列存储格式)表压缩选择:
· Snappy
· Lzo
· GZIP
· BZIP
· LZ4
· Zlib(选择)(ODS冷数据)
1.11. Snappy、Lzo、Zlib区别Zlib特点:压缩率贼高,性能不好
Snappy:压缩率适中,速度快
Lzo:压缩率还好,速度还好
ODS层特点是:刚开始的时候用一下,后续很少用ODS数据了。(冷数据)
既然是冷数据,用Zlib压缩成最小即可。
1.12. ODS总结
· 两个表(因为两个业务表)
· 数据格式:ORC
· 压缩:Zlib
· 分区表、外部表DW分析
DW层主要做数据分析(迭代计算)用。
· DWD,数据清洗、转换
· DWM,数据中间层,预聚合、维度退化(宽表)
· DWS, 针对业务主体做开发
1.13. ODS -> DWD所需字段
普通字段 session_id sid ip msg_count create_time area province city origin_channel seo_source from_url hourinfo 分区字段 dayinfo monthinfo quarterinfo yearinfo
表数据格式:ORC
压缩:Snappy
分区(多级分区 年-> 季度-> 月 -> 天)
表类型:内部表
表数量:1张表即可
1.14. ODS -> DWM层DWM:预聚合 维度退化
当前这个看板:
1. 预聚合由于重复的Sid存在,所以无法聚合
2. 维度退化也不需要,因为维度都集成在DWD中事实表中了所以,这个看板不需要DWM层级
1.15. DWD->DWS指标:
· 访问量
· 咨询量维度:
· 时间维度(年、季度、月、天、小时)
· 地区维度(省、市、区)
· 来源渠道
· 搜索来源
· 受访页面两个指标,我们做两个表,因为一个指标对应它需要的维度
表需要2张,对应两个指标
表1,访问量相关的表
指标:访问量
维度:
· 时间维度(年、季度、月、天、小时)
· 地区维度(省、市、区)
· 来源渠道
· 搜索来源
· 受访页面
· 总访问量通过分析,我们设计如下图的一张表,就可以提供所有在访问量这个指标下,关于时间、地区、来源、搜索、受访页面这些维度上的全部统计需求
-1 表示在某个维度上不存在 time_type:时间维度的类型 1.year 2.quarter 3.month 4. day 5.hour
attr_type:在地区、来源、搜索、受访页面这些维度上的类型 1. 省市区 2. origin 3. seo 4. from_url
表2,咨询量相关的表
指标:咨询量
维度:
· 时间维度(年、季度、月、天、小时)
· 地区维度(省、市、区)
· (来源渠道、受访页面、搜索来源也顺便带上呗)
· 总访问量咨询量
如图,得到上图的表,所有的需求关于咨询的都可以解决。
ADS层分析
ADS 有时候也被称之为APP层
作用上是存储业务或者报表等直接可用的结果数据
对于当前这个看板,DWS层的数据,聚合到那一步就足够可视化工具去使用了。
如果在进一步生成针对每个需求的结果表数据,可视化反而不好用。
所以,在当前这个看板,APP层可以省略了。
22、请简述SCD2的实现方法(最少2种,多了不限)
1. 通过增加表来实现(每一次采集都产生一个新表)
2. 通过增加列来实现(在表中增加对行数据的有效期做判断)(比如valid_start_from和valid_end_from) 3.通过新增数据临时表23、请用三个单词来总结数仓分层的主要工作内容
ODS(输入)
DW(清洗、预聚合、针对性分析的处理)
ADS(输出)
24、什么是版本控制工具
版本控制工具一般有两种Git和SVN,git是分布式版本控制系统
,SVN是集中式版本控制工具。SVN容错性差,所以一般企业采用Git作为代码管理库
25、什么是git
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。
26、.git文件夹的作用
.git文件夹是git init后在当前目录生成的一个管理git仓库的文件夹,这里包含了所有git操作需要的东西,.git所在的当前文件夹的文件都将置于git管理工具的管理与跟踪当中
27、什么是本地库什么是远程库
1.本地仓库 本地库就是存储在本机的代码仓库,
2.远程仓库 我们提交到网络上面的仓库,就是远程仓库。比较著名的有码云,GitHub
28、在大数据框架中,压缩的作用是什么?
作用:将硬盘负载或者网络负载转移到CPU负载,是一种收益行为
29、请简述行存储和列存储各自的优缺点和适用场景
· 列存储,每
o 优点:列过滤,列查找,针对列相关操作更快。扩展列,增删列很容易。列单独存储
§ 列相关查询、过滤性能更快
§ 扩展列、删除列更简单
§ 列单独存储,每个列均可以进行单独排序,性能更好
§ 列单独存储,可以针对每个列的数据类型设置针对性的压缩算法,使得压缩率更好
§ 数据加载可以选择指定的列加载到内存中。更加节省内存。
o 缺点:整行相关操作性能低。同时对事务的支持性不行(因为把列都拆开存储,每个列单独做事务,整体还要同步很麻烦)适用场景:数仓的特性很大一部分是针对列的过滤,列的搜索,列的匹配,所以很多数仓结构比较适合使用列存储,列存储也比较适合做OLAP
· 行存储
o 优点:
§ 概念简单容易理解,和很多现实中的数据模型概念相通,比如CSV文件,文本数据文件等概念简单容易理解是一个很大的优势,毕竟性能低点可以忍,难以理解就不可以忍了。
人天生懒。
§ 针对行操作更快捷
§ 事务支持比较好
o 缺点:
§ 针对列的操作性能比列存储低,因为无论操作哪个列都要取出来整行数据
§ 只能针对整行数据选定压缩算法,无法针对列选定,压缩率不高(对比列存储)
§ 排序只可基于某一个列排序,然后整体行和行之间排序(索引等额外的解决方案除外,这里只是指原始状态下)
§ 扩展列、删除列不方便
· 适用场景:行存储也比较适合做OLAP
30、什么是Hive的分区?什么是Hive的分桶?
Hive的分区:就是对数据 粗粒度的划分 ,减少查询的数据量、提高查询效率 在hdfs以文件夹的形式存在,他包括静态分区、动态分区、混合分区
Hive的分桶: 细粒度的划分 ,进一步缩小查询范围,提高数据的join效率,和取样,在hdfs以文件的形式存在
31、Hive中静态分区、动态分区、混合分区分别是什么
静态分区:导入数据时需要手动指定分区,默认使用静态分区。动态分区:导入数据时,系统可以动态判断目标分区,使用时要开区动态分区和非严格模式。 混合分区是两者的混合使用,一张表可同时被静态和动态分区键分区,但混合分区的使用要先指定静态分区才能使用动态分区。
32、什么是Map Join,有什么好处,主要原理是什么
将Join发生在Map端,而不在Reduce端
好处: 节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。
一个大表,有一个小表jion,先把小表加载内存中,提高jion效率。
33、如何显式的告知Hive执行任务要走MapJoin
在查询中加入:/ mapjoin(表)/
示例:
# 显示的告知Hive,这个查询要走MapJoin
select / mapjoin(A)/ f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802) ;
34、什么是Bucket Map Join,有什么好处,主要原理是什么
两个表join的时候,小表不足以放到内存中,但是又想用map side join这个时候就要用到bucket Map join。
好处: 做局部join,节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。
其方法是两个join表在join key上都做hash bucket,并且把你打算复制的那个(相对)小表的bucket数设置为大表的倍数。这样数据就会按照key join,做hash bucket。小表依然复制到所有节点,Map join的时候,小表的每一组bucket加载成hashtable,与对应的一个大表bucket做局部join,这样每次只需要加载部分hashtable就可以了。
35、什么是SMB Join,有什么好处,主要原理是什么
大表对小表应该使用MapJoin来进行优化
但是如果是大表对大表,如果进行shuffle,那就非常可怕,第一个慢不用说,第二个容易出异常,此时就可以使用SMB Join来提高性能。
SMB Join基于bucket-mapjoin的有序bucket,可实现在map端完成join操作,可以有效地减少或避免shuffle的数据量。
36、请简述Hive的执行原理
单说Hive是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供类SQL的查询功能。 Hive,实际上就是一个编译器,一个翻译机。把SQL翻译成MapReduce之类的作业。目前的Hive除了支持在MapReduce上执行,还支持在Spark和Tez 上执行。
37、你们的原始数据一共有多张数据表?
customer_relationship(报名信息),itcast_clazz(报名后的校区和学科信息),employee(内部员工信息),scrm_department(部门信息)。
38、业务上用到哪些表?
报名信息表
报名信息表
校区和学科信息表
内部员工信息表
部门信息表,
线索表和意向表
39、一共有多少个分析需求?
40、列举几个你实现得需求?
首先在ODS层原始数据包括有customer_relationship(报名信息),itcast_clazz(报名后的校区和学科信息),employee(内部员工信息),scrm_department(部门信息)。
其次是在DWD层对数据进行清洗,抽取,转换,所以我们在DWD层清洗保留客户表中不为空的,且是已支付的数据,并且转换获得线上线下及年月日等字段。
再次是DWM层,在DWD层基础上,关联校区,学科和咨询中心表来进行维度退化,来获取想要的字段。
最后DWS层按产品的属性维度进行聚合统计,得到统计宽表,产品属性维度包括:校区,学科组合分组,来源渠道,咨询中心。
Hbase理论知识点概要
1.16. 问题01:Hbase的功能与应用场景?
• 功能:Hbase是一个分布式的、基于分布式内存和HDFS的、按列存储的NoSQL数据库
• 应用:Hbase适合于需要实时对大量数据进行快速、随机读写访问的场景
1.17. 问题02:Hbase有什么特点?
• 分布式的,可以实现高并发的数据读写
• 上层构建分布式内存,可以实现高性能、随机、实时的读写
• 底层基于HDFS,可以实现大数据
• 按列存储,基于列实现数据存储,灵活性更高
1.18. 问题03:Hbase设计思想是什么?
• 设计思想:冷热数据分离,Hbase将新数据直接写入内存中,如果内存中存储的数据过多,就将内存的数据写入HDFS
– 热数据是指刚产生的数据,先写内存,大概率的情况下,可以直接从内存中读取
– 冷数据是指先产生的数据,将内存中产生很久的数据写入HDFS中,被读取的概率较小
1.19. 问题04:Hbase与HDFS的区别是什么?
• Hbase是一个高性能实时随机读写数据的数据库存储系统,用于实现实时数据存储
• HDFS是一个分布式离线大数据文件存储系统,用于实现离线的文件存储
1.20. 问题05:Hbase与MySQL的区别是什么?
• Hbase是分布式NoSQL数据库,可以实现高性能的大数据存储
• MySQL是RDBMS关系型数据库,只能实现小数据量的结构化数据存储
1.21. 问题06:Hbase与Hive的区别是什么?
• Hive是通过构建元数据,映射HDFS文件构建成表,本质还是HDFS,实现离线大数据仓库
• Hbase是通过构建上层分布式内存,底层HDFS,实现大数据实时存储的NoSQL数据库
1.22. 问题07:Hbase的按列存储是什么?
• Hbase按列存储的设计是指Hbase中的最小操作单元是列,可以实现对每一行的每一列进行读写
• 每一行的列都是动态的,每一行可以拥有不同的列
1.23. 问题08:请简述Namespace、Rowkey、ColumnFamily及多版本的功能及含义
• Namespace:命名空间,类似于数据库的设计,用于区分不同的业务表
• Rowkey:行健,类似于主键的设计,唯一标识一条数据并且作为Hbase中的唯一索引
• ColumnFamily:列族,用于将列进行分组,底层用于区分存储不同的列,提高查询性能
• 多版本:Hbase中允许一列存储多个版本的值,并通过数据写入的时间戳来区分不同版本 Hbase万能模板:
Hbase是一个通过构建上层分布式内存,底层HDFS,分布式的、基于内存和HDFS的、按列存储的高性能快速实时随机读写数据的大数据NoSQL数据库存储系统
1.24. 问题09:请简述Hbase的分布式主从架构
• 主节点:HMaster:管理节点、负责管理集群的从节点、元数据以及所有Region的分配
• 从节点:HRegionServer:存储节点,负责实现所有数据的存储,管理Region,构建分布式内存
1.25. 问题10:请简述Table表与RegionServer的关系
• Table是Hbase中的表对象,一张表可以划分为多个Region分区
• RegionServer是Hbase中实现数据存储的节点,负责存储每个Region
1.26. 问题11:表的Region的划分规则及数据写入分区的规则是什么?
• Region划分规则:范围划分,一张表可以在Rowkey行的方向上划分多个Region,每个Region构成一段连续的区间
• 数据划分规则:根据Rowkey属于哪个Region的范围,就将这条数据写入哪个Region分区中
1.27. 问题12:Region的内部存储结构是什么?
• 每个RegionServer中管理多个Region
• 每个Region中根据列族划分多个Store
• 每个Store中有1个memstore和多个StoreFile文件
• 数据写入memstore中,如果达到内存阈值,memstore中的数据将写入StoreFile
1.28. 问题13:什么是热点问题?
• 现象:在某个时间段内,大量的读写请求全部集中在某个Region中,导致这台RegionServer的负载比较高,其他的Region和RegionServer比较空闲
• 问题:这台RegionServer故障的概率就会增加,整体性能降低,效率比较差
• 原因:本质上的原因,数据分配不均衡
• 情况
– 一张表只有一个Region
– 一张表有多个Region,但是Rowkey是连续产生的
1.29. 问题14:怎么解决热点问题?
• 合理的设计Rowkey,构建不连续的Rowkey
• 根据Rowkey的前缀,为表划分多个Region
1.30. 问题15:Rowkey如何设计,设计规则是什么?
• 业务原则:贴合业务,保证前缀是最常用的查询字段
• 唯一原则:每条rowkey唯一表示一条数据
• 组合原则:常用的查询条件组合作为Rowkey
• 散列原则:rowkey构建不能连续
• 长度原则:满足业务需求越短越好
1.31. 问题16:列族设计规则是什么?
• 个数原则:如果列的个数比较多,建议2 ~ 3个,如果列的个数比较少,建议1个
– 列族个数多了,导致比较次数变多,降低性能
– 列族个数少了,导致列的比较次数变多,降低性能
• 长度原则 :能满足业务需求的情况下,越短越好
1.32. 问题17:Hive on Hbase的实现原理是什么?
• Hive on Hbase的原理是通过MapReduce实现对Hbase数据的读写
• MapReduce中提供了TableInputFormat读取Hbase数据,TableOutputFormat写入数据到Hbase
1.33. 问题18:Phoenix是什么?
• Phoenix是一个专门为Hbase设计的SQL on Hbase的工具
• 底层通过Hbase API和大量的协处理器实现
• 可以实现基于SQL访问Hbase以及构建维护二级索引等功能
1.34. 问题19:什么是二级索引?为什么要构建二级索引
• 二级索引指的是基于一级索引之上再构建一层索引
• Hbase使用Rowkey作为唯一索引,只有使用Rowkey前缀进行查询,才走索引查询
• 导致大部分的查询都是不走索引,性能比较差
• 通过建立二级索引,可以通过走两次索引代替全表扫描,加快查询速度
1.35. 问题20:Phoenix实现二级索引时,可以构建哪些索引类型?
• 全局索引
• 覆盖索引
• 本地索引
• 函数索引
1.36. 问题21:什么是全局索引?
• 创建全局索引,会自动构建一张索引表
• 索引表结构
– Rowkey:索引字段 原表的rowkey
– 列:占位置x
• 特点:如果查询字段或者查询条件不是索引字段,就不会走索引
• 应用:适合于读多写少
1.37. 问题22:什么是覆盖索引?
• 创建覆盖索引,会自动构建一张索引表
• 索引表结构
– Rowkey:索引字段 原表的rowkey
– 列:将include中的列放入索引表
• 特点
– 如果查询字段或者查询条件不是索引字段,就不会走索引
– 如果查询的字段在索引表中,直接从索引表返回结果
1.38. 问题23:什么是本地索引?
• 创建覆盖索引,会自动基于原表构建一个列族来实现索引存储
• 原表的数据中:多了一个索引列族
• 特点
– 不论查询字段是否是索引字段,都会走索引
– 将索引与数据存储在同一台RegionServer,提高索引读写性能
• 注意
– 本地索引会修改原数据表,对于本地索引只能使用Phoenix来操作表的数据
– 盐表不能使用本地索引
1.39. 问题24:请简述Hbase写入数据的流程
• step1:获取元数据
– 客户端请求Zookeeper,获取meta表所在的regionserver的地址
– 读取meta表的数据:获取所有表的元数据
• step2:找到对应的Region
– 根据meta表中的元数据,找到表对应的所有的region
– 根据region的范围和写入的Rowkey,判断需要写入具体哪一个Region
– 根据region的Regionserver的地址,请求对应的RegionServer
• step3:写入数据
– 请求RegionServer写入对应Region:根据Region的名称来指定写入哪个Region
– 根据列族判断写入哪一个具体的Store
• 先写入WAL:Hlog预写日志中
– 写入对应Store的MemStore中
• MemStore
1.40. 问题25:请简述Hbase读取数据的流程
• step1:获取元数据
– 客户端请求Zookeeper,获取meta表所在的regionserver的地址
– 读取meta表的数据
– 注意:客户端会缓存meta表的数据,只有第一次会连接ZK,读取meta表的数据,缓存会定期失效,要重新缓存
• 避免每次请求都要先连接zk,再读取meta表
• step2:找到对应的Region
– 根据meta表中的元数据,找到表对应的region
– 根据region的范围和写入的Rowkey,判断需要写入具体哪一个Region
– 根据region的Regionserver的地址,请求对应的RegionServer
• step3:读取数据
– 先查询memstore
– 如果查询的列族开启了缓存机制,就读取BlockCache
– 如果没有,就读取StoreFile,并将结果放入BlockCache中
1.41. 问题26:请简述LSM模型的设计思想
• step1:数据写入的时候,只写入内存
• step2:将数据在内存构建有序,当数据量大的时候,将有序的数据写入磁盘,变成一个有序的数据文件
• step3:基于所有有序的小文件进行合并,合并为一个整体有序的大文件
1.42. 问题27:什么是Flush,什么时候会触发Flush?
• Flush是指将memstore中的数据写入HDFS,变成StoreFile
• 2.0之前:判断memstore存储大小,单个memstore达到128M就会触发Flush,或者整个memstore达到95%就会触发
• 2.0之后:根据平均每个memstore的存储大小与16M取最大值计算水位线,高于水位线就Flush,不高于就不Flush,都不高于全部Flush
1.43. 问题28:什么是Compaction,什么时候会触发Compaction?
• Compaction的功能是将多个单独有序StoreFile文件进行合并,合并为整体有序的大文件并且删除过期数据,加快读取速度
• 2.0之前:通过minor compaction和major compaction来实现
– minor compaction:用于合并最早生成的几个小文件,不清理过期数据
– major compaction:用于将所有storefile合并为一个StoreFile,并清理过期数据
• 2.0之后:除了minor compaction和major compaction,添加了in-memory-compaction
– In-memory compaction:在内存中进行合并,合并以后的结果再进行flush,有四种配置
• none:不开启
• basic:开启,但是合并时不删除过期数据
• eager:开启,合并时并清理删除过期数据
• adaptive:开启,并在合并时根据数据量来自动判断是否清理过期数据
1.44. 问题29:什么是Spit,什么时候会触发Split?
• Split是指当一个Region存储的数据过多,导致这个Region的负载比较高,Hbase中设定了一个Region最多存储的数据量的阈值,一旦达到阈值,允许Region分裂为两个region,老的region会下线,新的两个region对外提供服务
• 0.94之前:ConstantSizeRegionSplitPolicy
– 只要region中的storefile达到10G,就分裂
• 2.0之前:IncreasingToUpperBoundRegionSplitPolicy
– 根据Region个数来实现计算,当达到4个region以后,也是按照10GB来分裂
• 2.0之后:SteppingSplitPolicy
– Region个数等于1个:按照256M来分裂
– Region个数超过1个:按照10GB来分裂
1.45. 问题30:MapReduce读取Hbase数据的原理及返回值是什么?
• MapReduce读取Hbase原理:封装了一个TableInputFormat来实现读取Hbase的数据
• 返回值
– 每个Region对应一个分片,每个分片启动一个MapTask进行处理
– 每个Rowkey的数据变成一个KV对
– K是Rowkey的字节对象:ImmutableBytesWriable类型
– V是Rowkey的数据对象:Result类型
1.46. 问题31:MapReduce写入Hbase的原理和要求是什么?
• MapReduce写入Hbase原理:封装了一个TableOutputFormat来实现写入Hbase的数据
• 要求
– 写入Hbase的数据的V的类型必须为Put类型
1.47. 问题32:什么是BulkLoad,用于什么场景?
• BulkLoad是指将数据直接转换为StoreFile文件,放入Hbase中,不经过Hbase的内存,避免大量数据进入内存,又从内存进入HDFS
• 应用:大数据量批量写入Hbase
1.48. 问题33:协处理器是什么?Hbase中提供了几种协处理器?
• 协处理器指的是Hbase提供了一些开发接口,可以自定义开发一些功能集成到Hbase中
• 类似于Hive中的UDF,当没有这个功能时,可以使用协处理器来自定义开发,让Hbase支持对应的功能
• 协处理器分为两类
– Observer:观察者类,类似于监听器的实现
– Endpoint:终端者类,类似于存储过程的实现
1.49. 问题34:Hbase常见优化有哪些?
• 内存优化:针对于不同的读写场景,合理的调整Memstore和BlockCache的比例大小
• 压缩优化:对列族配置压缩存储,减少IO消耗
• 布隆过滤:基于数据文件构建布隆索引,加快数据查询
• 提高客户端缓存空间、指定每次扫描的行数、设置合适的GC算法等
• 其他优化
– Linux句柄数优化,提高Linux线程、文件通道等资源句柄数
– HDFS句柄数优化:提高文件打开线程数、提高连接超时时间
如果查询的字段在索引表中,直接从索引表返回结果
1.38. 问题23:什么是本地索引?
• 创建覆盖索引,会自动基于原表构建一个列族来实现索引存储
• 原表的数据中:多了一个索引列族
• 特点
– 不论查询字段是否是索引字段,都会走索引
– 将索引与数据存储在同一台RegionServer,提高索引读写性能
• 注意
– 本地索引会修改原数据表,对于本地索引只能使用Phoenix来操作表的数据
– 盐表不能使用本地索引
1.39. 问题24:请简述Hbase写入数据的流程
• step1:获取元数据
– 客户端请求Zookeeper,获取meta表所在的regionserver的地址
– 读取meta表的数据:获取所有表的元数据
• step2:找到对应的Region
– 根据meta表中的元数据,找到表对应的所有的region
– 根据region的范围和写入的Rowkey,判断需要写入具体哪一个Region
– 根据region的Regionserver的地址,请求对应的RegionServer
• step3:写入数据
– 请求RegionServer写入对应Region:根据Region的名称来指定写入哪个Region
– 根据列族判断写入哪一个具体的Store
• 先写入WAL:Hlog预写日志中
– 写入对应Store的MemStore中
• MemStore
1.40. 问题25:请简述Hbase读取数据的流程
• step1:获取元数据
– 客户端请求Zookeeper,获取meta表所在的regionserver的地址
– 读取meta表的数据
– 注意:客户端会缓存meta表的数据,只有第一次会连接ZK,读取meta表的数据,缓存会定期失效,要重新缓存
• 避免每次请求都要先连接zk,再读取meta表
• step2:找到对应的Region
– 根据meta表中的元数据,找到表对应的region
– 根据region的范围和写入的Rowkey,判断需要写入具体哪一个Region
– 根据region的Regionserver的地址,请求对应的RegionServer
• step3:读取数据
– 先查询memstore
– 如果查询的列族开启了缓存机制,就读取BlockCache
– 如果没有,就读取StoreFile,并将结果放入BlockCache中
1.41. 问题26:请简述LSM模型的设计思想
• step1:数据写入的时候,只写入内存
• step2:将数据在内存构建有序,当数据量大的时候,将有序的数据写入磁盘,变成一个有序的数据文件
• step3:基于所有有序的小文件进行合并,合并为一个整体有序的大文件
1.42. 问题27:什么是Flush,什么时候会触发Flush?
• Flush是指将memstore中的数据写入HDFS,变成StoreFile
• 2.0之前:判断memstore存储大小,单个memstore达到128M就会触发Flush,或者整个memstore达到95%就会触发
• 2.0之后:根据平均每个memstore的存储大小与16M取最大值计算水位线,高于水位线就Flush,不高于就不Flush,都不高于全部Flush
1.43. 问题28:什么是Compaction,什么时候会触发Compaction?
• Compaction的功能是将多个单独有序StoreFile文件进行合并,合并为整体有序的大文件并且删除过期数据,加快读取速度
• 2.0之前:通过minor compaction和major compaction来实现
– minor compaction:用于合并最早生成的几个小文件,不清理过期数据
– major compaction:用于将所有storefile合并为一个StoreFile,并清理过期数据
• 2.0之后:除了minor compaction和major compaction,添加了in-memory-compaction
– In-memory compaction:在内存中进行合并,合并以后的结果再进行flush,有四种配置
• none:不开启
• basic:开启,但是合并时不删除过期数据
• eager:开启,合并时并清理删除过期数据
• adaptive:开启,并在合并时根据数据量来自动判断是否清理过期数据
1.44. 问题29:什么是Spit,什么时候会触发Split?
• Split是指当一个Region存储的数据过多,导致这个Region的负载比较高,Hbase中设定了一个Region最多存储的数据量的阈值,一旦达到阈值,允许Region分裂为两个region,老的region会下线,新的两个region对外提供服务
• 0.94之前:ConstantSizeRegionSplitPolicy
– 只要region中的storefile达到10G,就分裂
• 2.0之前:IncreasingToUpperBoundRegionSplitPolicy
– 根据Region个数来实现计算,当达到4个region以后,也是按照10GB来分裂
• 2.0之后:SteppingSplitPolicy
– Region个数等于1个:按照256M来分裂
– Region个数超过1个:按照10GB来分裂
1.45. 问题30:MapReduce读取Hbase数据的原理及返回值是什么?
• MapReduce读取Hbase原理:封装了一个TableInputFormat来实现读取Hbase的数据
• 返回值
– 每个Region对应一个分片,每个分片启动一个MapTask进行处理
– 每个Rowkey的数据变成一个KV对
– K是Rowkey的字节对象:ImmutableBytesWriable类型
– V是Rowkey的数据对象:Result类型
1.46. 问题31:MapReduce写入Hbase的原理和要求是什么?
• MapReduce写入Hbase原理:封装了一个TableOutputFormat来实现写入Hbase的数据
• 要求
– 写入Hbase的数据的V的类型必须为Put类型
1.47. 问题32:什么是BulkLoad,用于什么场景?
• BulkLoad是指将数据直接转换为StoreFile文件,放入Hbase中,不经过Hbase的内存,避免大量数据进入内存,又从内存进入HDFS
• 应用:大数据量批量写入Hbase
1.48. 问题33:协处理器是什么?Hbase中提供了几种协处理器?
• 协处理器指的是Hbase提供了一些开发接口,可以自定义开发一些功能集成到Hbase中
• 类似于Hive中的UDF,当没有这个功能时,可以使用协处理器来自定义开发,让Hbase支持对应的功能
• 协处理器分为两类
– Observer:观察者类,类似于监听器的实现
– Endpoint:终端者类,类似于存储过程的实现
1.49. 问题34:Hbase常见优化有哪些?
• 内存优化:针对于不同的读写场景,合理的调整Memstore和BlockCache的比例大小
• 压缩优化:对列族配置压缩存储,减少IO消耗
• 布隆过滤:基于数据文件构建布隆索引,加快数据查询
• 提高客户端缓存空间、指定每次扫描的行数、设置合适的GC算法等
• 其他优化
– Linux句柄数优化,提高Linux线程、文件通道等资源句柄数
– HDFS句柄数优化:提高文件打开线程数、提高连接超时时间
– Zookeeper优化:优化连接超时时间