Hadoop+Hive大数据学习笔记

官方示例pi日志

[root@hadoop1 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.3.3.jar pi 2 4
Number of Maps  = 2
Samples per Map = 4
Wrote input for Map #0
Wrote input for Map #1
Starting Job
/*连接到yarn资源管理器*/
2022-12-28 21:13:15,443 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop1/192.168.88.128:8032
2022-12-28 21:13:16,109 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1672219299361_0001
2022-12-28 21:13:16,348 INFO input.FileInputFormat: Total input files to process : 2
2022-12-28 21:13:16,586 INFO mapreduce.JobSubmitter: number of splits:2
/* 任务编号 */
2022-12-28 21:13:16,758 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1672219299361_0001
2022-12-28 21:13:16,758 INFO mapreduce.JobSubmitter: Executing with tokens: []
2022-12-28 21:13:16,954 INFO conf.Configuration: resource-types.xml not found
2022-12-28 21:13:16,954 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2022-12-28 21:13:17,368 INFO impl.YarnClientImpl: Submitted application application_1672219299361_0001
2022-12-28 21:13:17,421 INFO mapreduce.Job: The url to track the job: http://hadoop1:8088/proxy/application_1672219299361_0001/
2022-12-28 21:13:17,422 INFO mapreduce.Job: Running job: job_1672219299361_0001
2022-12-28 21:13:27,642 INFO mapreduce.Job: Job job_1672219299361_0001 running in uber mode : false
2022-12-28 21:13:27,643 INFO mapreduce.Job:  map 0% reduce 0%
2022-12-28 21:13:34,752 INFO mapreduce.Job:  map 100% reduce 0%
2022-12-28 21:13:41,820 INFO mapreduce.Job:  map 100% reduce 100%
2022-12-28 21:13:42,841 INFO mapreduce.Job: Job job_1672219299361_0001 completed successfully
2022-12-28 21:13:42,929 INFO mapreduce.Job: Counters: 54
	File System Counters
		FILE: Number of bytes read=50
		FILE: Number of bytes written=830529
		FILE: Number of read operations=0
		FILE: Number of large read operations=0
		FILE: Number of write operations=0
		HDFS: Number of bytes read=524
		HDFS: Number of bytes written=215
		HDFS: Number of read operations=13
		HDFS: Number of large read operations=0
		HDFS: Number of write operations=3
		HDFS: Number of bytes read erasure-coded=0
	Job Counters 
		Launched map tasks=2
		Launched reduce tasks=1
		Data-local map tasks=2
		Total time spent by all maps in occupied slots (ms)=8963
		Total time spent by all reduces in occupied slots (ms)=4665
		Total time spent by all map tasks (ms)=8963
		Total time spent by all reduce tasks (ms)=4665
		Total vcore-milliseconds taken by all map tasks=8963
		Total vcore-milliseconds taken by all reduce tasks=4665
		Total megabyte-milliseconds taken by all map tasks=9178112
		Total megabyte-milliseconds taken by all reduce tasks=4776960
	Map-Reduce Framework
		Map input records=2
		Map output records=4
		Map output bytes=36
		Map output materialized bytes=56
		Input split bytes=288
		Combine input records=0
		Combine output records=0
		Reduce input groups=2
		Reduce shuffle bytes=56
		Reduce input records=4
		Reduce output records=0
		Spilled Records=8
		Shuffled Maps =2
		Failed Shuffles=0
		Merged Map outputs=2
		GC time elapsed (ms)=690
		CPU time spent (ms)=4150
		Physical memory (bytes) snapshot=829210624
		Virtual memory (bytes) snapshot=8429346816
		Total committed heap usage (bytes)=665321472
		Peak Map Physical memory (bytes)=301932544
		Peak Map Virtual memory (bytes)=2807894016
		Peak Reduce Physical memory (bytes)=226910208
		Peak Reduce Virtual memory (bytes)=2814918656
	Shuffle Errors
		BAD_ID=0
		CONNECTION=0
		IO_ERROR=0
		WRONG_LENGTH=0
		WRONG_MAP=0
		WRONG_REDUCE=0
	File Input Format Counters 
		Bytes Read=236
	File Output Format Counters 
		Bytes Written=97
Job Finished in 27.567 seconds
Estimated value of Pi is 3.50000000000000000000

CentOS-7.9.iso 

https://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

免密登录

 

进行三次ssh hadoop102 103 104
[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)
进行三次ssh-copy-id hadoop102 103 104

 Hadoop 

GitHub - codeNiuMa/my-hadoop-file: 学Hadoop使用的资料

下载地址:Apache Hadoop

        Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决海量数据的存储和海量数据的分析计算问题。

广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈

三大发行版本*

Apache 版本最原始(最基础)的版本,对于入门学习最好。2006

Cloudera 内部集成了很多大数据框架,对应产品 CDH。2008

Hortonworks 文档较好,对应产品 HDP。

Hortonworks 现在已经被 Cloudera 公司收购,推出新的品牌 CDP——Enterprise Data Management Platforms & Products | Cloudera

优势典中典

1)高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元 素或存储出现故障,也不会导致数据的丢失。

