赵壮-大数据方向-离线方向 扫二维码继续学习 二维码时效为半小时

(0评价)
价格: 免费

hive的调优:

1.fetch的抓取  能不走mr就不走mr

hive.fetch.task.conversion 有三个取值 none,minimal,more

如果设置成none,所有的都要走mr 

默认值是more,执行查询语句都不会执行mapreduce

 

2.本地模式

如果有大量的小文件,分配资源的时间远远地超过了数据处理的时间,这时就可以使用本地模式:限制输入数据的个数小于多少个和输入数据的数据量小于多少M时,启用本地模式来进行运行,所有的数据都会在一个maptask里面处理,都在一个reducetask里面处理

 

表的优化:

1.Join 

早期的hive版本:小表为主表join大表,会将小表的数据一次性进入到内存中去,与右边的大表进行匹配(现在的版本不存在了,因为hive有一个优化器,经过自动选择,可以自动找出哪个表时小表)

[展开全文]
CodeRookie · 2020-03-02 · 解锁式学习 0

第一种 hive-site.xml 对所有的hive的客户端都有效

第二种 命令行参数 bin/hive -hiveconf 参数名=参数值,对我们进入的这次会话有效

第三种 参数声明 set 参数名=参数值 对当前的sql语句有效

 

hive的自定义函数

第一种:UDF 一行数据进 一行数据出//转大小写

第二种:UDAF 多行进,一行出//求最大最小值

第三种:UDTF 一行进,多行出//

[展开全文]
CodeRookie · 2020-02-29 · 解锁式学习 0

第二种表模型:外部表,删除表的时候不会删除HDFS上的数据,因为指定HDFS其他位置路径的数据,加载到hive的表中来

hive认为数据是从其他地方移动过来的,hive表没有完全地独占这份数据,删除表的时候不能删除数据

 

创建老师表

