2021-02-08a

29.hive/impala/hdfs/kudu的区别

hive和impala则更偏向于查询分析,需要基于hdfs或kudu

Impala即可操作hdfs上的数据,又可操作kudu上的数据

Hive只可操作hdfs上的数据

30.hbase与kudu的区别

Hbase将数据持久化这部分的功能交给了Hadoop中的HDFS,最终组织的数据存储在HDFS上。Kudu自己将存储模块集成在自己的结构中(Kudu的底层储存原理类似于hdfs)

HBase与Kudu的差异主要在于类似于行式存储的列族式存储方式与典型的面向列式的存储方式的差异(因为HBase表设计时,很少使用设计多个列族,大多情况下是一个列族)

Kudu在Hadoop生态系统中所处的角色如下图:

从这个图可以看到,kudu期望自己既能够满足分析的需求(快速的数据scan),也能够满足查询的需求(快速的随机访问),那Kudu到底采用了什么技术来达到这个目的的呢?

HBase被用来当作数据载入和更新的存储,这个存储适合于实时的查询,而数据随后被处理为parquet格式的文件,从而适合后续的利用Impala等工具进行分析

31.Kudu底层储存原理总结:

kudu的物理模型是master和tserver,其中table根据hash和range分区,分为多个tablet存储到tserver中,tablet分为leader和follower,leader负责写请求,follower负责读请求,总结来说,一个ts可以服务多个tablet,一个tablet可以被多个ts服务(基于tablet的分区,最低为2个分区),如下图:

32.kudu使用方法

(1)可通过Java client操作kudu表,但要构建client并编写应用程序;

(2)可通过kudu-spark包集成kudu与spark,并编写spark应用程序来操作kudu表;

(3)可通过impala的shell对kudu表进行交互式的操作

33.Impala为什么需要hive支持:

需要使用hive的metastore服务来存储impala的元数据

34. Metadata、Metastore的含义/作用

metadata即元数据。

Metastore的作用是:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。


39.什么是列式存储

列式存储(Column-based)是相对于传统关系型数据库的行式存储(Row-based)来说的。简单来说两者的区别就是如何组织表。


将表放入存储系统中有两种方法,而我们绝大部分是采用行存储的。行存储法是将各行放入连续的物理位置,这很像传统的记录和文件系统。列存储法是将数据按照列存储到数据库中,与行存储类似,下图是两种存储方法的图形化解释。

40.列式存储为什么能大量降低系统io

41.给文件增加权限:

其语法格式为:chmod [who] [opt] [mode] 文件/目录名

who表示对象,是以下字母中的一个或组合:

u:表示文件所有者

g:表示同组用户

o:表示其它用户

a:表示所有用户

opt则是代表操作,可以为:

+:添加某个权限

-:取消某个权限

=:赋予给定的权限,并取消原有的权限

mode则代表权限:

r:可读

w:可写

x:可执行

例如:为同组用户增加对文件a.txt的读写权限:

chmod g+rw a.txt

或者使用数字的格式:

例如,我们想让a.txt这个文件的权限为:

自己 同组用户 其他用户

可读 是 是 是

可写 是 是 可执行

那么,我们先根据上表得到权限串为:rw-rw-r--,那么转换成二进制数就是110 110 100,再每三位转换成为一个十进制数,就得到664,因此我 们执行命令:

chmod 664 a.txt

42.如何设置物理机局域网:

47.hive常用命令:

内部表/外部表/分区表的创建

Hive/hdfs/本地文件系统之间的数据导入导出

1.创建内部hive表,然后导入数据