2)高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点

3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处 理速度。

4)高容错性:能够自动将失败的任务重新分配

Hadoop1.x和2.x 组成

在 Hadoop1.x 时代 , Hadoop中的MapReduce同 时处理业务逻辑运算和资源的调度,耦合性较大。

在Hadoop2.x时代,增 加 了Yarn。Yarn只负责资源的调度 , MapReduce 只负责运算。 Hadoop3.x在组成上没有变化。

HDFS

Hadoop Distributed File System,简称 HDFS,是一个分布式文件系统

1)NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、 文件权限),以及每个文件的块列表和块所在的DataNode等。

2)DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和。

3)Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份。

YARN

Yet Another Resource Negotiator 简称 YARN ,另一种资源协调者,是 Hadoop 的资源管理器。

通用资源管理系统,对上层MapReduce、Spark等提供服务,对于用户无感知

MR

MapReduce 将计算过程分为两个阶段:Map 和 Reduce

1)Map 阶段并行处理输入数据

2)Reduce 阶段对 Map 结果进行汇总

HDFS、YARN、MR配合

Hadoop运行模式

  • 本地模式:单机运行,只是用来演示一下官方案例。生产环境不用
hadoop jar 
./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar 
wordcount wcinput wcoutput
  • 伪分布式模式:也是单机运行,但是具备 Hadoop 集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司用来测试,生产环境不用。
  • 完全分布式模式:多台服务器组成分布式环境。生产环境使用。

完全分布式模式

1)准备 3 台客户机(关闭防火墙、静态 IP、主机名称) 2)安装 JDK 3)配置环境变量 4)安装 Hadoop 5)配置环境变量 6)配置集群  7)单点启动 8)配置 ssh 9)群起并测试集群

NameNode 和 SecondaryNameNode 不要安装在同一台服务器 

ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在 同一台机器上。

Hadoop 配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认 配置值时,才需要修改自定义配置文件,更改相应属性值。

(2)自定义配置文件: core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 四个配置文件存放在 $HADOOP_HOME/etc/hadoop 这个路径上,用户可以根据项目需求重新进行修改配置。

 如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找 不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停 止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。

NameNode上启动hdfs
[root@hadoop102 hadoop]# start-dfs.sh 
ResourceManager启动yarn
[root@hadoop103 hadoop]# start-yarn.sh 

hdfs上存放的文件实际上是在hadoop的data文件夹中

HDFS

        HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目 录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务 器有各自的角色。

        随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS 只是分布式文件管理系统中的一种。

适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭 之后就不需要改变。

优缺点

1)高容错性

2)适合处理大数据

数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据; 

文件规模:能够处理百万规模以上的文件数量,数量相当之大。

