昨日内容回顾
-
大数据四大特征
1.海量数据 数据的容量非常的大 1024GB = 1TB 1024TB = 1PB... 2.高增长率 短时间内数据的增长速度特别快 天猫双十一 3.多样性 数据的种类非常的多样 结构化数据 非结构化数据 4.低价值密度 数据量越大从中获取到有效的数据效率越低(一定的前提条件)
-
大数据应用场景
应用在生活的方方面面 人工智能 自动驾驶汽车 机器人 ... 金融 房地产 商品营销 ...
-
大数据仓库之Hadoop
2006在国外正式诞生 作者是Doung Cutting 软件图标黄色的小象
-
Hadoop发行版本
Apache 便于学习 2006 Cloudera 用于商用 2008 hortonworks 用于商用 2011
-
Hadoop重要组成
Hadoop1.X MapReduce # 计算 + 资源调度 压力比较大 HDFS # 存储数据 Common # 公共方法 Hadoop2.X与Hadoop3.X MapReduce # 计算 Yarn # 资源调度 HDFS # 存储数据 Common # 公共方法
-
HDFS
# 分布式文件管理系统 NameNode 不存储真实数据 存的是数据的相关信息 DataNode 存储真实数据 Secondary NameNode 协助NameNode工作(数据备份 应急处理) ps:默认对数据有三个备份
-
Yarn
# 资源调度系统 Resource Manager # RM 大老板 只能有一个 Node Manager # NM 小老板 可以有多个 application master # AppMr 员工 可以有多个 Container # CR 办公所需要的各种资源
-
MapReduce
# 将一个复杂的功能拆分成多个分配给不同的节点 Map 拆分 Reduce 汇总
-
Hadoop技术生态圈
# 线上数据库是不能直接用于数据分析的 一般都需要先做数据的导出处理 sqoop 结构化数据 flume 非结构化数据 kafka 视频、音频数据 HBase 非关系型数据库 Spark 对数据进行各种处理 功能比MapReduce更加强大 R语言 老牌数据分析必备语言 目前正在被逐步淘汰
今日内容概要
- 各大组成部分详解
- Hadoop软件服务配置
今日内容详细
HDFS详细
⼀个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不⽅便管理和维护
HDFS只是分布式⽂件管理系统中的⼀种
HDFS的使⽤场景:适合⼀次写⼊,多次读出的场景,且不⽀持⽂件的修改。
适合⽤来做数据分析,并不适合⽤来做⽹盘应⽤
优点
⾼容错性
默认是三个副本
适合处理⼤数据
可构建在廉价机器上
缺点
不适合低延时数据访问
⽆法⾼效的对⼤量⼩⽂件进⾏存储
不⽀持并发操作文件
冷备与热备
冷备 服务器关闭之后做备份
热备 服务器继续提供服务内部同步备份
冷数据与热数据
冷数据 不常用的数据
热数据 常用的数据
HDFS中的⽂件在物理上是分块存储(Block),块的⼤⼩可以通过配置参数来规定,默认⼤⼩在Hadoop2.x/3.x版本中的128M,⽼版本中是64M
"""
面试题
1.为什么块的⼤⼩不能设置太⼩,也不能设置太⼤?
(1)HDFS的块设置太⼩,会增加寻址时间,程序⼀直在找块的开始位置;
(2)如果块设置的太⼤,从磁盘传输数据的时间会明显⼤于定位这个块开
始位置所需的时间。导致程序在处理这块数据时,会⾮常慢。
总结:HDFS块的⼤⼩设置主要取决于磁盘传输速率。
2.副本节点选择
默认是三个副本 前两个位于相同机架不同节点
另外一个一定要在不同机架上
"""
如何避免NameNode故障之后数据无法恢复访问的问题
磁盘FsImage备份文件
Edits文件(类似于日志文件)
MapReduce详细
优点
1.MapReduce 易于编程
它简单的实现⼀些接⼝,就可以完成⼀个分布式程序,这个分布式程序可
以分布到⼤量廉价的PC机器上运⾏。也就是说你写⼀个分布式程序,跟写
⼀个简单的串⾏程序是⼀模⼀样的。就是因为这个特点使得MapReduce编
程变得⾮常流⾏。
2.良好的扩展性
当你的计算资源不能得到满⾜的时候,你可以通过简单的增加机器来扩展
它的计算能⼒。
3.⾼容错性
MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求
它具有很⾼的容错性。⽐如其中⼀台机器挂了,它可以把上⾯的计算任务
转移到另外⼀个节点上运⾏,不⾄于这个任务运⾏失败,⽽且这个过程不
需要⼈⼯参与,⽽完全是由Hadoop内部完成的。
4.适合PB级以上海量数据的离线处理
可以实现上千台服务器集群并发⼯作,提供
数据处理能⼒。
缺点
1. 不擅⻓实时计算
MapReduce⽆法像MySQL⼀样,在毫秒或者秒级内返回结果。
2. 不擅⻓流式计算
流式计算的输⼊数据是动态的,⽽MapReduce的输⼊数据集是静态的,不能
动态变化。这是因为MapReduce⾃身的设计特点决定了数据源必须是静态 的。
3. 不擅⻓DAG(有向图)计算
多个应⽤程序存在依赖关系,后⼀个应⽤程序的输⼊为前⼀个的输出。在
这种情况下,MapReduce并不是不能做,⽽是使⽤后,每个MapReduce作业
的输出结果都会写⼊到磁盘,会造成⼤量的磁盘IO,导致性能⾮常的低下。
实操
集群:多台服务器组成的群体
如何在一台计算机上面模拟出多台计算机的效果?
多台虚拟机
克隆
链接克隆
速度快时间短 但是原虚拟机不能消失
完整克隆
速度慢时间长 但是克隆出来之后跟原虚拟机没有半毛钱关系了
针对克隆出来的机器一定要修改IP地址并重启网卡
尝试着ping外网和局域网
前期机器准备
-
新建虚拟机并克隆出多台备用
-
修改克隆机器相关配置文件
# 可能性1 vi /etc/sysconfig/network-scripts/ifcfg-eth0 # 修改主机名 vi /etc/sysconfig/network-scripts/ifcfg-eth1 # 修改ip地址 # 可能性2 vi /etc/sysconfig/network-scirpts/ifcfg-ens33 ''' 1.修改ip地址 2.ONBOOT改为yes 3.BOOTPROTO改为none '''
-
修改主机名(可选)
hostnamectl set-hostname 主机名 bash
-
设置对应关系
vim /etc/hosts """ 192.168.1.100 hadoop100 192.168.1.101 hadoop101 """ # 注意多台机器之间都必须有映射关系才可互相查找 # 要想在自己的浏览器里面访问映射主机名,需要修改windows系统的hosts文件 """ 192.168.1.100 hadoop100 192.168.1.101 hadoop101 """
-
关闭防火墙
systemctl stop firewalld # 临时关闭 systemctl disable firewalld # 然后reboot 永久关闭 systemctl status firewalld # 查看防火墙状态
-
重启网络
systemctl restart network
-
xshell分别链接即可
前期文件准备
-
在opt目录下创建两个文件夹
mkdir software # 存放压缩文件 mkdir module # 存放解压之后的文件Hadoop103
-
将JDK个Hadoop压缩包传入
方式1(拖拽直接上传): 1.下载对应插件 yum install lrzsz -y # 验证是否安装成功 rpm -qa lrzsz 2.python中的paramiko模块
Paramiko模块
通过ssh远程连接服务器并执行想要命令 类似于Xshell
链接服务器有两种方式
1.用户名和密码连接服务器
2.公钥私钥连接服务器
paramiko模块支持上面两种连接服务器的方式
# 安装
pip3 install paramiko
Paramiko远程执行命令
# 用户名和密码的方式
import paramiko
# 创建ssh对象
ssh = paramiko.SSHClient()
# 允许链接不在know_hosts文件中主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 链接服务器
ssh.connect(hostname='IP',port=22,username='root',password='jason123')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ip a')
# 获取结果
res = stdout.read() # 基于网络传输 该结果是一个bytes类型
print(res.decode('utf-8'))
# 断开链接
ssh.close()
# 公钥私钥方式
首先你要产生你自己的公钥和私钥 然后将你的公钥上传到服务器保存 之后就可以通过私钥来链接
"""
mac
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub username@hostname
cat ~/.ssh/id_rsa
windows
1.下载git并安装(提供windows环境的linux操作界面)
https://git-scm.com/
2.右键git bash here进入git终端(相当于linux界面)
ssh-keygen -t rsa
3.拷贝公钥至远程服务器
ssh-copy-id -i 公钥文件路径 username@hostname
"""
# 公钥和私钥(先讲公钥保存到服务器上)
import paramiko
# 读取本地私钥
private_key = paramiko.RSAKey.from_private_key_file('a.txt')
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='IP', port=22, username='root', pkey=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls /')
# 获取命令结果
result = stdout.read()
print(result.decode('utf-8'))
# 关闭连接
ssh.close()
Paramiko上传下载文件
# 用户名密码方式
import paramiko
# 用户名和密码
transport = paramiko.Transport(('172.16.219.168', 22))
transport.connect(username='root', password='jason123')
sftp = paramiko.SFTPClient.from_transport(transport)
# 上传文件
sftp.put("a.txt", '/data/tmp.txt') # 注意上传文件到远程某个文件下 文件必须存在
# 下载文件
sftp.get('/data/tmp.txt', 'hahahha.txt') # 将远程文件下载到本地并重新命令
transport.close()
# 公钥私钥方式
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('a.txt')
transport = paramiko.Transport(('172.16.219.168', 22))
transport.connect(username='root', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')
transport.close()
公钥私钥
在实际工作中为了安全性考虑,很多时候我们并不会使用用户名密码的方式登录软件
而是采用公钥私钥的方式
https://zhuanlan.zhihu.com/p/31477508
JDK环境准备
# 1.将解压之后的放入module
tar -zxvf jdk...tar.gz -C /opt/module/
# 2.环境变量配置
vim /etc/profile
'''添加内容'''
## JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
# 3.使环境变量生效
source /etc/profile
# 4.查看是否有效
java -version
强调
Hadoop环境待见需要依赖于java的jdk包
作业
1.完成课上所有环境配置
2.复习课程内容准备面试