嗨,大家好。我是薄荷加点糖,我是一名java后端开发,一名彻头彻尾的coder。我今天的分享主要想解决的问题是 (下一张PPT)
本次分享期望可以达成的目标,期望大家可以跟着我的思路来,我也希望通过本次分享可以把大家带入门!
万事开头难!!!!为了让大家不会从入门到放弃,我会从最简单的讲,后续会慢慢深入
面对新的技术,大家可能都有类似的问题: 我改怎么快速的去应用它?如果要应用,我要从哪里入手呢?业务中遇到新问题我改怎么办?
我该从哪里入手? 我什么都不了解,一脸懵逼状态......
本次分享的主要内容(主要围绕)是:
主要分享hdfs、sqoop、hive三个hadoop生态系统里的技术
基本环境介绍之操作系统
操作系统 Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-65-generic x86_64)
LTS: Long-term support
仿生海狸
基本环境介绍之操作系统
Ubuntu版本的命名规则是根据正式版发行的年月命名,Ubuntu 8.10也就意味着2008年10月发行的Ubuntu,研发人员与使用者可从版本号码就知道正式发布的时间。Ubuntu是基于Debian开发的Linux发行版,Debian的开发代号来自于电影玩具总动员,不过,Ubuntu各版本的代号却固定是形容词加上动物名称,而且这2个词的英文首字母一定是相同的。从Ubuntu 6.06开始,两个词的首字母按照英文字母表的排列顺序取用
操作系统 Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-65-generic x86_64)
LTS: Long-term support
仿生海狸
https://zh.wikipedia.org/wiki/Ubuntu发行版列表
基本环境介绍之环境部署
基本环境介绍之hosts 配置
要去除hosts文件中多余的内容
基本环境介绍之安装目录及操作用户
基础目录是为了规范,部署方便,应用方便
Sundix -> sudo su -> root
source /etc/profile
基础目录——> 主要是用于规范才会有第二节
在规范目录的情况下 配置 ~/.bashrc
组件基本运用主要讲解的是实施过程中常用的命令
主要是常规操作
Hadoop
主要是基于FileSystemShell
演示:
source /etc/profile
hdfs dfs -mkdir /yanshi
touch file
hdfs dfs -put file /yanshi
hdfs dfs -mkdir /yanshi/a
hdfs dfs -mkdir /yanshi/b
hdfs dfs -cp /yanshi/file /yanshi/b
hdfs dfs -mv /yanshi/file /yanshi/a
hdfs dfs -mv /yanshi/a/file /yanshi/a/file2
数据仓库离线分析工具
Hive 只适合用来做海量离线数 据统计分析,也就是数据仓库
原则上不支持更新操作
与mysql的区别非常小,不想讲函数的,如果讲函数的话,就讲不完了,哈哈
导出不能导出复杂的sql,只能借助中间表
音标:[dˈbivɚ]
可以看下hadoop的任务执行情况
可以使用shell 也可以使用 dbeaver
知道分类,可以确定大致的方向
Hadoop和RDBMS之间传送数据的工具
sqoop-1.4.7.bin__hadoop-2.6.0
主要从整体上有一个大概的认知
Hadoop 狭义上可以看成是 HDFS MapReduce Yarn,即分布式存储 作业 调度,是处理海量数据的整体解决方案,HDFS为海量数据提供存储,MapReduce为海量数据提供计算框架,Yarn负责集群资源的管理和调度
HDFS是Hadoop兼容最好的标准级文件系统,因为Hadoop是一个综合性的文件系统抽象,所以HDFS不是Hadoop必需的。所以可以理解为Hadoop是一个框架,HDFS是Hadoop中的一个部件
整个HDFS集群由Namenode和Datanode构成master-worker(主从)模式。Namenode负责构建命名空间,管理文件的元数据等,而Datanode负责实际存储数据,负责读写工作。
1. NameNode概述
a、 NameNode是HDFS的核心。
b、 NameNode也称为Master。
c、 NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件。
d、 NameNode不存储实际数据或数据集。数据本身实际存储在DataNodes中。
e、 NameNode知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道如何从块中构建文件。
f、 NameNode并不持久化存储每个文件中各个块所在的DataNode的位置信息,这些信息会在系统启动时从数据节点重建。
g、 NameNode对于HDFS至关重要,当NameNode关闭时,HDFS / Hadoop集群无法访问。
h、 NameNode是Hadoop集群中的单点故障。
i、 NameNode所在机器通常会配置有大量内存(RAM)
2. DataNode概述
a、 DataNode负责将实际数据存储在HDFS中。
b、 DataNode也称为Slave。
c、 NameNode和DataNode会保持不断通信。
d、 DataNode启动时,它将自己发布到NameNode并汇报自己负责持有的块列表。
e、 当某个DataNode关闭时,它不会影响数据或群集的可用性。NameNode将安排由其他DataNode管理的块进行副本复制。
f、 DataNode所在机器通常配置有大量的硬盘空间。因为实际数据存储在DataNode中。
g、 DataNode会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向NameNode发送心跳,如果NameNode长时间没有接受到DataNode发送的心跳, NameNode就会认为该DataNode失效。
h、 block汇报时间间隔取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时.
后续需要做hdfs的高可用方案(HA) High Available
YARN是Hadoop集群的资源管理系统。Hadoop2.0对MapReduce框架做了彻底的设计重构。YARN的基本设计思想是将MRv1中的JobTracker拆分成了两个独立的服务:一个全局的资源管理器ResourceManager和每个应用程序特有的ApplicationMaster。其中ResourceManager负责整个系统的资源管理和分配,而ApplicationMaster负责单个应用程序的管理
1.用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
2.ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
3.ApplicationMaster首先向ResourceManager注册,这样用户就可以直接通过ResourceManager查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
4.ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
5.一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
6.NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
7.各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
8.应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。
资源利用率高。如果每个框架一个集群,可能在某段时间内,有些计算框架的集群资源紧张,而另外一些集群资源空闲。共享集群模式则通过多种框架共享资源,使得集群中的资源得到更加充分的利用。
运维成本低。如果采用“一个框架一个集群”的模式,则可能需要多个管理员管理这些集群,进而增加运维成本,而共享模式通常需要少数管理员即可完成多个框架的统一管理。
数据共享。随着数据量的暴增,跨集群间的数据移动不仅需花费更长的时间,且硬件成本也会大大增加,而共享集群模式可让多种框架共享数据和硬件资源,将大大减小数据移动带来的成本。
从上图看出hive的内部架构由四部分组成:
1、用户接口: shell/CLI, jdbc/odbc, webui Command Line Interface
CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive 进行交互,最常用(学习,调试,生产)
JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过 这连接至 Hive server 服务
Web UI,通过浏览器访问 Hive
2、跨语言服务 : thrift server 提供了一种能力,让用户可以使用多种不同的语言来操纵hive
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发, Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口
3、底层的Driver: 驱动器Driver,编译器Compiler,优化器Optimizer,执行器Executor
Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行 计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行
Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
(1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)
(2) 编译器:编译器是将语法树编译为逻辑执行计划
(3) 优化器:优化器是对逻辑执行计划进行优化
(4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划
4、元数据存储系统 : RDBMS MySQL
元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。
Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和 外部表),表的数据所在目录
Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存 储目录不固定。数据库跟着 Hive 走,极度不方便管理
解决方案:通常存我们自己创建的 MySQL 库(本地 或 远程)
Hive 和 MySQL 之间通过 MetaStore 服务交互
执行流程
HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 MetaStore 中的元数 据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后通过的优化处理,产生 一个 MapReduce 任务。
首先明确一个态度:
问题都是可以解决的,慢慢来~~
- 不要慌张,不要着急,因为问题已经出现,临危不乱
- 确定问题影响面有多大
- 确定是否需要上报(涉及公司,公关,客服,公司的命运,很多家庭,法务等等)
- 定位问题,看表象,看日志(物理故障,程序故障)
- 确定问题修复分支上线时间
- 复盘故障
执行hdfs namenode -format后,current目录会删除并重新生成,其中VERSION文件中的clusterID也会随之变化,而datanode的VERSION文件中的clusterID保持不变,造成两个clusterID不一致。
所以为了避免这种情况,可以再执行的namenode格式化之后,删除datanode的current文件夹,或者修改datanode的VERSION文件中出clusterID与namenode的VERSION文件中的clusterID一样,然后重新启动datanode。
这些都是jar包的问题,一般集中在sqoop设计到的应用包,例如
hadoop-hdfs包,jar包等等
Error: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ
这个问题是由于hive的元数据存储MySQL配置不当引起的,可以这样解决:
登录进mysql服务器,输入命令 set global binlog_format=‘MIXED';
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
是guava包的问题,使用hadoop下的guava包即可
Unauthorized request to start container
这个问题是master与slave的时间不同步造成的,导致yarn不能很好的管理,需要同步时间
同步时间使用ntpdate来同步,统一获取国内的时间ip为85.199.214.100
ntpdate 没有的使用apt install ntpdate 来安装即可
ntpdate -u 85.199.214.100
hive中文字符乱码
hive表更新(update,delete)支持
csv日本文件乱码问题
csv文件内容不能够满足业务,需要编码统一处理
csv文件列数不一致问题,每个国家列数不一致
csv文件列命名有差异
日本金额逗号问题,使用正则替换
完善操作脚本——各种场景 —— 预案
所有服务配置成系统级服务——主要是想利用系统提供的功能,来提高程序的可靠性
后端管理程序——站在高一层的角度来管理程序
一键异常处理——需要总结,故障记录,行程异常处理产品
完善操作脚本——各种场景 —— 预案
所有服务配置成系统级服务——主要是想利用系统提供的功能,来提高程序的可靠性
后端管理程序——站在高一层的角度来管理程序
一键异常处理——需要总结,故障记录,行程异常处理产品
沉淀知识 —— 走过很多弯路,我们要沉淀下来属于自己的东西
面对问题应该抱有什么态度
发挥团队的力量
独立解决问题的能力
解决问题后,我们需要复盘解决问题
要一次次的锻炼自己的能力,要知道我们在公司是干啥的,提升自己的技能,顺便完成公司的业务
身体很重要,不要拼命~ 有时我们需要为公司做事,但是要有健康的身体
这一周期我的工作类似再做架构,做框架一样,数据需要大家往里面填充
感谢大家的聆听。