赞
踩
黑马程序员大数据Hadoop入门视频教程,适合零基础自学的大数据Hadoop教程
学习目标
1.理解大数据基本概念
2.掌握数据分析基本步骤
3.理解分布式、集群概念
4.学会VMware虚拟机的导入与使用
5.掌握Linux常用操作命令使用
6.掌握vi/vim编辑器基础使用
数据分析是为了把隐藏在数据背后的信息集中和提炼出来,总结出所研究对象的内在规律,帮助管理者进行有效的判断和决策。数据分析在”企业日常经营“分析中主要有三大方向:现状分析->原因分析->预测分析
离线分析(Batch Processing):面向过去,面向历史,分析已有的数据;在时间维度明显成批次性变化。一周一分析(T+7),一天一分析(T+1),所以也叫做批处理
。
实时分析(Real Time Processing | Streaming)
面向当下,分析实时产生的数据;所谓的实时是指从数据产生到数据分析与数据应用的时间间隔很短,可细分秒级、毫秒级。实时分析又称为流式处理(Streaming)。
机器学习(Machine Learning)
基于历史数据和当下产生的实时数据预测未来发生的事情;侧重于数学算法的运用,如分类、聚类、关联、预测。
数据分析步骤(流程)的重要性体现在:对如何开展数据分析提供了强有力的逻辑支撑;
张文霖老师在《数据分析六部曲》中提到,典型的数据分析应该包含以下几个步骤:
明确分析目的和思路->数据收集->数据处理->数据分析->数据展现->报告攥写
分析框架体系化
,比如先分析什么,后分析什么,使各分析点之间具有逻辑联系,保证分析维度的完整性
,分析结果的有效性
以及正确性
,需要数据分析方法论
进行支撑;从无到有
的过程:比如传感器收集气象数据、埋点收集用户行为数据传输搬运
的过程:比如采集数据库数据到数据分析平台常见的数据源和种类:
数据预处理
。数据清洗
、数据转化
、数据提取
、数据计算
;结构化数据
。思考:
- 当下的企业中用于分析的数据是侧重文本数据多一些,还是侧重于图片、视频数据多一些?
答案:文本数据多一点- 什么叫干净规整的结构化数据?有非结构化数据?
答案:结构化数据,专业来说就是二维表的数据,行列对应
数据分析方法
,还要熟悉数据分析软件
的操作;数据分析的结果不是只有可视化展示
,还可以继续数据挖掘(Data Mining)、即席查询(Ad Hoc)等。大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
5个V开头的单词,从5个方面准确、生动、形象地介绍了大数据特征。
电商领域:精准广告位、个性化推荐、大数据杀熟
传媒领域:精准营销、猜你喜欢、交互推荐
金融方面:理财投资,通过对个人的信用评估,风险承担能力评估,集合众多理财产品,推荐相应的投资理财产品。
交通领域:拥堵预测、智能红绿灯、导航最优规划
电信领域:基站选址优化、舆情监控、客户用户画像
安防领域:犯罪预防、天网监控
医疗领域:智慧医疗、疾病预防、病源追踪
分布式、集群是两个不同的概念,但口语中经常混淆 二者。
分布式是指”多台机器,每台机器上部署不同组件
“。
集群是指”多台机器,每台机器上部署相同组件
“。
分布式示意图:
例如:去京东买东西,京东背后是多台服务器,不同服务器承担不同的服务。
集群示意图:
例如:访问百度,百度背后也有多台服务器,多台服务器都来提供搜索服务(再配合负载均衡),防止某台宕机。
数据大爆炸,海量数据处理场景面临问题
如何存储?单机存储有瓶颈,多台机器分布式存储
。
如何计算(高效)?单台计算能力有限,多台机器分布式计算
。
管理计算机硬件与软件资源
的程序,需要处理如:管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务;裸机
,不管是开发还是使用都十分不便。用户与系统交互的操作界面
。操作系统发展至今,种类繁多,可以根据应用的不同领域进行划分:
Linux
、Windows Server
和Netware。1991
年芬兰学生Linus Torvalds
发布Linux系统第一版本,遵循GPL协议(通用公共许可证),开源免费
;类似Unix
的操作系统,Linux的初衷就是要替代Unix,并在功能和用户体验上进行优化,所以Linux模仿了Unix(但并没有抄袭Unix的源码),使得Linux在外观和交互上与Unix非常类似。操作系统的核心部分简称内核
,Linux第一版本独立内核由Linus Torvalds开发实现,约10000行代码;最终裁定权
;Linux操作系统 = Linux Kernel + GNU软件及系统软件 + 必要的应用程序
个人桌面版
和企业服务器版
。Redhat(红帽系列)
及其延伸版本(Centos
)凭借稳定的性能在企业服务器中占比很大。虚拟机软件
,允许用户将Linux、Windows等多个操作系统作为虚拟机在单台PC上运行
;硬件资源的虚拟
,在一台PC上运行其他隔离操作系统;硬件组成与功能上与物理实体机完全一致
;导入相关步骤已经在2021韩顺平一周学会Linux中记录过,所以这里略过。
需要注意的是:
1.为了和提供的虚拟机(可在视频下方置顶评论区下载)对应,需要修改虚拟网络编辑器,将子网的网段改为192.168.88.0
2.在导入提供的虚拟机之后,打开虚拟机时,要选择“我已移动该虚拟机”(这样虚拟机的网卡的mac地址不变,但如果实际上是复制的,则会导致有两台虚拟机的mac地址相同,最终导致网路冲突),而不能选择“我已复制该虚拟机”(虚拟机的网卡的mac地址是新生成的)。
3.导入的node3和node2均依赖于node1虚拟机,这里采用的技术是“链接克隆技术”。
在虚拟机关机状态
下,可以根据需求调整每台机器的资源大小。(提供的虚拟机默认的内存分配是4G-2G-2G)
网络安全协议
,专为远程登录会话和其他网络服务提供安全性的协议。用户加密实现远程登录、服务器之间的免密登录
。非对称加密
(单方向加密),需要两个密钥:公开密钥(public key:简称公钥)和私有密钥(private key:简称私钥)。公钥对数据进行加密
,只有用对应的私钥才能解密
。FinalShell
、Putty、xshell、secureCRT等。安装目录:最好无中文、无空格路径
。192.168.88.151 node1
192.168.88.152 node2
192.168.88.153 node3
管理和存储文件
信息的软件机构称为文件管理系统,简称文件系统;目录树结构
,从斜杠/根目录
开始;万物皆文件
”,意味着针对Linux的操作,大多数时间是在针对Linux文件操作系统。/根目录开始
的,Linux也不例外,而windows文件系统会以盘符来区分不同文件系统
;目录(directory)、文件(file)
;路径具有唯一性
;目录树到文件终止蔓延
。.开始表示是隐藏的
文件,如果路径以.开始表示当前路径
当前目录的上一级
目录用户的home目录
,比如root用户home目录是/root根目录
# 进入当前目录下的a
cd ./a
# 进入根目录下的a
cd /a
# 进入当前目录上一级下的a
cd ../a
# 进入当前操作用户home目录下的a
cd ~/a
# 进入当前目录下的a,a是隐藏的
cd .a
help
命令man
命令ls
(list files)命令:用于显示指定工作目录下的内容(列出目前工作目录所含的文件及子目录)。-a
:显示所有文件及目录(.开头的隐藏文件也会列出)-l
:除文件名外,也将文件型态、权限、拥有者、文件大小等咨询详细列出,注意ls -l = ll
ls path
ls -a path #查看所有文件,包括隐藏文件
ls -l # 查看文件详细信息,包括权限,类型,时间,大小等
ll # 功能等同于ls -l
ll -h path # 表示以人性化的方式显示内容
ll * # *通配符表示任意字符,?表示有且只有一个字符
cd
(change directory)命令:用于切换当前工作目录。切换的路径可为绝对路径或相对路径。若路径省略,则变换至使用者的home目录。pwd # 查看自己当前所在目录
cd path # 注意自己写的是相对路径还是绝对路径,还可以结合特殊符号使用
mkdir
(make directory)命令:用于创建目录。touch
命令:创建一个空文件,无任何内容。rm
(remove)命令:用于删除一个文件或者目录。-f
:强制直接删除,无需用户确认。-r
:将目录及以下所有递归逐一删除。cp
(copy file)命令:用于复制文件或目录。-r
:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。mv
(move file)命令:用来为文件或目录改名、或将文件或目录移入其他位置。cat
(concatenate)命令:用于连接文件并打印到标准输出设备如console控制台上。适合小文件内容查看。more
命令:类似cat,不过会以一页一页的形式显示,更方便使用者逐页阅读,翻页结束自动退出。适合大文件查看。按space键翻下一页,按b返回(back)上一页。tail
命令:用于查看文件的结尾部分的内容。-n
:用于显示行号,默认为10,即显示10行的内容。-f
:用于实时显示文件动态追加的内容。会把文件里的最尾部的内容显示在屏幕上,并不断刷新,只要文件有更新,就可以看到最新的文件内容。|
管道命令:将前一个命令执行的结果作为内容交给下一个命令处理。可以形成多级管道操作。命令1 | 命令2 # 可以将命令1的结果通过命令2作进一步的处理
echo
命令:用于内容的输出,将内容输出到console控制台上。echo string
>
:输出重定向(覆盖)命令:command > file 执行command然后将输出的内容存入file,file内已经存在的内容将新内容覆盖替代。>>
:输出重定向(追加)命令:command >> file 执行command然后将输出的内容存入file,新内容追加在文件末尾。tar
(tape archive)命令:常用于备份文件。是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。-c
或–create:建立新的备份文件。-x
或–extract或–get:从备份文件中还原文件。-v
或–verbose显示指令执行过程。-f
<备份文件>或–file=<备份文件>指定备份文件。# tar -cvf 打包名.tar 文件或者目录
tar -cvf test.tar 1.txt 2.txt # 将当前目录下的1.txt和2.txt打包成test.tar文件
tar -xvf test.tar -C /root/ # 解包,当不指定-C 解包目录,则默认解包到当前目录
指定压缩算法
,对打包的文件进行压缩,解压的时候也需要指定相应的算法。gzip
指令处理备份文件。tar -zxvf xxxxx.tar.gz
tar -zcvf test.tar.gz 1.txt 2.txt # 将当前目录下的1.txt和2.txt打包压缩成test.tar.gz文件
tar -zxvf test.tar.gz -C /root/ # 解压缩解包,当不指定-C 解包目录,则默认解包到当前目录
补充:.tar.gz
可以简写成.tgz
date
命令:用来显示或设定系统的日期与时间,在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记。cal
(calendar)命令:用于显示当前或者指定日期的公历。date # 默认格式显示日期与时间:2023年 02月 06日 星期一 15:03:59 CST
date +"%Y-%m-%d %H:%M:%S" # 按照指定格式显示日期与时间:2023-02-06 15:06:08
cal # 显示当前日期的公历
free
命令:用于显示内存
状态。会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。df
(英文全拼:disk free)命令:用于显示目前在Linux系统上的文件系统磁盘
使用情况统计。free -h # 查看内存使用情况
df -h # 查看磁盘使用情况
重点关注/dev/mapper/centos_node1-root
,因为这是根目录的挂载点。
ps
(英文全拼:process status)命令:用于显示当前进程的状态,类似于windows的任务管理器。jps
命令:这是JDK自带的命令,专门用于查看本机运行的java进程情况。jsp # 在安装了jdk的情况下,jps命令可以用于查看本机运行的java进程
ps -ef # 查看本机运行的所有进程
kill -9 进程号 # 根据查询到的进程号,结合kill -9 命令来杀死进程
文本编辑器
,具有强大的文本编辑能力。vi编辑器的增强版
。vim中代码补完、编译及错误跳转等方便编程的功能特别丰富。万物皆命令
。vim /path/file
相关内容已经在2021韩顺平一周学会Linux中记录过。所以这里略过。
复制光标当前所在行内容
当前行的下一行粘贴
注意:使用鼠标从windows或者其他地方复制内容到vim编辑器粘贴,一定要在输入模式下进行
,否则数据会有丢失的风险
学习目标
1.了解Hadoop发展历史、现状
2.掌握Hadoop集群架构、角色
3.掌握Hadoop集群分布式安装部署
4.理解分布式存储的概念与实现
5.掌握HDFS分块存储、副本机制等特性
6.学会shell操作HDFS
7.掌握HDFS读写文件基本流程
狭义上Hadoop指的是Apache软件基金会的一款开源软件
。简单的编程模型
实现跨机器
集群,对海量数据进行分布式计算
处理存储
系统):解决海量数据存储资源管理
和任务调度框架):解决资源任务调度计算
框架):解决海量数据计算广义上Hadoop
指的是围绕Hadoop打造的大数据生态圈
。Doug Cutting
Google三篇论文
HDFS
作为分布式文件存储系统,处在生态圈的底层
和核心
位置;YARN
作为分布式通用的集群资源管理系统和任务调度平台,支撑各种计算引擎运行
,保证了Hadoop地位;MapReduce
作为大数据生态圈第一代分布式计算引擎,由于自身设计的模型所产生的弊端,导致企业一线几乎不再直接使用
MapReduce进行编程处理,但是很多软件的底层依然在使用MapReduce引擎来处理数据。并发数据
,Hadoop可以在节点之间动态并行
的移动数据,使得速度非常快。YARN
(集群资源管理、任务调度)3.0着重于性能优化
。HDFS集群
、YARN集群
逻辑上分离、通常物理上在一起
主从架构
集群互相之间没有依赖、互不影响
部署在同一台物理服务器上
安装包、源码包下载地址
https://archive.apache.org/dist/hadoop/common/hadoop-3.3.0/
为什么要重新编译Hadoop源码?
匹配不同操作系统本地库环境
,Hadoop某些操作比如压缩、IO需要调用系统本地库(*.so
|*.dll
)
修改源码
、重构源码
如何编译Hadoop
源码包根目录下文件:BUILDING.txt
详细步骤参考附件资料
课程提供编译好的Hadoop安装包
hadoop-3.3.0-Centos7-64-with-snappy.tar.gz
资源上有抢夺冲突的,尽量不要部署在一起
工作上需要互相配合的。尽量部署在一起
vim /etc/hostname
补充:
1.finalshell支持将命令发送到所有会话
2.Linux解决“您在 /var/spool/mail/root 中有新邮件”的问题
vim /etc/hosts
systemctl stop firewalld.service # 关闭防火墙
systemctl disable firewalld.service # 禁止防火墙开开启自启
# node1生成公钥私钥(4个回车)
ssh-keygen
#node1配置免密登录到node1 node2 node3
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
yum -y install ntpdate
ntpdate ntp5.aliyun.com # 使用ntp协议,与网络授时服务器做同步
mkdir -p /export/server/ # 软件安装路径
mkdir -p /export/data/ # 数据存储路径
mkdir -p /export/software/ # 安装包存放路径
# 先只在node1上安装JDK1.8 # 将jdk-8u241-linux-x64.tar.gz上传到/export/server/目录下 cd /export/server/ tar -zxvf jdk-8u241-linux-x64.tar.gz # 解压安装包,选项-zxvf中的-可有可没有 rm -rf jdk-8u241-linux-x64.tar.gz # 解压后可以删除安装包 # 配置环境变量 vim /etc/profile # 在/etc/profile文件的最后添加 export JAVA_HOME=/export/server/jdk1.8.0_241 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # 重新加载环境变量 source /etc/profile # 利用scp远程拷贝,将node1中的JDK1.8拷贝到node2和node3的root用户的/export/server/目录下 scp -r /export/server/jdk1.8.0_241/ root@node2:/export/server/ # 因为是拷贝目录,所以有-r scp -r /export/server/jdk1.8.0_241/ root@node3:/export/server/ # 利用scp远程拷贝,将node1中的/etc/profile拷贝到node2和node3的root用户的/export/profile/目录下 scp /etc/profile root@node2:/etc scp /etc/profile root@node3:/etc # 三台机器同时发送source /etc/profile来重新加载环境变量文件 source/profile # 三台机器同时发送java -version来验证JDK1.8是否正确安装 java -version
# 先只在node1上安装Hadoop
# 将已经编译好的Hadoop安装压缩包hadoop-3.3.0-Centos7-64-with-snappy.tar.gz通过FinalShell上传到node1的/export/server/下
cd /export/server/
tar -zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz
rm -rf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz
hadoop-env.sh
core-site.xml
核心模块配置hdfs-site.xml
hdfs文件系统模块配置mapred-stie.xml
MapReduce模块配置yarn-site.xml
yarn模块配置workers
所有的配置文件目录:/export/server/hadoop-3.3.0/etc/hadoop
修改配置文件(配置文件目录:/export/server/hadoop-3.3.0/etc/hadoop)
#文件最后添加
export JAVA_HOME=/export/server/jdk1.8.0_241 # 申明Java的路径
# 指定各个进程的用户名
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
<!-- 设置默认使用的文件系统;Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 --> <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> </property> <!-- 设置Hadoop本地保存数据路径 --> <property> <name>hadoop.tmp.dir</name> <value>/export/data/hadoop-3.3.0</value> </property> <!-- 设置HDFS web UI用户身份 --> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property> <!-- 整合hive 用户代理设置 --> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> <!-- 文件系统垃圾桶保存时间 --> <property> <name>fs.trash.interval</name> <value>1440</value> </property>
<!-- 设置SNN进程运行机器位置信息 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:9868</value>
</property>
<!-- 设置MR程序默认运行模式: yarn集群模式 local本地模式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- MR程序历史服务地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>node1:10020</value> </property> <!-- MR程序历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node1:19888</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property>
<!-- 设置YARN集群主角色运行机器位置 --> <property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 是否将对容器实施物理内存限制 --> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <!-- 是否将对容器实施虚拟内存限制。 --> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <!-- 开启日志聚集 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置yarn历史服务器地址 --> <property> <name>yarn.log.server.url</name> <value>http://node1:19888/jobhistory/logs</value> </property> <!-- 历史日志保存的时间 7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
注意:由于目前使用的是虚拟机,内存比较小,所以对物理内存和虚拟内存的限制关闭。如果在企业真实环境中,可以将两个参数去掉,这样就会进行检测。
node1.itcast.cn
node2.itcast.cn
node3.itcast.cn
cd /export/server/
scp -r hadoop-3.3.0/ root@node2:$PWD # 这里$PWD就是当前路径/export/server/
scp -r hadoop-3.3.0/ root@node2:$PWD
vim /etc/profile
export HADOOP_HOME=/export/server/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
scp /etc/profile root@node2:/etc/
scp /etc/profile root@node3:/etc/
source /etc/profile
hadoop # 验证环境变量是否生效
hdfs namenode -format
1.首次启动之前需要format操作;
2.format只能进行一次,后续不再需要;
3.如果多次format除了造成数据丢失外,还会导致hdfs集群主从角色之间互相不认识。通过删除所有机器hadoop.tmp.dir目录重新format解决
# hadoop2.x版本命令
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
# hadoop3.x版本命令
hadoop --daemon start|stop namenode|datanode|secondarynamenode
# hadoop2.x版本命令
yarn-daemon.sh start|stop resourcemanager|nodemanager
# hadoop3.x版本命令
yarn --daemon start|stop resourcemanager|nodemanager
配置好机器之间的SSH免密登录和workers文件
。start-dfs.sh
stop-dfs.sh
start-yarn.sh
stop-yarn.sh
start-all.sh # 一个命令代替start-dfs.sh和start-yarn.sh
stop-all.sh
jps命令
查看进程是否启动成功如果发现一个进程,查看的时候存在,过一会没了,即发生了“进程的闪退”,说明配置有问题。此时排错的唯一依据是看日志
node1:9870
可以访问HDFS的Web页面node1:8088
可以访问YARN的Web页面hadoop fs -mkdir /itcast
hadoop fs -put 要上传的文件 /itcast
hadoop fs -ls /
cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 4
文件系统
是一种存储
和组织数据
的方法,实现了数据的存储、分级组织、访问和获取等操作,使得用户对文件访问和查找变得容易;树形目录
的抽象逻辑
概念代替了硬盘等物理设备使用数据块的概念,用户不必关心数据底层存在硬盘哪里,只需要记住这个文件的所属目录和文件名即可;维护文件在设备中的物理位置
。传统
常见的文件系统更多指的是单机的文件系统
,也就是底层不会横跨多台机器
实现。比如windows操作系统上的文件系统、Linux上的文件系统、FTP文件系统等等。抽象的目录树结构
,树都是从/根目录开始
往下蔓延;目录
和文件
;路径具有唯一性
。文件系统中有两个概念非常重要:数据、元数据
数据底层最终是存储在磁盘
等存储介质上的,一般用户无需关心
,只需要基于目录树进行增删改查即可,实际针对数据的操作由文件系统完成。文件系统元数据
一般指文件大小、最后修改时间、底层存储位置、属性、所属用户、权限等信息
。升级扩容的成本非常高
。需要处理数据的时候把数据移动过来
。单节点I/O性能
瓶颈无法逾越,难以支撑海量数据的高并发高吞吐
场景。场景互动:分布式存储系统的核心属性及功能含义
分布式存储系统核心属性
多机横向扩展
:机器不够加机器,理论上无限扩展
快速定位文件位置
针对块并行操作提高效率
冗余存储,保障数据安全
Hadoop分布式文件系统
。大数据生态圈最底层
的分布式存储服务而存在。也可以说大数据首先要解决的问题就是海量数据的存储问题。解决大数据如何存储问题的
。分布式意味着HDFS是横跨在多台计算机
上的存储系统。高度容错
的,适应于具有大数据集的应用程序,它非常适于存储大型数据(比如TB和PB)。统一的访问接口
,像是访问一个普通文件系统一样使用分布式文件系统。Doug Cutting
领导Nutch项目
研发,Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能。如何解决数十亿网页的存储和索引问题
。Google
发表的论文为该问题提供了可行的解决方案。分布式文件系统(GFS)
,可用于处理海量网页的存储》故障检测和自动快速恢复
是HDFS的核心架构目标。用于批处理
,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量
。支持大文件(Large Data Sets)
。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。write-one-read-many
访问模型。一个文件一旦创建、写入、关闭之后就不需要修改
了。这一假设简化了数据一致性问题,使高吞吐量的数据访问称为可能。移动计算的代价比之移动数据的代价低
。一个应用请求的计算,离它操作的数据越近就越高效。将计算移动到数据附近,比之将数据移动到应用所在显然更好。平台轻松移植
到另一个平台。这有助于将HDFS广泛用作大量应用程序的首选平台。大文件;数据流式访问;一次写入多次读取;低成本部署,廉价PC;高容错
小文件;数据交互式访问;频繁任意修改;低延迟处理
Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调
完成分布式的文件存储服务。一主五从
模式,其中五个从角色位于两个机架(Rack)的不同服务器上。物理上是分块存储(block)
的,默认大小是128M(134217728),不足128M则本身是一块。默认值是3
,也就是会额外再复制2份
,连同本身总共3份副本。在HDFS中,Namenode管理的元数据
具有两种类型:
层次型文件组织结构
。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。统一的抽象目录树
,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。存储管理由DataNode节点承担
。命令行界面
(英文:command-line interface,缩写:CLI),是指用户通过键盘输入指令,计算机接收到指令后,予以执行一种人际交互方式。hadoop fs [generic options]
URL中的前缀协议
。fs.defaultFS属性
,以该属性值作为默认文件系统。hadoop fs -ls file:/// # 操作本地文件系统
haddop fs -ls hdfs://node1:8020/ # 操作HDFS分布式文件系统
hadoop fs -ls / # 直接根目录,没有指定协议,将加载读取fs.defaultFS值
hadoop fs
可操作任意文件系统,不仅仅是hdfs文件系统,使用范围更广;hadoop fs -help
命令来查看每个命令的详细用法。-mkdir [-p] <path> ...
hadoop fs -mkdir /itcast
-ls [-h] [-R] [<path> ...]
-put [-f] [-p] <localsrc> ... <dst>
# hadoop fs -put 当前客户端上的目录/文件 HDFS上的目标目录,下面给出一个例子
hadoop fs -put zookeeper.out /itcast # 经典形式
hadoop fs -put file:///etc/profile hdfs://node1:8020/itcast # 完整形式
-cat <src> ...
大文件内容读取,慎重
。hadoop fs -cat /itcast/zookeeper.out
-get [-f] [-p] <src> ... <localdst>
# 追加内容到文件尾部appendToFile
echo 1 > 1.txt
echo 2 > 2.txt
echo 3 > 3.txt
hadoop fs -put 1.txt / # 上传1.txt
hadoop fs -appendToFile 2.txt 3.txt /1.txt # 将客户端的2.txt,3.txt追加到HDFS文件1.txt中
-mv <src> ... <dst>
多用多会,孰能生巧,不用就忘
。NameNode
是Hadoop分布式文件系统的核心,架构中的主角色。NameNode维护和管理文件系统元数据
,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。NameNode成为了访问HDFS的唯一入口
。内存
和磁盘文件
两种方式管理元数据。DataNode
是Hadoop HDFS中的从角色,负责具体的数据块存储
。存储HDFS的元数据
:文件系统中所有文件的目录树,并跟踪整个集群中的文件,不存储实际数据。给定任何的块列表及其位置
。使用此信息NameNode知道如何从块中构建文件。不持久化存储每个文件中各个块所在的datanode的位置信息
,这些信息会在系统启动时从DataNode重建。单点故障
。大量内存(RAM)
。最终数据块block的存储
。是集群的从角色
,也成为Slave。注册
到NameNode并汇报
自己负责持有的块列表。硬盘
空间,因为实际数据存储在DataNode中。Pipeline
,中文翻译为管道。这是HDFS在上传文件写数据过程中采用的一种数据传输方式。顺序地沿着一个方向传输,这样能够充分利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时
。DistributedFileSystem
,该对象封装了与HDFS文件系统操作的相关方法。RPC请求
NameNode创建文件。FSDataOutputStream输出流
对象给客户端用于写数据。packet 默认64k
),内部组件DataStreamer
请求NameNode挑选出适合存储数据副本的一组DataNode地址,默认是3副本存储。pipeline
的第一个DataNode,该DataNode存储数据包并将它发送到pipeline的第二个DataNode。同样,第二个DataNode存储数据包并发送给第三个(也是最后一个)DataNode。DistributedFileSystem
,调用该对象的open()方法来打开希望读取的文件。文件中前几个块的块位置(分批次读取)信息
。检索下一批数据块的DataNode位置信息
。学习目标
1.理解分布式计算分而治之的思想
2.学会提交MapReduce程序
3.掌握MapReduce执行流程
4.掌握YARN功能与架构组件
5.掌握程序提交YARN交互流程
6.理解YARN调度策略
先分再合,分而治之
”。把一个复杂的问题,按照一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的结果,然后把各部分的结果组成整个问题的最终结果
。拆分
”:即把复杂的任务分解为若干个“简单的子任务”来并行处理
。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系
。合并
”:即对map阶段的结果进行全局汇总。采取MapReduce分而治之
的策略。不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算!
函数式
语言中的思想,用Map
和Reduce
两个函数提供了高层的并行编程抽象模型。<key, value>键值对
。做什么(what need to do)
与具体怎么做(how to do)
分开了,为程序员提供一个抽象和高层的编程接口和框架。程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的业务程序代码
。分布式计算
是一种计算方法,和集中式计算
是相对的。将该应用分解成许多小的部分,分配给多台计算机进行处理
。这样可以节约整体计算时间,大大提高计算效率。分布式计算框架
,用于轻松编写分布式应用程序,这些应用程序以可靠,容错的方式并行处理大型硬件集群(数千个节点)上的大量数据(多TB数据集)。Google
于2004年在一篇名为《MapReduce:SimplifiedData Processingon Large Clusters》的论文
中提出。易于使用和高度可扩展
的,使得开发者无需关心分布式系统底层的复杂性即可很容易的编写分布式数据处理程序,并在成千上万台普通的商用服务器中运行。易于编程
良好的扩展性
实时计算性能差
不能进行流式计算
一个完整的MapReduce程序在分布式运行时有三类
MRAppMaster
(只有一个):负责整个MR程序的过程调度及状态协调MapTask
(可能多个):负责map阶段的整个数据处理流程ReduceTask
(可能多个):负责reduce阶段的整个数据处理流程只能包含一个Map阶段和一个Reduce阶段,或者只有Map阶段;
kv键值对的形式流转
的;用户编写的代码
和Hadoop自己实现的代码
整合在一起才可以;企业中工作很少涉及到MapReduce直接编程
,但是某些软件的背后还依赖MapReduce引擎。感受MapReduce及其内部执行流程
,因为后续的新的计算引擎比如Spark,当中就有MapReduce深深的影子存在。hadoop-mapreduce-examples-3.3.0.jar
[hadoop jar|yarn jar] hadoop-mapreduce-examples-3.3.0.jar args…
提交到YARN集群上分布式执行
。圆周率π大家都不陌生,如何去估算π的值呢?
Hadoop MapReduce示例提供了Monte Carlo方法计算圆周率。
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2
WordCount中文叫做单词统计、词频统计;
指的是统计指定文件中,每个单词出现的总次数
。
MapReduce的执行流程和默认的行为机制
,这才是关键。数据经过切割,全部标记1
,因此输出就是<单词,1>。shuffle阶段核心:经过MR程序内部自带默认的排序分组等功能,把key相同的单词会作为一组数据构成新的kv对
。对所有的1进行累加求和
,就是单词的总次数。hadoop fs -mkdir /input
hadoop fs -put 1.txt /input
该路径不能已存在
); hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount /input /output
逻辑切片
,形成切片规划。128M
),每一个切片由一个MapTask处理。(getSplits)按行读取数据
。key是每一行的起始位置偏移量,value是本行的文本内容。(TextInputFormat)map方法处理数据
。(计算数据是在内存当中计算的)分区partition
。默认不分区,因为只有一个reducetask。内存缓冲区
,达到比例溢出到磁盘上。溢出spill
的时候根据key进行排序sort
。merge合并
,成为一个文件。复制拉取
属于需要自己处理的数据。合并merge
,即把分散的数据合并成一个大的数据。再对合并后的数据排序
。调用reduce方法
。键相等
的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中。Shuffle
的本意是洗牌、混洗的意思,把一组有规则的数据尽量打乱成无规则的数据。将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理
。Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle
。(内存)
(磁盘)
(内存)
(磁盘)
频繁涉及到数据在内存、磁盘之间的多次往复
。通用资源管理系统
和调度平台
,可为上层应用提供统一的资源管理和调度。资源管理系统
:集群的硬件资源,和程序运行相关,比如内存
、CPU
等。(磁盘由HDFS管理)调度平台
:多个程序同时申请计算资源如何分配
,调度的规则(算法)。通用
:不仅仅支持MapReduce程序,理论上支持各种计算程序
。YARN不关心你干什么,只关心你要资源,在有的情况下给你,用完之后还我。YARN为这些程序提供运算所需的资源
(内存、CPU等)。正是因为YARN的包容,使得其他计算框架能专注于计算性能的提升
。ResourceManager(RM)
资源分配的最终权限,即最终仲裁者
。NodeManager(NM)
管理本机器上的计算资源
。ApplicationMaster(AM)
应用程序内的“老大”
,负责程序内部各阶段的资源申请,监督程序的执行情况。AM程序是任何程序在YARN上运行启动的第一个进程
当用户向YARN 中提交一个应用程序后,YARN将分两个阶段运行该应用程序。
客户端申请资源启动运行本次程序的ApplicationMaster
;ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程
,直到运行完成。资源是有限的
,并且在繁忙的群集上
,应用程序通常将需要等待其某些请求得到满足。YARN调度程序的工作是根据一些定义的策略为应用程序分配资源
。Scheduler
,它是ResourceManager的核心组件之一。Scheduler完全专用于调度作业,它无法跟踪应用程序的状态。FIFO Scheduler
(先进先出调度器)、Capacity Scheduler
(容量调度器)、Fair Scheduler
(公平调度器)。Capacity Scheduler
。FIFO Scheduler
是Hadoop1.x中JobTracker原有的调度器实现,此调度器在YARN中保留了下来。先进先出
的思想,即先提交的应用先运行
。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率较低且会导致一些问题。Hadoop3.x默认调度策略
。该策略允许多个组织共享整个集群资源
,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源
,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。层次化的队列设计
(Hierarchical Queues)容量保证
(Capacity Guarantees)安全
(Security)弹性分配
(Elasticity)Fair Scheduler叫做公平调度
,提供了YARN应用程序公平地共享大型集群中资源
的另一种方式。使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。分层队列
:队列可以按层次结构排列以划分资源,并可以配置权重以按特定比例共享集群。资源抢占
:根据应用的配置,抢占和分配资源可以是友好的或是强制的。默认不启用资源抢占。允许资源共享
:即当一个应用运行时,如果其它队列没有任务执行,则可以使用其它队列,当其它队列有应用需要资源时再将占用的队列释放出来。所有的应用都从资源队列中分配资源。学习目标
1.掌握数据仓库是什么、解决什么
2.理解数据仓库有什么特点
3.理解SQL编程语言的概念、优点
4.掌握Apache Hive架构原理、组件
5.掌握Apache Hive客户端使用
6.掌握Apache Hive的建库、建表SQL语法
数据仓库
(英语:Data Warehouse,简称数仓、DW
),是一个用于存储、分析、报告的数据系统
。面向分析
的集成化数据环境,分析结果为企业提供决策支持(Decision Support)。本身并不“生产”任何数据
,其数据来源于不同外部系统;也不需要“消费”任何的数据
,其结果开放给各个外部应用使用;CRM:客户关系管理
先下结论:为了分析数据而来
,分析结果给企业决策提供支撑。
下面以中国人寿保险公司(chinalife)发展为例,阐述数据仓库为何而来?
业务数据存储在哪里呢
?联机事务处理系统(OLTP)
正好可以满足上述业务需求开展, 其主要任务是执行联机事务处理。其基本特征是前台接收的用户数据可以立即传送到后台进行处理,并在很短的时间内给出处理结果
。关系型数据库(RDBMS)是OLTP典型应用
,比如:Oracle、MySQL、SQL Server等。业务数据将会越来越多
。由此也产生出许多运营相关的困惑:基于业务数据开展数据分析,基于分析的结果给决策提供支撑
。也就是所谓的数据驱动决策的制定。可以,但是没必要
读的压力明显大于写的压力
。如果在OLTP环境直接开展各种分析,有以下问题需要考虑:会让读取压力倍增
;仅存储数周或数月的数据
;数据分散
在不同系统不同表中,字段类型属性不统一;为了更好的进行各种规模的数据分析,同时也不影响OLTP系统运行,此时需要构建一个集成统一的数据分析平台
。该平台的目的很简单:面向分析,支持分析
,并且和OLTP系统解耦合。数仓是一个用于存储、分析、报告的数据系统
,目的是构建面向分析的集成化数据环境
。我们把这种面向分析、支持分析的系统称之为OLAP(联机分析处理)系统
。当然,数据仓库是OLAP系统的一种实现。主题
是一个抽象的概念,是较高层次上数据综合
、归类并进行分析利用的抽象。集成到数仓主题下
。是分析数据的平台
,而不是创造数据的平台。数据需要随着时间更新
,以适应决策的需要。数据综合、归类
并进行分析利用的抽象。在逻辑意义上,它是对应企业中某一宏观分析领域所涉及的分析对象。抽象层次上对数据进行完整、一致和准确的描述
。数据通常会分布在多个操作型系统中,彼此分散、独立、异构
。统一与综合,对数据进行抽取、清理、转换和汇总
,这一步是数据仓库建设中最关键、最复杂的一步,所要完成的工作有:统一源数据中所有矛盾之处
;数据综合和计算
。数据仓库是分析数据的平台,而不是创造数据的平台
。我们是通过数仓去分析数据中的规律,而不是去创造修改其中的规律。因此数据进入数据仓库后,它便稳定且不会改变。数据仓库的数据反映的是一段相当长的时间内历史数据的内容
,数据仓库的用户对数据的操作大多是数据查询或比较复杂的挖掘,一旦数据进入数据仓库以后,一般情况下被较长时间保留。数据仓库中一般有大量的查询操作,但修改和删除操作很少
。历史数据
,数据可能与某个特定日期、星期、月份、季度或者年份有关。数据仓库的数据需要随着时间更新,以适应决策的需要
。任何一款编程语言只要具备读写数据、处理数据的能力,都可以用于数仓的开发
。比如大家耳熟能详的C、java、Python等;关键在于编程语言是否易学、好用、功能是否强大
。遗憾的是上面所列出的C、Python等编程语言都需要一定的时间进行语法的学习,并且学习语法之后还需要结合分析的业务场景进行编码,跑通业务逻辑。SQL编程语言,应该称之为分析领域主流开发语言
。结构化查询语言
(Structured Query Language)简称SQL
,是一种数据库查询和程序设计语言,用于存取数据
以及查询
、更新
和管理
数据。标准计算机语言
,各大数据库厂商在生产数据库软件的时候,几乎都会去支持SQL的语法,以使得用户在使用软件时更加容易上手,以及在不同厂商软件之间进行切换时更加适应,因为大家的SQL语法都差不多。功能很强
,十分简洁,核心功能只用了9个动词。语法接近英语口语,所以,用户很容易学习和使用。大数据数仓领域
,很多数仓软件都会去支持SQL语法
;学习SQL成本低
,二是SQL语言对于数据分析真的十分友好,爱不释手
。结构化数据
也称作行数据,是由二维表结构来逻辑表达和实现的数据
,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。非结构化数据
,包括所有格式的办公文档、XML、HTML、各类报表、图片和音频、视频信息等。数据定义语言(DDL)和数据操纵语言(DML)
。创建或删除表
,以及数据库、索引等各种对象,但是不涉及表中具体数据操作:CREATE
DATABASE -创建新数据库表中的数据进行插入、更新、删除、查询
操作:SELECT
-从数据库表中获取数据UPDATE
- 更新数据库表中的数据DELETE
- 从数据库表中删除数据INSERT
- 向数据库表中插入数据数据仓库
系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表
,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL)
,用于访问和分析存储在Hadoop文件中的大型数据集。HQL转换为MapReduce
程序,然后将程序提交到Hadoop群集执行。类SQL语法
,提供快速开发的能力(简单、容易上手
)擅长存储分析海量数据集
Hive利用HDFS存储数据,利用MapReduce查询分析数据
。用户专注于编写HQL
,Hive帮您转换成为MapReduce程序完成对数据的分析
。在HDFS文件系统上有一个文件,路径为/data/china_user.txt;
需求:统计来自于上海年龄大于25岁的用户有多少个?
映射
是指什么?功能职责
?映射
在数学上称之为一种对应关系
,比如y=x+1,对于每一个x的值都有与之对应的y的值。能够写sql处理的前提是针对表,而不是针对文件
,因此需要将文件和表之间的对应关系
描述记录清楚。”映射信息“,专业的叫法称之为元数据信息
(元数据是指用来描述数据的数据metadata)。用户接口
元数据存储
Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器
执行引擎
描述数据的数据
(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。即Hive的元数据
。元数据存储在关系型数据库中
。如hive内置的Derby、或者第三方如MySQL等。元数据服务
。Metastore服务的作用是管理metadata元数据
,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据。远程模式
。本系列课程中使用企业推荐模式--远程模式部署
。服务器基础环境
Hadoop集群健康可用
等待HDFS安全模式关闭之后再启动运行Hive
。# 下面内容需要写入core-site.xml。这里之前写入过了,所以略过
<!-- 整合hive 用户代理设置 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
对于分布式软件,一旦涉及到配置文件修改,必须对每台机器都配置,并且重启后生效
MySQL只需要在一台机器安装并且需要授权远程访问
。rpm -qa|grep mariadb # 查询是否有mariadb
rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps # 删除mariadb
rpm -qa|grep mariadb # 再次查询是否有mariadb
mkdir /export/software/mysql # 创建存放安装包的目录
# 上传mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 到上述文件夹下
tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar # 解包
# 执行安装
yum -y install libaio # 安装依赖
# 安装mysql
rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm mysql-community-libs-5.7.29-1.el7.x86_64.rpm mysql-community-client-5.7.29-1.el7.x86_64.rpm mysql-community-server-5.7.29-1.el7.x86_64.rpm
# 初始化
mysqld --initialize
# 更改所属组
chown mysql:mysql /var/lib/mysql -R
# 启动mysql
systemctl start mysqld.service
# 查看生成的临时root密码
cat /var/log/mysqld.log
[Note] A temporary password is generated for root@localhost: .Yy5n37-mMhm
mysql -u root -p # 登录mysql,密码用上面获得的临时密码 alter user user() identified by "hadoop"; # 更改root密码,设置为hadoop # 授权,以便其他机器可以远程访问 use mysql; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION; FLUSH PRIVILEGES; # 刷新权限 # 按Ctrl+D离开mysql # mysql的启动和关闭 状态查看(这几个命令必须记住) systemctl stop mysqld systemctl status mysqld systemctl start mysqld # 建议设置未开机自启动服务 systemctl enable mysqld # 查看是否已经设置自启动成功 systemctl list-unit-files | grep mysqld
tar zxvf apache-hive-3.1.2-bin.tar.gz
rm -rf apache-hive-3.1.2-bin.tar.gz
cd /export/server/apache-hive-3.1.2-bin
rm -rf lib/guava-19.0.jar # 将hive中的低版本guava删除
cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/ # 将Hadoop中高版本guava复制到hive的lib目录下
hive-env.sh
cd /export/server/apache-hive-3.1.2-bin/conf
mv hive-env.sh.template hive-env.sh # 重命名
vim hive-env.sh
# 在文件中添加下面内容
export HADOOP_HOME=/export/server/hadoop-3.3.0
export HIVE_CONF_DIR=/export/server/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.2-bin/lib
hive-site.xml
vim hive-site.xml <configuration> <!-- 存储元数据mysql相关配置 --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hadoop</value> </property> <!-- H2S运行绑定host --> <property> <name>hive.server2.thrift.bind.host</name> <value>node1</value> </property> <!-- 远程模式部署metastore metastore地址 --> # 远程模式,metastore必须单独配置 <property> <name>hive.metastore.uris</name> <value>thrift://node1:9083</value> </property> <!-- 关闭元数据存储授权 --> <property> <name>hive.metastore.event.db.notification.api.auth</name> <value>false</value> </property> </configuration>
上传mysql jdbc驱动mysql-connector-java-5.1.32.jar
到hive安装包的lib目录下
初始化元数据
cd /export/server/apache-hive-3.1.2-bin/
bin/schematool -initSchema -dbType mysql -verbos
#初始化成功会在mysql中创建74张表
hadoop fs -mkdir /tmp
hadoop fs -mkdir -p /user/hive/warehouse
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
(1)前台启动
,进程会一直占据终端
,ctrl + c结束进程,服务关闭。
可以根据需求添加参数开启debug日志,获取详细日志信息,便于排错。
# 前台启动
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore
(2)后台启动
,输出日志信息在/root目录下nohup.out
# 后台挂起启动
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
# 结束进程
# 使用jps查看进程 使用kill-9杀死进程
# nohup命令,在默认情况下(非重定向时),会输出一个名叫nohup.out的文件到当前目录下
/bin/hive
, 是一个shellUtil。主要功能:一是可用于以交互或批处理模式运行Hive查询;二是用于Hive相关服务的启动,比如metastore服务。/bin/beeline
,是一个JDBC客户端,是官方强烈推荐使用
的Hive命令行工具,和第一代客户端相比,性能加强安全性提高。远程模式下beeline通过Thrift 连接到单独的HiveServer2服务上
,这也是官方推荐在生产环境中使用的模式。启动HiveServer2之前必须先首先启动metastore服务
。首先启动metastore服务,然后启动hiveserver2服务
。nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &
# 将beeline和第一代客户端拷贝到node3
scp -r /export/server/apache-hive-3.1.2-bin/ root@node3:/export/server/
# 由于已经配置了metastore的地址,所以在node3上敲下面命令可以直接访问metastore
/export/server/apache-hive-3.1.2-bin/bin/hive
hiveserver2服务启动之后需要稍等一会才可以对外提供服务
。jdbc:hive2://node1:10000
/export/server/apache-hive-3.1.2-bin/bin/beeline
# 与第一代客户端不同,通过beeline访问,我们还需要手动输入地址
beeline> ! connect jdbc:hive2://node1:10000 # jdbc:hive2://是协议前缀,表示通过jdbc协议与hiveserver2通信,后面是hive地址,表示hive地址在node1上,端口是10000(默认端口)
# 输入具有权限的用户,如root
beeline> root
# 没有密码,所以直接回车
DataGrip
、Dbeaver、SQuirrel SQL Client等
可以在Windows、MAC平台中通过JDBC连接HiveServer2的图形界面工具
;
这类工具往往专门针对SQL类软件进行开发优化、页面美观大方,操作简洁
,更重要的是SQL编辑环境优雅
;
SQL语法智能提示补全、关键字高亮、查询结果智能显示、按钮操作大于命令操作
;
DataGrip
DataGrip是由JetBrains公司推出的数据库管理软件,DataGrip支持几乎所有主流的关系数据库产品,如DB2、Derby、MySQL、Oracle、SQL Server等,也支持几乎所有主流的大数据生态圈SQL软件
,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。
数据定义语言
(Data Definition Language,DDL
),是SQL语言集中对数据库内部的对象结构进行创建,删除,修改
等的操作语言,这些数据库对象包括database、table等。DDL并不涉及表内部数据的操作
。HQL中create语法(尤其create table)将是学习掌握Hive DDL语法的重中之重
。选择正确的方向,往往比盲目努力重要
。本课程主要讲解基础的建库与建表语法操作
create database用于创建新的数据库
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
如果需要使用location指定路径的时候,最好指向的是一个新创建的空文件夹。
create database if not exists itcast
comment "this is my first db"
with dbproperties ('createdBy'='Allen');
选择特定的数据库
删除数据库
要删除带有表的数据库(不为空的数据库),我们可以使用CASCADE
。DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
# Hive DDL 建表语法树
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
(col_name data_type [COMMENT col_comment], ...)
[COMMENT table_comment]
[ROW FORMAT DELIMITED ...];
建表语句中的语法顺序要和语法树中顺序保持一致
。CREATE TABLE table_name (col_name data_type);
原生数据类型
(primitive data type)和复杂数据类型
(complex data type)。字符串String
和数字类型Int
。ROW FORMATDELIMITED
语法用于指定字段之间等相关的分隔符,这样Hive才能正确的读取解析数据。指定字段之间
、集合元素之间、map映射kv之间、换行的分隔符号。默认的分割符是'\001'
,是一种特殊的字符,使用的是ASCII编码的值,键盘是打不出来的。因为hive底层将原数据保存在mysql中,但Mysql默认编码不支持中文,它主要支持的是latin1的编码。
解决方法是:
# 登录mysql的hive3数据库
mysql -u root -p # 输入账号密码
use hive3;
# 执行以下代码修改hive3数据库存储的元数据信息
alter table hive3.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table hive3.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive3.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8 ;
alter table hive3.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table hive3.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
1、数据类型
2、分隔符指定
3、默认分隔符
文件archer.txt中记录了手游《王者荣耀》射手的相关信息,包括生命、物防、物攻等属性信息,其中字段之间分隔符为制表符\t,要求在Hive中建表映射成功该文件。
--1、创建一张表 将射手结构化数据文件在Hive中映射成功 -- 表名 -- 字段 名称 类型 顺序 -- 字段之间的分隔符需要指定 create table itheima.t_archer( id int comment "ID编号", name string comment "英雄名称", hp_max int comment "最大生命", mp_max int comment "最大法力", attack_max int comment "最高物攻", defense_max int comment "最大物防", attack_range string comment "攻击范围", role_main string comment "主要定位", role_assist string comment "次要定位" ) row format delimited fields terminated by "\t"; --字段之间的分隔符是tab键 制表符
archer.txt
文件上传到对应的表文件夹下。文件team_ace_player.txt中记录了手游《王者荣耀》主要战队内最受欢迎的王牌选手信息,字段之间使用的是\001作为分隔符,要求在Hive中建表映射成功该文件。
--1、显示所有数据库SCHEMAS和DATABASES的用法功能一样
show databases;
show schemas;
--2、显示当前数据库所有表
show tables;
SHOW TABLES [IN database_name]; --指定某个数据库
--3、查询显示一张表的元数据信息
desc formatted t_team_ace_player;
学习目标
1.掌握Hive SQL Load加载数据语句
2.掌握Hive SQL Insert插入数据语句
3.掌握Hive SQL Select基础查询语句
4.掌握Hive SQL Join查询语句
5.掌握Hive SQL 常用函数的使用
文件夹名字就是表名
;/user/hive/warehouse
;hadoop fs –put
|-mv等方式直接将数据移动到表文件夹下;Hive官方推荐使用Load命令将数据加载到表中
。加载、装载
;将数据文件移动到与Hive表对应的位置,移动时是纯复制、移动操作
。纯复制、移动
指在数据load加载到表中时,Hive不会对表中的数据内容进行任何转换,任何操作。LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
filepath
表示待移动数据的路径
。可以指向文件(在这种情况下,Hive将文件移动到表中),也可以指向目录(在这种情况下,Hive将把该目录中的所有文件移动到表中)。具有schema的完整URI
,例如:hdfs://namenode:9000/user/hive/project/data1指定LOCAL
,将在本地文件系统中查找文件路径。没有指定LOCAL
关键字。本地文件系统
指的是Hiveserver2服务所在机器的本地Linux文件系统
,不是Hive客户端所在的本地文件系统。1、练习Load Data From Local FS
2、练习Load Data From HDFS
3、理解Local关键字的含义
--建表student_local 用于演示从本地加载数据
create table student_local(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ',';
--建表student_HDFS 用于演示从HDFS加载数据
create table student_HDFS(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ',';
--建议使用beeline客户端 可以显示出加载过程日志信息
--step2:加载数据
-- 从本地加载数据 数据位于HS2(node1)本地文件系统 本质是hadoop fs -put上传操作
LOAD DATA LOCAL INPATH '/root/hivedata/students.txt' INTO TABLE student_local;
# Loading data to table itheima.student_local from file:/root/hivedata/students.txt
--从HDFS加载数据 数据位于HDFS文件系统根目录下 本质是hadoop fs -mv移动操作
--先把数据上传到HDFS上 hadoop fs -put /root/hivedata/students.txt /
LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS;
# Loading data to table itheima.student_hdfs from hdfs://node1:8020/students.txt
清洗数据成为结构化文件,再使用Load语法加载数据到表中
。这样的效率更高。把查询返回的结果插入到另一张表中
。insert+select表示:将后面查询返回的结果作为内容插入到指定表中
。列的数目
和需要插入数据表格的列数目一致
。数据类型
和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。insert into table tablename select_statement1 from from_statement;
内容均可以参考SQL相关知识,已经学过,这里略。
内容均可以参考SQL相关知识,已经学过,这里略。
内置函数(build-in)
指的是Hive开发实现好,直接可以使用的函数,也叫做内建函数。https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
------------String Functions 字符串函数------------
select length("itcast");
select reverse("itcast");
select concat("angela","baby");
--带分隔符字符串连接函数:concat_ws(separator, [string | array(string)]+)
select concat_ws('.', 'www', array('itcast', 'cn'));
--字符串截取函数:substr(str, pos[, len]) 或者substring(str, pos[, len])
select substr("angelababy",-2); --pos是从1开始的索引,如果为负数则倒着数
select substr("angelababy",2,2);
--分割字符串函数: split(str, regex)
select split('apache hive', ' ');
select split('apache hive', ' ')[0];
select split('apache hive', ' ')[1];
-----------Date Functions 日期函数----------------- --获取当前日期: current_date select current_date(); --获取当前UNIX时间戳函数: unix_timestamp select unix_timestamp(); --日期转UNIX时间戳函数: unix_timestamp select unix_timestamp("2011-12-07 13:01:03"); --指定格式日期转UNIX时间戳函数: unix_timestamp select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss'); --UNIX时间戳转日期函数: from_unixtime select from_unixtime(1618238391); select from_unixtime(0, 'yyyy-MM-dd HH:mm:ss'); --日期比较函数: datediff 日期格式要求'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd' select datediff('2012-12-08','2012-05-09'); --日期增加函数: date_add select date_add('2012-02-28',10); --日期减少函数: date_sub select date_sub('2012-01-1',10);
----Mathematical Functions 数学函数-------------
--取整函数: round 返回double类型的整数值部分(遵循四舍五入)
select round(3.1415926);
--指定精度取整函数: round(double a, int d) 返回指定精度d的double类型
select round(3.1415926,4);
--取随机数函数: rand 每次执行都不一样返回一个0到1范围内的随机数
select rand();
--指定种子取随机数函数: rand(int seed) 得到一个稳定的随机数序列
select rand(3);
-----Conditional Functions 条件函数------------------
--使用之前课程创建好的student表数据
select * from student limit 3;
--if条件判断: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
select if(1=2,100,200);
select if(sex ='男','M','W') from student limit 3;
--空值转换函数: nvl(T value, T default_value)
select nvl("allen","itcast");
select nvl(null,"itcast");
--条件转换函数: CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end;
select case sex when '男' then 'male' else 'female' end from student limit 3;
学习目标
1.了解案例背景、目标需求、原始数据内容
2.掌握Hive数仓建库建表、ETL操作
3.掌握Hive SQL查询统计分析的基本操作
4.知道FineBI基本报表图形的使用与构建
陌陌作为聊天平台每天都会有大量的用户在线,会出现大量的聊天数据,通过对聊天数据的统计分析
,可以更好的对用户构建精准的用户画像
,为用户提供更好的服务以及实现高ROI
的平台运营推广
,给公司的发展决策提供精确的数据支撑。
基于Hadoop和Hive实现聊天数据统计分析,构建聊天数据分析报表
总消息量
每小时
消息量、发送和接收用户数各地区
发送消息数据量用户数
发送消息最多的Top10用户
接收消息最多的Top10用户
手机型号分布情况
设备操作系统分布情况
制表符\t
略
https://www.finebi.com/
商业智能
(B
usiness I
ntelligence)产品。FineBI 是定位于自助大数据分析的BI 工具,能够帮助企业的业务人员和数据分析师,开展以问题导向的探索式分析。略
略
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。