CREATE TABLE t_hive (a int, b int, c int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

补充:通过stored as parquet可以将数据保存为parquet格式

从本地导入数据到hive表

LOAD DATA LOCAL INPATH '/home/cos/demo/t_hive.txt' OVERWRITE INTO TABLE t_hive ;

从Hive表导出数据到本地文件系统

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/t_hive' SELECT * FROM t_hive;

从HDFS导入数据到hive表

LOAD DATA INPATH '/user/admin/t_hive.txt' OVERWRITE INTO TABLE t_hive ;

从Hive表导出数据到HDFS

INSERT OVERWRITE DIRECTORY '/user/admin/t_hive' SELECT * FROM t_hive;

从其它hive表导入数据到hive表

INSERT OVERWRITE TABLE t_hive2 SELECT * FROM t_hive ;

**也可创建hive表的同时,从其它hive表导入数据:

CREATE TABLE t_hive AS SELECT * FROM t_hive2

2.创建外部hive表

create external table ext_student(id int ,name string) row format delimited fields terminated by '\t' location '/datax';

3.创建分区表

CREATE TABLE t_hft(

SecurityID STRING,

tradeTime STRING,

PreClosePx DOUBLE

) PARTITIONED BY (tradeDate INT)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

导入分区数据

load data local inpath '/home/BlueBreeze/data/t_hft_1.csv' overwrite into table t_hft partition(tradeDate=20130627);

查看分区表

SHOW PARTITIONS t_hft;

4.正则匹配表名

show tables '*t*';

5.增加一个字段

ALTER TABLE t_hive ADD COLUMNS (new_col String);

6.重命令表名

ALTER TABLE t_hive RENAME TO t_hadoop;

7.仅复制表结构不导数据

CREATE TABLE t_hive3 LIKE t_hive;

8.删表

drop table if exists t_hft;

48.通过sqoop把表导出成parquet文件

sqoop支持--as-parquetfile

49.hbase和hive和传统的关系型数据库的比较:

HBase可以认为是HDFS的一个包装。它的本质是数据存储,是个Nosql数据库;,Hbase能够在它的数据库上实时运行,而不是运行MapReduce任务

Hbase比起传统的关系型数据库,可以存储半结构化非结构化的数据,可以存储和处理更大级别的数据,提供高效的查询,对于稀疏数据的处理更好

hbase比起hive,hive只是在mapreduce上包了一层壳,本质上还是离线数据的处理的工具,实时查询性能有限,Hive目前不支持更新操作,本质上是一个基于hadoop的数据仓库工具,不能支持行级别的新增修改和删除。hbase可以提供实时的数据的处理能力,适用于在线数据查询处理,本质上是一种数据库工具。

应用场景

Hive适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。

Hbase非常适合用来进行大数据的实时查询。

50.如何在mysql中插入数据时自动获取系统时间

建表时设置一个timestamp类型的字段,插入时用now()函数获取系统时间

51.目前技术路线1:

1.首先通过sqoop将mysql中的数据导入到hive中,并以parquet格式保存

sqoop import --connect jdbc:mysql://192.168.1.100:3306/biz --username biz --password hadoop --table film_info --fields-terminated-by '|'  --delete-target-dir --num-mappers 1 --hive-import  --hive-database test --hive-table sqoop_parquet007 --as-parquetfile

2.然后同步impala和hive元数据:

INVALIDATE METADATA

3.然后用impala建立kudu表

create table if not exists film_info_kudu007(

filmid int,

title string,

pdate string,

url string,

time bigint,

primary key(filmid)

)

partition by hash(filmid) partitions 4 stored as kudu

4.最后用impala将数据导入kudu表

INSERT into  film_info_kudu007 SELECT * FROM sqoop_parquet007

注:不同mysql中的数据分表存放,最后建立视图关联使用

5.当数据发生增加时,通过以下语句将last-value时间之后的增量数据导入hive表:

sqoop  import --connect 'jdbc:mysql://192.168.1.100:3306/biz' --username biz --password hadoop --table film_info --fields-terminated-by '|' -hive-database test -hive-table sqoop_parquet6 --hive-import -m -1 --incremental append --check-column time --last-value "2018-09-12 14:20:00" --as-parquetfile

补:mysql中的增量数据通过sqoop导入到hive表中时,需要数据中必须有标识表记录插入时间的字段(再次导入时,可导入上次时间后的增量数据)

补:mysql中的历史数据进行更新时,需要监控mysql数据库,当数据被修改时,会产生一条日志,记录被修改的数据,最后将数据的更改定期刷新

6.然后同步impala和hive元数据:

INVALIDATE METADATA

7.最后用impala将增量数据导入kudu表

INSERT into  film_info_kudu SELECT * FROM sqoop_parquet2 where time>...

注:采用此种方法是否需要在mysql所在服务器与sqoop所在服务器开启ntp服务,保证时间一致

52.目前技术路线2:

1.利用sqoop将mysql中的数据导入hbase

2.impala操作hbase,需要先用hive建一个hive表关联hbase

CREATE external TABLE hive_hbase_anqi4(

    userid string,

    user_type string,

    gender string,

    birthday string)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:user_type, info:gender, info:birthday")

TBLPROPERTIES("hbase.table.name" = "test_info");

补:在创建hive/hbase相关联的表时,hbase表结构默认会有一个字段key(即hbase的行键),此处使用userid字段来映射这个行键

补:需要先有HBase再有Hive,在无HBase表的情况下,并不能创建Hive对应表

3.然后再同步impala和hive元数据

INVALIDATE METADATA

补:因为Impala使用Hive的Metastore来存储元数据信息

4.之后就可以在impala中操作hbase了

操作hive表即可

补:为什么用impala而非hive或hbase的api操作hbase

执行复杂SQL查询语句时,impala明显比hive或hbase的api快很多

Impala采用sql语言,比hbase更方便操作

补:利用hive与impala分别操作hbase/hdfs上的数据的区别:

hive必定会经过MR,impala查询时不会(修改时也会)

74.数据库(DB)/数据仓库(DW)/数据整合层(ODS)的区别与联系

DB:侧重于对业务数据的读写

DW:侧重于对数据的分析

ODS:是一个可选部分,是DB与DW之间的数据整合层,DW是反映历史变化,ODS是反映当前变化。ODS需要的大部分运营数据直接来源生产系统。 ODS中的部分分析结果数据来源于EDW,例如客户 洞察信息等。而DW需要的运营数据,如果在ODS中已存在,EDW则直接从ODS获取这部分数据,如果在ODS中没有,EDW则直接从生产系统获取这部分数据。

75.数据仓库与数据集市

数据仓库和数据集市的区别:

(1) 数据仓库向各个数据集市提供数据

(2) 几个部门的数据集市组成一个数据仓库

76.数据仓库、主题域、主题的概念

主题是数据仓库中的一个概念

每一个主题对应一个宏观的分析领域。在逻辑意义上,它是对应企业中某一宏观分析领域所涉及的分析对象。

主题域通常是联系较为紧密的数据主题的集合。可以根据业务的关注点,将这些数据主题划分到不同的主题域。

即:数据仓库 包括 主题域 包括 主题

77.表中数据为null可能的原因:

很可能是因为文件的字段分隔符与表的字段分隔符不统一

78.LOAD DATA INPATH命令会清除原数据吗

79.year(now()) 与 year(date())的区别

year(now())是当前系统时间的年份

year("2011-3-22")就是返回2011年3月22日这个日期的年份2011

134.Hive中order by,sort by,distribute by,cluster by的区别

1.order by

全局排序

2.sort by和distribute by组合使用(效果与order by一样,但是使用场景不同)

当有多个reduce时(可以通过set mapred.reduce.tasks=n来指定reduce的个数),sort by仅保证在每个reduce内排序(部分有序),distribute by的作用是控制哪些行放入哪些reduce处理的,因此distribute by经常和sort by配合使用:SELECT * FROM year distribute by year sort by year asc,temp desc

3.CLUSTER BY

关键字是DISTRIBUTE BY和SORT BY的简写,这两者可以认为对应与Hadoop的partition和sort过程。如果partition和sort的key是不同的,可以使用DISTRIBUTE BY和SORT BY分别指定(如上面的例子)

注:Distribute by和sort by配合使用的场景

1.Map输出的文件大小不均。

2.Reduce输出文件大小不均。

3.小文件过多。

4.文件超大。

1.group by使用方法简述

首先group by 的简单说明:

   group by 一般和聚合函数一起使用才有意义,比如 count sum avg等,使用group by的两个要素:

   (1) 出现在select后面的字段 要么是是聚合函数中的,要么就是group by 中的.

   (2) 要筛选结果 可以先使用where 再用group by 或者先用group by 再用having

**按照 b c两个条件来分组:

select count(a),b,c from test group by b,c

可以看出 group by 两个条件的工作过程:

先对第一个条件b列的值 进行分组,分为 第一组:1-5, 第二组6-8,然后又对已经存在的两个分组用条件二 c列的值进行分组,发现第一组又可以分为两组 1-4,5

2.docker管理工具

K8s

可以对容器进行创建管理等

3.sql的left join 、right join 、inner join间的区别

  left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

  right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

  inner join(等值连接) 只返回两个表中联结字段相等的行

*注意:不管是什么连接方式,都包含两表的所有字段,不同的是其中的记录

4.数据分析中对“维度”和“指标”的理解

数据分析其实是个很难的活,你需要考虑从哪些方面去分析,然后每个方面分析哪些数据才能得到一些结论。我理解哪些方面就是维度,每个方面下的具体数据就是指标,用于描述这些维度

5.写业务sql注意点

1.理解表含义及其中的字段含义,区分哪些字段是维度,哪些字段是指标

2.Python用来调用.hql文件

3.一般小需求不会有需求文档,结果表结构就是需求文档

4.脏数据的处理

5.维表是指储存某一个维度详细信息的表(比如:你现在有计划id,想知道计划名,那么就通过计划id关联一下计划维表就可以了)

6.数据分析常用步骤

一、确定三个大维度

      任何数据分析问题我都先拆解成三个维度:物,人,物+人;这里也就是商品,顾客,商品+顾客这三个大的维度。

二、大维度拆解成小维度

三、小维度下的指标

四、添删改查

   根据实际需求,投入产出比,优先级,对上述的维度进行筛选和修改;

7.hive中substr的用法

substr(from_unixtime(cast(show_time as bigint)),12,2)

12.-从第几个开始截取

2.-一共截取几个

8.regexp_extract函数

regexp_extract(str, regexp[, idx])

其中:

str是被解析的字符串或字段名

regexp 是正则表达式

idx是返回结果 取表达式的哪一部分  默认值为1。

0表示把整个正则表达式对应的结果全部返回

1表示返回正则表达式中第一个() 对应的结果 以此类推 

9.列出hive常用的函数(写hql时参考)

1.Substr

截取

2.from_unixtime

3.Cast

数据类型转换:SELECT CAST('12.5' AS decimal(9,2))

4.Length

5.Trim

6.regexp_extract

7.regexp_replace

8.Split

9.Round

10.Count

11.Sum

12.Nvl

13.unix_timestamp

14.concat_ws 它是用来分隔符字符串连接函数

15.collect_set 它是用来将一列多行转换成一行多列,并去重用户

16.concat

17.trunc

18.

10.distinct详解

1.select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值。

2.select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录

3.所以用distinct达不到想要的效果,用group by   可以解决这个问题。 

4. 单独的distinct只能放在开头,否则报错,语法错误;但与其他函数使用时候,没有位置限制如下

你可能感兴趣的:(2021-02-08a)