3)可构建在廉价机器上,通过多副本机制,提高可靠性

  • 不适合低延时数据访问
  • 无法高效的对大量小文件进行存储

存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和 块信息,小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标

  • 不支持并发写入、文件随机修改。

架构

1)NameNode(nn):就是Master,它 是一个主管、管理者。

(1)管理HDFS的名称空间;(2)配置副本策略;(3)管理数据块(Block)映射信息;(4)处理客户端读写请求。

2)DataNode:就是Slave。NameNode 下达命令,DataNode执行实际的操作。

(1)存储实际的数据块;(2)执行数据块的读/写操作。

3)Client:就是客户端。

(1)文件切分。Client将文件切分成一个一个的Block进行上传;(2)与NameNode交互,获取文件的位置信息;(3)与DataNode交互,读取或者写入数据;(4)Client提供一些命令来管理HDFS,比如NameNode格式化;(5)Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作;

4)Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不 能马上替换NameNode并提供服务。

(1)辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode ;(2)在紧急情况下,可辅助恢复NameNode

文件块大小

为什么块的大小不能设置太小,也不能设置太大?

(1)HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置; (2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开 始位置所需的时间。导致程序在处理这块数据时,会非常慢。

总结:HDFS块的大小设置主要取决于磁盘传输速率。

读写流程

节点距离计算

NN&2NN

        首先,我们做个假设,如果存储在 NameNode 节点的磁盘中,因为经常需要进行随机访 问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在 内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的 FsImage。

        这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新 FsImage,就会导 致效率过低,但如果不更新,就会发生一致性问题,一旦 NameNode 节点断电,就会产生数 据丢失。因此,引入 Edits 文件(只进行追加操作,效率很高)。每当元数据有更新或者添 加元数据时,修改内存中的元数据并追加到 Edits 中。这样,一旦 NameNode 节点断电,可 以通过 FsImage 和 Edits 的合并,合成元数据。

        但是,如果长时间添加数据到 Edits 中,会导致该文件数据过大,效率降低,而且一旦 断电,恢复元数据需要的时间过长。因此,需要定期进行 FsImage 和 Edits 的合并,如果这 个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode, 专门用于 FsImage 和 Edits 的合并

datanode

MapReduce

MapReduce 是一个分布式运算程序的编程框架,MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的 分布式运算程序,并发运行在一个 Hadoop 集群上。

1)MapReduce 易于编程  2)良好的扩展性,简单的增加机器来扩展它的计算能力  3)高容错性  4)适合 PB 级以上海量数据的离线处理.

1)不擅长实时计算  2)不擅长流式计算,MapReduce 的输入数据集是静态的  3)不擅长 DAG(有向无环图)计算,多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出

流程

序列化

序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁 盘(持久化)和网络传输。

反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换 成内存中的对象。

为什么不用 Java 的序列化? Java 的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带 很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。所以, Hadoop 自己开发了一套序列化机制(Writable)。(1)紧凑 :高效使用存储空间。 (2)快速:读写数据的额外开销小。 (3)互操作:支持多语言的交互

原理

(1)简单地按照文件的内容长度进行切片 (2)切片大小,默认等于Block大小 (3)切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

Yarn

Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式 的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序。

ResourceManager、NodeManager、ApplicationMaster 和 Container

工作机制

(1)MR 程序提交到客户端所在的节点。 (2)YarnRunner 向 ResourceManager 申请一个 Application。 (3)RM 将该应用程序的资源路径返回给 YarnRunner。 (4)该程序将运行所需资源提交到 HDFS 上。 (5)程序资源提交完毕后,申请运行 mrAppMaster。 (6)RM 将用户的请求初始化成一个 Task。 (7)其中一个 NodeManager 领取到 Task 任务。 (8)该 NodeManager 创建容器 Container,并产生 MRAppmaster。(9)Container 从 HDFS 上拷贝资源到本地。 (10)MRAppmaster 向 RM 申请运行 MapTask 资源。 (11)RM 将运行 MapTask 任务分配给另外两个 NodeManager,另两个 NodeManager 分 别领取任务并创建容器。 (12)MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个 NodeManager 分别启动 MapTask,MapTask 对数据分区排序。 (13)MrAppMaster 等待所有 MapTask 运行完毕后,向 RM 申请容器,运行 ReduceTask。 (14)ReduceTask 向 MapTask 获取相应分区的数据。 (15)程序运行完毕后,MR 会向 RM 申请注销自己。 

 Yarn 调度器和调度算法

