29.hive/impala/hdfs/kudu的區(qū)別
hive和impala則更偏向于查詢分析,需要基于hdfs或kudu
Impala即可操作hdfs上的數(shù)據(jù),又可操作kudu上的數(shù)據(jù)
Hive只可操作hdfs上的數(shù)據(jù)
30.hbase與kudu的區(qū)別
Hbase將數(shù)據(jù)持久化這部分的功能交給了Hadoop中的HDFS,最終組織的數(shù)據(jù)存儲在HDFS上。Kudu自己將存儲模塊集成在自己的結(jié)構(gòu)中(Kudu的底層儲存原理類似于hdfs)
HBase與Kudu的差異主要在于類似于行式存儲的列族式存儲方式與典型的面向列式的存儲方式的差異(因為HBase表設(shè)計時,很少使用設(shè)計多個列族,大多情況下是一個列族)
Kudu在Hadoop生態(tài)系統(tǒng)中所處的角色如下圖:
從這個圖可以看到,kudu期望自己既能夠滿足分析的需求(快速的數(shù)據(jù)scan),也能夠滿足查詢的需求(快速的隨機訪問),那Kudu到底采用了什么技術(shù)來達到這個目的的呢?
HBase被用來當作數(shù)據(jù)載入和更新的存儲,這個存儲適合于實時的查詢,而數(shù)據(jù)隨后被處理為parquet格式的文件,從而適合后續(xù)的利用Impala等工具進行分析
31.Kudu底層儲存原理總結(jié):
kudu的物理模型是master和tserver,其中table根據(jù)hash和range分區(qū),分為多個tablet存儲到tserver中,tablet分為leader和follower,leader負責(zé)寫請求,follower負責(zé)讀請求,總結(jié)來說,一個ts可以服務(wù)多個tablet,一個tablet可以被多個ts服務(wù)(基于tablet的分區(qū),最低為2個分區(qū)),如下圖:
32.kudu使用方法
(1)可通過Java client操作kudu表,但要構(gòu)建client并編寫應(yīng)用程序;
(2)可通過kudu-spark包集成kudu與spark,并編寫spark應(yīng)用程序來操作kudu表;
(3)可通過impala的shell對kudu表進行交互式的操作
33.Impala為什么需要hive支持:
需要使用hive的metastore服務(wù)來存儲impala的元數(shù)據(jù)
34. Metadata、Metastore的含義/作用
metadata即元數(shù)據(jù)。
Metastore的作用是:客戶端連接metastore服務(wù),metastore再去連接MySQL數(shù)據(jù)庫來存取元數(shù)據(jù)。有了metastore服務(wù),就可以有多個客戶端同時連接,而且這些客戶端不需要知道MySQL數(shù)據(jù)庫的用戶名和密碼,只需要連接metastore 服務(wù)即可。
39.什么是列式存儲
列式存儲(Column-based)是相對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫的行式存儲(Row-based)來說的。簡單來說兩者的區(qū)別就是如何組織表。
將表放入存儲系統(tǒng)中有兩種方法,而我們絕大部分是采用行存儲的。行存儲法是將各行放入連續(xù)的物理位置,這很像傳統(tǒng)的記錄和文件系統(tǒng)。列存儲法是將數(shù)據(jù)按照列存儲到數(shù)據(jù)庫中,與行存儲類似,下圖是兩種存儲方法的圖形化解釋。
40.列式存儲為什么能大量降低系統(tǒng)io
41.給文件增加權(quán)限:
其語法格式為:chmod [who] [opt] [mode] 文件/目錄名
who表示對象,是以下字母中的一個或組合:
u:表示文件所有者
g:表示同組用戶
o:表示其它用戶
a:表示所有用戶
opt則是代表操作,可以為:
+:添加某個權(quán)限
-:取消某個權(quán)限
=:賦予給定的權(quán)限,并取消原有的權(quán)限
mode則代表權(quán)限:
r:可讀
w:可寫
x:可執(zhí)行
例如:為同組用戶增加對文件a.txt的讀寫權(quán)限:
chmod g+rw a.txt
或者使用數(shù)字的格式:
例如,我們想讓a.txt這個文件的權(quán)限為:
自己 同組用戶 其他用戶
可讀 是 是 是
可寫 是 是 可執(zhí)行
那么,我們先根據(jù)上表得到權(quán)限串為:rw-rw-r--,那么轉(zhuǎn)換成二進制數(shù)就是110 110 100,再每三位轉(zhuǎn)換成為一個十進制數(shù),就得到664,因此我 們執(zhí)行命令:
chmod 664 a.txt
42.如何設(shè)置物理機局域網(wǎng):
47.hive常用命令:
內(nèi)部表/外部表/分區(qū)表的創(chuàng)建
Hive/hdfs/本地文件系統(tǒng)之間的數(shù)據(jù)導(dǎo)入導(dǎo)出
1.創(chuàng)建內(nèi)部hive表,然后導(dǎo)入數(shù)據(jù)
CREATE TABLE t_hive (a int, b int, c int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
補充:通過stored as parquet可以將數(shù)據(jù)保存為parquet格式
從本地導(dǎo)入數(shù)據(jù)到hive表
LOAD DATA LOCAL INPATH '/home/cos/demo/t_hive.txt' OVERWRITE INTO TABLE t_hive ;
從Hive表導(dǎo)出數(shù)據(jù)到本地文件系統(tǒng)
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/t_hive' SELECT * FROM t_hive;
從HDFS導(dǎo)入數(shù)據(jù)到hive表
LOAD DATA INPATH '/user/admin/t_hive.txt' OVERWRITE INTO TABLE t_hive ;
從Hive表導(dǎo)出數(shù)據(jù)到HDFS
INSERT OVERWRITE DIRECTORY '/user/admin/t_hive' SELECT * FROM t_hive;
從其它hive表導(dǎo)入數(shù)據(jù)到hive表
INSERT OVERWRITE TABLE t_hive2 SELECT * FROM t_hive ;
**也可創(chuàng)建hive表的同時,從其它hive表導(dǎo)入數(shù)據(jù):
CREATE TABLE t_hive AS SELECT * FROM t_hive2
2.創(chuàng)建外部hive表
create external table ext_student(id int ,name string) row format delimited fields terminated by '\t' location '/datax';
3.創(chuàng)建分區(qū)表
CREATE TABLE t_hft(
SecurityID STRING,
tradeTime STRING,
PreClosePx DOUBLE
) PARTITIONED BY (tradeDate INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
導(dǎo)入分區(qū)數(shù)據(jù)
load data local inpath '/home/BlueBreeze/data/t_hft_1.csv' overwrite into table t_hft partition(tradeDate=20130627);
查看分區(qū)表
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.僅復(fù)制表結(jié)構(gòu)不導(dǎo)數(shù)據(jù)
CREATE TABLE t_hive3 LIKE t_hive;
8.刪表
drop table if exists t_hft;
48.通過sqoop把表導(dǎo)出成parquet文件
sqoop支持--as-parquetfile
49.hbase和hive和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的比較:
HBase可以認為是HDFS的一個包裝。它的本質(zhì)是數(shù)據(jù)存儲,是個Nosql數(shù)據(jù)庫;,Hbase能夠在它的數(shù)據(jù)庫上實時運行,而不是運行MapReduce任務(wù)
Hbase比起傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,可以存儲半結(jié)構(gòu)化非結(jié)構(gòu)化的數(shù)據(jù),可以存儲和處理更大級別的數(shù)據(jù),提供高效的查詢,對于稀疏數(shù)據(jù)的處理更好
hbase比起hive,hive只是在mapreduce上包了一層殼,本質(zhì)上還是離線數(shù)據(jù)的處理的工具,實時查詢性能有限,Hive目前不支持更新操作,本質(zhì)上是一個基于hadoop的數(shù)據(jù)倉庫工具,不能支持行級別的新增修改和刪除。hbase可以提供實時的數(shù)據(jù)的處理能力,適用于在線數(shù)據(jù)查詢處理,本質(zhì)上是一種數(shù)據(jù)庫工具。
應(yīng)用場景
Hive適合用來對一段時間內(nèi)的數(shù)據(jù)進行分析查詢,例如,用來計算趨勢或者網(wǎng)站的日志。Hive不應(yīng)該用來進行實時的查詢。因為它需要很長時間才可以返回結(jié)果。
Hbase非常適合用來進行大數(shù)據(jù)的實時查詢。
50.如何在mysql中插入數(shù)據(jù)時自動獲取系統(tǒng)時間
建表時設(shè)置一個timestamp類型的字段,插入時用now()函數(shù)獲取系統(tǒng)時間
51.目前技術(shù)路線1:
1.首先通過sqoop將mysql中的數(shù)據(jù)導(dǎo)入到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元數(shù)據(jù):
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將數(shù)據(jù)導(dǎo)入kudu表
INSERT into? film_info_kudu007 SELECT * FROM sqoop_parquet007
注:不同mysql中的數(shù)據(jù)分表存放,最后建立視圖關(guān)聯(lián)使用
5.當數(shù)據(jù)發(fā)生增加時,通過以下語句將last-value時間之后的增量數(shù)據(jù)導(dǎo)入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中的增量數(shù)據(jù)通過sqoop導(dǎo)入到hive表中時,需要數(shù)據(jù)中必須有標識表記錄插入時間的字段(再次導(dǎo)入時,可導(dǎo)入上次時間后的增量數(shù)據(jù))
補:mysql中的歷史數(shù)據(jù)進行更新時,需要監(jiān)控mysql數(shù)據(jù)庫,當數(shù)據(jù)被修改時,會產(chǎn)生一條日志,記錄被修改的數(shù)據(jù),最后將數(shù)據(jù)的更改定期刷新
6.然后同步impala和hive元數(shù)據(jù):
INVALIDATE METADATA
7.最后用impala將增量數(shù)據(jù)導(dǎo)入kudu表
INSERT into? film_info_kudu SELECT * FROM sqoop_parquet2 where time>...
注:采用此種方法是否需要在mysql所在服務(wù)器與sqoop所在服務(wù)器開啟ntp服務(wù),保證時間一致
52.目前技術(shù)路線2:
1.利用sqoop將mysql中的數(shù)據(jù)導(dǎo)入hbase
2.impala操作hbase,需要先用hive建一個hive表關(guān)聯(lián)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");
補:在創(chuàng)建hive/hbase相關(guān)聯(lián)的表時,hbase表結(jié)構(gòu)默認會有一個字段key(即hbase的行鍵),此處使用userid字段來映射這個行鍵
補:需要先有HBase再有Hive,在無HBase表的情況下,并不能創(chuàng)建Hive對應(yīng)表
3.然后再同步impala和hive元數(shù)據(jù)
INVALIDATE METADATA
補:因為Impala使用Hive的Metastore來存儲元數(shù)據(jù)信息
4.之后就可以在impala中操作hbase了
操作hive表即可
補:為什么用impala而非hive或hbase的api操作hbase
執(zhí)行復(fù)雜SQL查詢語句時,impala明顯比hive或hbase的api快很多
Impala采用sql語言,比hbase更方便操作
補:利用hive與impala分別操作hbase/hdfs上的數(shù)據(jù)的區(qū)別:
hive必定會經(jīng)過MR,impala查詢時不會(修改時也會)
74.數(shù)據(jù)庫(DB)/數(shù)據(jù)倉庫(DW)/數(shù)據(jù)整合層(ODS)的區(qū)別與聯(lián)系
DB:側(cè)重于對業(yè)務(wù)數(shù)據(jù)的讀寫
DW:側(cè)重于對數(shù)據(jù)的分析
ODS:是一個可選部分,是DB與DW之間的數(shù)據(jù)整合層,DW是反映歷史變化,ODS是反映當前變化。ODS需要的大部分運營數(shù)據(jù)直接來源生產(chǎn)系統(tǒng)。 ODS中的部分分析結(jié)果數(shù)據(jù)來源于EDW,例如客戶 洞察信息等。而DW需要的運營數(shù)據(jù),如果在ODS中已存在,EDW則直接從ODS獲取這部分數(shù)據(jù),如果在ODS中沒有,EDW則直接從生產(chǎn)系統(tǒng)獲取這部分數(shù)據(jù)。
75.數(shù)據(jù)倉庫與數(shù)據(jù)集市
數(shù)據(jù)倉庫和數(shù)據(jù)集市的區(qū)別:
(1) 數(shù)據(jù)倉庫向各個數(shù)據(jù)集市提供數(shù)據(jù)
(2) 幾個部門的數(shù)據(jù)集市組成一個數(shù)據(jù)倉庫
76.數(shù)據(jù)倉庫、主題域、主題的概念
主題是數(shù)據(jù)倉庫中的一個概念
每一個主題對應(yīng)一個宏觀的分析領(lǐng)域。在邏輯意義上,它是對應(yīng)企業(yè)中某一宏觀分析領(lǐng)域所涉及的分析對象。
主題域通常是聯(lián)系較為緊密的數(shù)據(jù)主題的集合??梢愿鶕?jù)業(yè)務(wù)的關(guān)注點,將這些數(shù)據(jù)主題劃分到不同的主題域。
即:數(shù)據(jù)倉庫 包括 主題域 包括 主題
77.表中數(shù)據(jù)為null可能的原因:
很可能是因為文件的字段分隔符與表的字段分隔符不統(tǒng)一
78.LOAD DATA INPATH命令會清除原數(shù)據(jù)嗎
會
79.year(now()) 與 year(date())的區(qū)別
year(now())是當前系統(tǒng)時間的年份
year("2011-3-22")就是返回2011年3月22日這個日期的年份2011
134.Hive中order by,sort by,distribute by,cluster by的區(qū)別
1.order by
全局排序
2.sort by和distribute by組合使用(效果與order by一樣,但是使用場景不同)
當有多個reduce時(可以通過set mapred.reduce.tasks=n來指定reduce的個數(shù)),sort by僅保證在每個reduce內(nèi)排序(部分有序),distribute by的作用是控制哪些行放入哪些reduce處理的,因此distribute by經(jīng)常和sort by配合使用:SELECT * FROM year distribute by year sort by year asc,temp desc
3.CLUSTER BY
關(guān)鍵字是DISTRIBUTE BY和SORT BY的簡寫,這兩者可以認為對應(yīng)與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 一般和聚合函數(shù)一起使用才有意義,比如 count sum avg等,使用group by的兩個要素:
? ?(1) 出現(xiàn)在select后面的字段 要么是是聚合函數(shù)中的,要么就是group by 中的.
? ?(2) 要篩選結(jié)果 可以先使用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,然后又對已經(jīng)存在的兩個分組用條件二 c列的值進行分組,發(fā)現(xiàn)第一組又可以分為兩組 1-4,5
2.docker管理工具
K8s
可以對容器進行創(chuàng)建管理等
3.sql的left join 、right join 、inner join間的區(qū)別
left join(左聯(lián)接) 返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄
right join(右聯(lián)接) 返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄
inner join(等值連接) 只返回兩個表中聯(lián)結(jié)字段相等的行
*注意:不管是什么連接方式,都包含兩表的所有字段,不同的是其中的記錄
4.數(shù)據(jù)分析中對“維度”和“指標”的理解
數(shù)據(jù)分析其實是個很難的活,你需要考慮從哪些方面去分析,然后每個方面分析哪些數(shù)據(jù)才能得到一些結(jié)論。我理解哪些方面就是維度,每個方面下的具體數(shù)據(jù)就是指標,用于描述這些維度
5.寫業(yè)務(wù)sql注意點
1.理解表含義及其中的字段含義,區(qū)分哪些字段是維度,哪些字段是指標
2.Python用來調(diào)用.hql文件
3.一般小需求不會有需求文檔,結(jié)果表結(jié)構(gòu)就是需求文檔
4.臟數(shù)據(jù)的處理
5.維表是指儲存某一個維度詳細信息的表(比如:你現(xiàn)在有計劃id,想知道計劃名,那么就通過計劃id關(guān)聯(lián)一下計劃維表就可以了)
6.數(shù)據(jù)分析常用步驟
一、確定三個大維度
? ? ? 任何數(shù)據(jù)分析問題我都先拆解成三個維度:物,人,物+人;這里也就是商品,顧客,商品+顧客這三個大的維度。
二、大維度拆解成小維度
三、小維度下的指標
四、添刪改查
? ?根據(jù)實際需求,投入產(chǎn)出比,優(yōu)先級,對上述的維度進行篩選和修改;
7.hive中substr的用法
substr(from_unixtime(cast(show_time as bigint)),12,2)
12.-從第幾個開始截取
2.-一共截取幾個
8.regexp_extract函數(shù)
regexp_extract(str, regexp[, idx])
其中:
str是被解析的字符串或字段名
regexp 是正則表達式
idx是返回結(jié)果 取表達式的哪一部分? 默認值為1。
0表示把整個正則表達式對應(yīng)的結(jié)果全部返回
1表示返回正則表達式中第一個() 對應(yīng)的結(jié)果 以此類推?
9.列出hive常用的函數(shù)(寫hql時參考)
1.Substr
截取
2.from_unixtime
3.Cast
數(shù)據(jù)類型轉(zhuǎn)換: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 它是用來分隔符字符串連接函數(shù)
15.collect_set 它是用來將一列多行轉(zhuǎn)換成一行多列,并去重用戶
16.concat
17.trunc
18.
10.distinct詳解
1.select distinct name from t1 能消除重復(fù)記錄,但只能取一個字段,現(xiàn)在要同時取id,name這2個字段的值。
2.select distinct id,name from t1 可以取多個字段,但只能消除這2個字段值全部相同的記錄
3.所以用distinct達不到想要的效果,用group by? ?可以解決這個問題。?
4.?單獨的distinct只能放在開頭,否則報錯,語法錯誤;但與其他函數(shù)使用時候,沒有位置限制如下