CREATE EXTERNAL TABLE teacher(
t.id STRING,t.name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

创建学生表

CREATE EXTERNAL TABLE student(
s.id STRING,
s.name STRING,
s.birth STRING,
s.sex STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

加载数据

从本地文件系统向表中加载数据

LOAD DATA LOCAL INPATH '/export/servers/hivedatas/student.csv' INTO TABLE student;

加载数据并覆盖已有数据

LOAD DATA LOCAL INPATH '/export/servers/hivedatas/student.csv' OVERWRITE INTO TABLE student;

 

[展开全文]
CodeRookie · 2020-02-28 · 解锁式学习 0

/user/hive/warehouse   每创建一个hive的数据库,就会在此路径创建一个对应的文件夹

 

external 定义表为外部表

location 指定表里面的数据应该存放在HDFS的哪个位置

partitioned by 创建分区表,按照文件夹,将不同的数据划分到不同的文件夹下面

clustered by 分桶表,将数据按照一定的规则划分到多个文件中去

store as 指定数据的存储格式 text sequenceFile parquen orc

row format 指定hive建表的分隔符,与HDFS的数据的分隔符保持一致才能够映射HDFS上面的数据到对应的hive表的字段里面来

 

hive当中四种常见的表模型:

第一种:管理表,又叫内部表,删除表的时候,HDFS上面对应的数据同步删除

创建表指定字段之间的分隔符,指定数据的存储格式,指定数据的存放给位置

CREATE TABLE IF NOT EXISTS stu2(id INT,name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED by '\t'
STORED AS textfile
LOCATION /user/stu2;

根据查询结果创建表,复制表结构和表中的数据

CREATE TABLE stu3 AS SELECT * FROM stu2;

只复制表结构,不复制表数据

CREATE TABLE stu4 LIKE stu2;

查询表的类型

DESC FORMATTED stu2;

 

hive当中的默认分隔符:\001(键盘打不出来,因为是asc码值,非打印字符,这么做是为了避免分隔符的冲突)

[展开全文]
CodeRookie · 2020-02-28 · 解锁式学习 0

创建包 cn.itcast.udf

创建类 ItcastUDF 继承 UDF

/**定义一个方法,方法名定死了就叫evaluate,将小写字母转为大写字母

public Text evaluate(Text inputData)
  if(null != inputData && !inputData.toString().equals("")){
  String s = inputData.toString().toUpperCase();
  return new Text(s);
} else {
  return new Text("");
}

hive自定义函数步骤

第一步:常见工程,导入jar包

第二步:写一个java类,导入jar包

第三步:定义一个方法,方法名必须是evaluate,必须有返回值,还得有一个参数表示输入的数据

第四步:定义udf逻辑

第五步:打成jar包放到hive的lib目录下

第六步:hive客户端 添加jar包

第七步:设置临时函数与自定义的udf进行关联

第八步:使用udf

 

第一步:定义一个表jsonOrigin,表里就一个字段,jsonStr,把数据导入进去

第二步:定义一个udf函数,接收json的数据,解析成一行数据、四个字段,用\t分割,输出到本地

第三步,建立一个表,里面四个字段,用\t分割,加载本地数据即可

[展开全文]
CodeRookie · 2020-02-27 · 解锁式学习 0

distrebuted by就是制定k2是哪个字段,然后用这个字段进行hashPartitioned

clustered by具有distributed by的功能,还能做reduce内部排序

如果distributed by的字段和sort by的字段相同,就可以用clustered by代替

 

hive的group by语法

 

[展开全文]
CodeRookie · 2020-02-27 · 解锁式学习 0

第三种表模型:分区表,不是独立的,只有内部分区表或者外部分区表

核心思想是分治,数据量越少,跑起来越快

可以按照一定的规则,创建一些文件夹,可以根据指定的文件夹,找到我们指定的数据

创建分区

CREATE TABLE score(
s_id STRING,
c_id STRING,
s_score INT)
PARTITIONED BY (month STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

创建一个表带多个分区

CREATE TABLE score2(
s_id STRING,
c_id STRING,
s_score INT)
PARTITIONED BY (year STRING,month STRING,day STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

加载数据到分区表中

LOAD DATA LOCAL INPATH '/export/servers/hivedatas/score.csv'
INTO TABLE score
PARTITION (month='201806');

加载数据到多个分区表中

LOAD DATA LOCAL INPATH '/export/servers/hivedatas/score.csv'
INTO TABLE score2
PARTITION (year='2018',month='06',day='08');

多分区联合查询

 

[展开全文]
CodeRookie · 2020-02-27 · 解锁式学习 0

hive的三种交互方式:

第一种方式:使用hive的bin/hive   可以进入hive的客户端,执行sql语句

第二种方式:Hive JDBC服务  启动服务端,使用beeline进行交互

前台启动进程 bin/hive --service hiveserver2

把进程挂在后台 nohup bin/hive --service hiveserver2 2>&1 &

使用beeline进行交互

bin/beeline

!connect jdbc:hive2://node02:10000

第三种方式:Hive命令

[展开全文]
CodeRookie · 2020-02-26 · 解锁式学习 0

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

*.*  第一个表示数据库名称  第二个星表示数据库下面的哪个表

'root'@'%'  root:表示mysql的用户  %表示ip地址,可以从哪台机器使用那个用户来连接数据库

all privileges:所有的权限,这里还可以写 insert update delete select

identified by:远程连接的时候的密码,与mysql的root用户密码无关

实际线上环境,关于mysql的控制比较严格,不同的人分配不同的用户,创建不同的数据库,分配不同的权限

 

flush pricileges; 刷新权限表

[展开全文]
CodeRookie · 2020-02-26 · 解锁式学习 0

hive的基本概念

一个数据仓库的处理工具,专门用于数据仓库的数据分析

是基于hadoop的一个数据仓库的工具,将结构化的数据映射称为一张表,并且提供类似sql的查询功能

本质是将sql语句转换成mapreduce的任务进行执行

结构化数据:体现为数据字段固定,数据类型固定(数据库的表就是一种最典型的结构化数据)

半结构化数据:XML,JSON,数据类型一定,但是数据的字段个数不定

非结构化数据:完全没有任何规律,字段类型不定、字段个数不定、数据类型不定,比如说音频、视频

hive当中的元数据信息主要描述了hive表和hdfs数据之间的映射关系,包括字段的映射(hive当中的哪个字段与数据当中的哪一列进行对应),数据位置的保存,建表的语句定义等的

数据存储用HDFS 计算用MapReduce

hive和hdfs上面数据的映射关系被称为元数据信息,一般都保存在mysql或者oracle中等

为什么用hive

操作接口采用类sql语法,提供快速开发能力

减免写MapReduce,减少开发人员的学习成本,功能扩展很方便

 

hive的架构

用户接口:提供写sql的地方

解析器:解析sql语句,转换成mr的任务提交,准备执行  重中之重

元数据:记录我们hive的表与我们数据之间的映射关系

执行器:mr执行

 

hive和hadoop的关系:hive就是一个mr的客户端

 

千万别把hive当成数据库来用!!

 

mapreduce为什么慢:反复地将数据从磁盘到内存,从内存到磁盘,从磁盘到内存,从内存到磁盘

[展开全文]
CodeRookie · 2020-02-26 · 解锁式学习 0

数据仓库架构可分为三层:源数据、数据仓库、数据应用

源数据层:ODS 产生数据的地方

数据仓库层:DW 也称细节层,主要集中存储数据,面向主题进行分析

数据应用层 APP层 主要用于展示分析之后的数据结果

数据在这三层之间的流动层为一个ETL的过程

ETL: extract transform load

数据从源数据层流向数据仓库层流向数据应用层

 

为什么要对数据仓库进行分层:每一层职责清晰

 

数据仓库的元数据管理:定义数据架构,数据的位置,数据的信息

这里的元数据,记录的是数据仓库中数据如何进行一整套流程的

[展开全文]
CodeRookie · 2020-02-26 · 解锁式学习 0

数据仓库:Data Warehouse,简称DW

目的:构建面向分析的集成化数据环境

主要职责是对仓库里面的数据来做分析

数据分析可以支持我们做决策

主要特征:

面向主题(Subject-Oriented):数据分析有一定的范围,需要选取一定的主题进行分析

集成性(Integrated):集成各个其他方面关联的数据,比如分析订单购买人的情况,就涉及到用户信息

非易失性(Non-Volatile):数据分析主要是分析过去已经发生的数据,都是既成的事实,不会再改变

时变性(Time-varient):随着时间的推移发展,数据的形态也在发生变化,数据分析的手段也要相应的改变

 

数据仓库和数据库的区别

数据库:OLTP(联机事务处理)主要功能就是用来做事务处理,主要负责频繁地增删改查

数据仓库:OLAP(联机分析处理)不需要做事务的保证,主要职责就是做数据的分析

数据库的数据允许增删改,数据仓库的数据一般不允许增删改

数据仓库的产生是因为有大量的数据库的存在,需要对数据进一步的决策分析,然后才产生数据仓库的概念

[展开全文]
CodeRookie · 2020-02-26 · 解锁式学习 0

第三种方式:hive命令行

bin/hive -e: 不进入hive的客户端,直接运行sql语句

bin/hive -f: 不进入hive客户端,通过指定脚本文本文件运行sql语句

[展开全文]
CodeRookie · 2020-02-26 · 解锁式学习 0

yarn当中的调度器:

调度器主要解决的是任务先后提交,如何保证任务最快执行的一种策略,研究的是任务之间如何一起执行的问题

队列和栈

队列是两端都开口,和火车头进隧道一样

栈,一端开口,一端封闭,先进去的最后出来,和弹夹子弹一样

Hadoop当中的调度器主要有三种

第一种:fifo 队列调度器  first in first out (没人用)------第一个任务来了,先执行,第二个任务来了,等着------如果有一个很大的计算任务先来,需要执行两个小时,再来一个小任务,需要两分钟,第二个任务必须要等第一个完成,这是弊端

第二种:capacity scheduler 容量调度器 apache的hadoop版本默认使用的调度器-----容量调度器:将集群的资源,划分成好几个队列,任务提交的时候,可以选择不同的队列进行提交。好处就是根据提交任务需要资源的大小不同,可以将任务划分到不同给的队列下面去

第三种:fairScheduler 公平调度器 CDH版本的hadoop默认的调度规则-----如果没有任务提交,收到第一个任务,将进群当中所有的资源全部给第一个任务,如果此时收到第二个任务,就会将第一个任务的资源划分一点出来给第二个任务,让第二个任务也可以执行,以此类推,保证每一个任务都可以公平地一起执行

一般调度器不改

 

[展开全文]
CodeRookie · 2020-02-25 · 解锁式学习 0

yarn是Hadoop 2.x 引入的新的模块,主要用于管理集群当中的资源(内存、CPU等)

yarn不光管理硬件资源,还管理运行的一些任务信息等等

yarn调度可以分为两个层级

一级管理调度:管理计算机的资源、运行job任务的生命周期

二级管理调度:任务的计算模型(maptask,reducetask的代码)、多样化的计算模型(spark,storm)

 

yarn集群当中各个组件的作用:

resourceManager:主节点,主要用于接受用户请求,分配资源

nodeManager:从节点,主要用于处理任务的计算

ApplicationMaster:每提交一个任务,启动一个appmaster,它全权负责管理我们任务的执行。主要职责:申请资源,分配资源(分配Container),监控任务执行的进度状况,回收资源,和resourceManager通信,报告任务的执行状况“自杀”

Container:资源分配的单位,所有的资源都是以caontainer的形式来进行划分的,便于资源的分配和回收

jobHistoryServer:历史完成的任务信息

TimeLineServer:2.4版本之后出来的新特性,查看正在执行任务的信息

[展开全文]
CodeRookie · 2020-02-25 · 解锁式学习 0

一个任务为什么长时间没有完成,有可能发生了数据倾斜

数据倾斜就是,大量的数据都涌到同一个reduceTask里面去,造成一个reduceTask里面处理得数据量太大,迟迟不能完成

比如reduceTakss完成80%就不动了,很有可能就是发生了数据倾斜

推测执行并不能解决数据倾斜的问题,反而会更加浪费内存资源,所以一般关掉

[展开全文]
CodeRookie · 2020-02-25 · 解锁式学习 0

orderBean类中compareTo方法重写要有一个If判断条件,看orderId是否相同

 

之前是求top1

现在求topN

原先的代码基础上修改一下v2,v3的类型为DoubleWritable

在Mapper类中,将价格转换输出

在Reducer类中,需要进行一个循环遍历,在加一个if判断语句,定义i<N时输出k3,v3,否则不输出,求TOP几,N为几

在Partition的输出类型改成DoubleWritable

 

分区:决定数据去往哪一个reduce

分组:决定那些数据分到一个组里去,一起调用一次reduce逻辑

 

 

[展开全文]
CodeRookie · 2020-02-25 · 解锁式学习 0

new package  cn.itcast.demo5

创建类 GroupMain GroupMapper GroupReducer GroupPartitioner GroupComparator OrderBean

 

在OrderBean类中,首先实现WritableComparable,<>中放OrderBean自身

定义private String orderId和private double price

重写CompareTo方法,int i = this.price.compareTo(o.price); 返回i 代表降序排序

重写write方法,out.writeUTF(orderId);out.writeDouble(price)

重写readFields方法,this.orderId = in.readUTF;this.price = in.readDouble;

生成get(),set()方法和toString()方法

 

在GroupMapper类中,重写map方法,分割数据(/t),split[0]是orderId,split[2]是price,输出k2,v2

 

在GroupPartion类中继承Partitioner,重写getPartition,在HashPartition中找到重写的方法,return();

 

在GroupCompatator类中继承WritableComparator,重写compare方法

通过GroupComparator方法,做一个构造器,super(OrderBean.class,true);//重写默认的无参构造器,然后定义反射出来的对象是OrderBean这个类

在compare方法中把object强转成OrderBean,OrderBean first = (OrderBean) a;OrderBean second = (OrderBean) b;返回first.getOrderId().compareTo(second.getOrderId());以此来比较订单id,如果是相同的id,就认为是同一组数据

 

GroupReducer类不需要做什么,直接重写reduce方法,接收k2,v2,输出k3,v3即可

 

GroupMain方法老规矩

[展开全文]
CodeRookie · 2020-02-25 · 解锁式学习 0

重写nextKeyValue方法,返回值是boolean,true为文件读取完成,不需要继续读取,false为继续向下读取----根据切片,将文件内容全部读取出来,封装到BytesWrita

定义字节数组fileContent,new byte[(int)fileSplit.getnLength()];

先用fileSplit.getpath()获取到文件系统,然后定义为path

path.getFileSystem(configuration);获取文件系统

拿到文件系统后就可以打开文件的输入流fileSystem.open(Path);

将输入流转到字节数组中,IOUtils.readFully(inputStream,fileContent,0,(int)fileSplit.getLength())

bytesWritable.set(fileContent,0,fileContent.length)

将读取文件的标识置为true

返回

[展开全文]
CodeRookie · 2020-02-24 · 解锁式学习 0

sequenceFile的文件存储格式,是专门用于存储二进制的文件,也就是用来保存字节数组的

自定义一个InputFormat,将小文件内容一次性全部读取出来,封装到一个BytesWritable里面去

 

创建cn.itcast.demo3包

在包下创建MyInputFormat类

继承FileInputformat  k1,v1类型为NullWritable,BytesWritable

重写RecordReader和isSplitable方法

 

新建MyRecordReader,继承RecordReader,k1,v1和上面一样

这是在创建MyRecordReader对象

定义FileSplit、Configuration、BytesWritable还有nextKeyValue方法的返回值为false

重写初始化方法(initialize)(这里可以拿到文件的切片,也就意味着可以拿到文件,将文件转换成字节数组)----给fileSplit强转赋值,给configuration赋值为main方法中的configuration

重写nextKeyValue方法,返回值是boolean,true为文件读取完成,不需要继续读取,false为继续向下读取----根据切片,将文件内容全部读取出来,封装到BytesWrita

重写getCurrentKey方法,就是用来返回k1的值,就是return.NullWritable.get()

重写getCurrentValue方法,用来返回v1的值,需要将文件内容读取出来,封装到BytesWritable进行返回

getProgress方法不需要注意,是用来读取进度的方法

close方法是读取完成后释放资源的,没啥用

[展开全文]
CodeRookie · 2020-02-24 · 解锁式学习 0