Hadoop 作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(FairScheduler)。Apache Hadoop3.1.3 默认的资源调度器是 Capacity Scheduler。

具体设置详见:yarn-default.xml 文件

FIFO 调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务

Capacity Scheduler 是 Yahoo 开发的多用户调度器,该调度器会对同一用户提交的作业所占资源量进行限定。

Fair Schedulere 是 Facebook 开发的多用户调度器,同队列所有任务共享资源,在时间尺度上获得公平的资源

核心参数

Hive

数据仓库

Hive是什么

 

元数据服务

 在linux上安装mysql

Linux安装MySQL详细步骤

连接结构

 Hive可视化三方工具

以datagrip为例进行配置

 

数据库路径

hsfs中

执行过程

1.创建数据库

2.建表

3.将结构化文件上传到hdfs文件夹中

4.自动生成

 上传文件方法

通过hdfs命令上传

[root@hadoop1 hivedata]# hadoop fs -put 1.txt /user/hive/warehouse/yuange.db/t_1

Hive提供的Load语法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
-- LOCAL指Hive所在的本地

-- 没有指定LOCAL关键字。
-- 如果filepath指向的是一个完整的URI,会直接使用这个URI;
-- 如果没有指定schema,Hive会使用在hadoop配置文件中参数fs.default.name指定的(不出意外,都是HDFS)

例:

Linux本地

0: jdbc:hive2://hadoop1:10000> LOAD DATA LOCAL INPATH '/root/hivedata/students.txt' INTO TABLE student_local;

HDFS

0: jdbc:hive2://hadoop1:10000> LOAD DATA INPATH '/mydir1/txt/students.txt' INTO TABLE student_HDFS; 

 基本操作 DDL

 

创建数据库

使用数据库

use database name;

删除数据库

 建表create table

create table t_archer(
    id int comment "ID",
    name string comment "name",
    hp int comment "生命值",
    mp int comment "法力值",
    attack int comment "攻击",
    defense int comment "防御",
    att_range string comment "攻击范围",
    role_main string comment "定位",
    role_assist string comment "次要定位"
)
row format delimited
fields terminated by "\t";

 默认分隔符\001

插入insert

insert into table student_from_insert select num,name from student;

聚合函数 

【MySQL】17-超详细的MySQL聚合函数总结_自牧君的博客-CSDN博客_mysql 所有聚合函数

join 

内连接inner join

--1、inner join
select e.id,e.name,e_a.city,e_a.street
from employee e inner join employee_address e_a
on e.id =e_a.id;

--等价于 inner join=join
select e.id,e.name,e_a.city,e_a.street
from employee e join employee_address e_a
on e.id =e_a.id;


--等价于 隐式连接表示法
select e.id,e.name,e_a.city,e_a.street
from employee e , employee_address e_a
where e.id =e_a.id;

 

左连接left join

--2、left join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e left join employee_connection e_conn
on e.id =e_conn.id;

--等价于 left outer join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e left outer join  employee_connection e_conn
on e.id =e_conn.id;

 

执行顺序 

函数

LanguageManual UDF - Apache Hive - Apache Software Foundation

-----------------Hive 常用的内置函数----------------------
show functions;
describe function extended count;


------------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)
--split针对字符串数据进行切割  返回是数组array  可以通过数组的下标取内部的元素 注意下标从0开始的
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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值