天天看點

大資料文檔需求面試題執行sh腳本,建議這樣做,後期隻需維護腳本就行了,azkaban定義工作流程

索引

問題

答案

配圖

備注

A1

azkaban使用流程?

類似工具(oozie烏賊)

建立之前我們先了解下之間的關系,一個工程包含一個或多個flows,一個flow包含多個job。job是你想在azkaban中運作的一個程序,

可以是簡單的linux指令,可是java程式,也可以是複雜的shell腳本,當然,如果你安裝相關插件,也可以運作插件。一個job可以依賴

于另一個job,這種多個job和它們的依賴組成的圖表叫做flow

1.Command 類型單一 job 示例

A.首先建立一個工程(project),填寫名稱和描述,建立完成後,顯示三部分

Flows:工作流程,有多個job組成

Permissions:權限管理

Project Logs:工程日志

B.job的建立

建立job很簡單,隻要建立一個以.job結尾的文本檔案就行了

C.将 job 資源檔案打包 要求隻能是zip格式

D.通過 azkaban web 管理平台建立 project 并上傳壓縮包 ,然後定時執行

2.Command 多類型job 示例

我們說過多個jobs和它們的依賴組成flow。怎麼建立依賴,隻要指定dependencies參數就行了。比如導入hive前,需要進行資料清洗,資料清洗前需要上傳,上傳之前需要從ftp擷取日志。

定義5個job:

1、o2o_2_hive.job:将清洗完的資料入hive庫

2、o2o_clean_data.job:調用mr清洗hdfs資料

o2o_2_hive.job

type=command

執行sh腳本,建議這樣做,後期隻需維護腳本就行了,azkaban定義工作流程

command=sh /job/o2o_2_hive.sh

dependencies=o2o_clean_data

azkaban(使用azkaban遇到過哪些問題)?

1.啟動時候資源不足問題(啟動的預設3G)

解決辦法 在配置檔案中修改 memCheck.enabled=false

2.任務運作失敗問題

檢視日志

3.win系統和linux 系統 換行符号不一緻的問題

win CRLF

linux LF

4.安裝認證的問題 ssl安全認證問題 keystore問題

azkaban支不支援參數傳遞?

不支援

azkaban離線排程錯誤之後怎麼處理,怎麼檢視?

1.從azkaban的WEB UI上首先看jobList裡面的status和details

2.然後可以從Flow log 看到日志資訊

akka中actor模型?

1.并發模型的高度抽象

2.異步,非阻塞,高性能的事件驅動程式設計模型

3.輕量級事件處理(1GB記憶體可容納百萬級别個Actor)

Actor 本身封裝了狀态和行為,在進行并發程式設計時,Actor 隻需要關注消息和它本身。而消息是一個不可變對象,是以 Actor 不需要去關注鎖和記憶體原子性等一系列多線程常見的問題。

是以 Actor 是由狀态(State)、行為(Behavior)和郵箱(MailBox,可以認為是一個消息隊列)三部分組成:

狀态:Actor 中的狀态指 Actor 對象的變量資訊,狀态由 Actor 自己管理,避免了并發環境下的鎖和記憶體原子性等問題。

行為:Actor 中的計算邏輯,通過 Actor 接收到的消息來改變 Actor 的狀态。

郵箱:郵箱是 Actor 和 Actor 之間的通信橋梁,郵箱内部通過 FIFO(先入先出)消息隊列來存儲發送方 Actor 消息,接受方 Actor 從郵箱隊列中擷取消息

B1

閉包和科裡化啥意思?以及應用場景

1.scala中的閉包:變量不在函數作用域中時,還可以通路。閉包可以作為變量或者傳回值

2.柯裡化的前提是scala支援閉包,才會有柯裡化

柯裡化(Currying)指的是将原來接受兩個參數的函數變成新的接受一個參數的函數的過程。新的函數傳回一個以原有第二個參數為參數的函數

悲觀鎖和樂觀鎖?

1.悲觀鎖

執行操作前假設目前的操作肯定(或有很大幾率)會被打斷(悲觀)。基于這個假設,我們在做操作前就會把相關資源鎖定,不允許自己執行期間有其他操作幹擾。

2.樂觀鎖

執行操作前假設目前操作不會被打斷(樂觀)。基于這個假設,我們在做操作前不會鎖定資源,萬一發生了其他操作的幹擾,那麼本次操作将被放棄。Redis使用的就是樂觀鎖。

C1

CDH的版本?

5.1.4

coalesce和repartition的用法?

兩個都是RDD的分區進行重新劃分,repartition隻是coalesce接口中shuffle為true的簡易實作

1.N<M 一般情況下N個分區有資料分布不均勻的狀況,利用HashPartitioner函數将資料重新分區為M個,這時需要将shuffle設定為true。

2.如果N>M 設為false 不涉及shuffle

cache和 persist的差別?

1.cache和 persist都是用于将一個RDD進行緩存的,這樣在之後使用的過程中就不需要重新計算了,可以大大節省程式運作時間;

2. cache隻有一個預設的緩存級别 MEMORY ONLY, cache調用persist,而 persist可以根據情況設定其它的緩存級别;

3. executor執行的時候,預設60%做cache,40%做task操作, persist最根本的函數,最底層的函數

D1

大資料整體應用場景分類?

1.靜态大資料的批處理

2.移動中的資料實時處理

3.大資料的互動式浏覽

4.基于資料的預測分析和機器學習

代碼量(你開始工作到現在的scala代碼量以及Java代碼量)?

1.這個怎麼說呢 平均每天最少也的300/500行吧

惰性計算(spark/flink)的好處?

1.可以将代碼的程式變成一塊塊的操作鍊(computer chain),這樣就能夠很好的兼顧代碼的可讀性和減少耦合

A.pipeline 的思想:資料用的時候再算,而且資料是流到要計算的位置的。Result 産生的地方的就是要計算的位置,要确定 “需要計算的資料”,我們可以從後往前推,需要哪個 partition 就計算哪個 partition,如果 partition 裡面沒有資料,就繼續向前推,形成 computing chain。

B.computing chain: 根據資料依賴關系自後向前建立,遇到 ShuffleDependency 後形成 stage。在每個 stage 中,每個 RDD 中的 compute() 調用 parentRDD.iter() 來将 parent RDDs 中的 records 一個個 fetch 過來。詳見:Job 實體執行圖

2.能夠極大的減少中間計算過程提高計算效率;除非是真正需要用到的資料,才會計算;在普通的程式中,如果對每一步都進行計算,那效率将會是很低的,特别是如果最終的結果并不強依賴之前的中間結果,那麼計算資源将會被浪費

3.降低時間複雜度和空間複雜度;因為spark程式并不執行所有中間操作,降低空間(中間結果落盤)和時間的開銷(和第二點所表達的一樣)

堆排序的了解?

1.堆其實就是一種叫做完全二叉樹的資料結構 任何一個父節點總是大于等于(或者小于等于)子節點

2.排序思想:以大(數值大)為頂

利用堆頂記錄的是最大關鍵字這一特性,每一輪取堆頂元素放入有序區,就類似選擇排序每一輪選擇一個最大值放入有序區,可以把堆排序看成是選擇排序的改進

端口占(win10)用問題解決?

  1. 輸入win + R,輸入cmd回車進入dos界面
  2. 輸入netstat -ano|findstr 8080 檢視占用8080端口的程序
  3. 輸入taskkill /f /pid 程序ID

端口(Linux下)是否被監聽(占用),監聽方法?

端口和程序是互相依存的,殺掉了程序,也就釋放了端口

1.檢視

A.lsof -i:端口号

B.netstat -tunlp | grep 端口号

C.ps -ef |grep 端口 ,然後再使用ps -aux | grep 項目名或者是端口号

2.關閉

A.通過iptables工具将該端口禁掉,如:

“sudo iptables -A INPUT -p tcp --dport $PORT -j DROP”

“sudo iptables -A OUTPUT -p tcp --dport $PORT -j DROP”

B.“kill -9 PID” (PID:程序号)

定時任務沒有結果怎麼排查?

定時任務沒有結果怎麼排查?

多線程實作的方式(java和scala)

1.java

A.繼承Thread 類

B.實作Runnable 接口

C.自定義類實作Callable接口

2.scala

A.scala可以調用java中以上的方式

B.scala總有一個actor模型

Dataframe(spark)中na.fill/na.drop的用法?

對兩個資料表如A,B取JOIN操作的時候,其結果往往會出現NULL值的出現。

這種情況是非常不利于後續的分析與計算的,特别是當涉及到對這個數值列進行各種聚合函數計算的時候。
           

Spark為此提供了一個進階操作,就是:na.fill的函數

na.drop 扔掉任何列包含na的行

Dstream(Spark)常用的算子?

同樣分為兩類:Transformation和Output Operations

1.Transformation

類似rdd的transforamtion 是将一個Dstream轉換成另外一個DsTream 轉換操作也是懶加載執行

map flatMap fliter repartition union count reduce countByValue reduceByKey join

cogroup transform updateStateByKey window(對每個視窗的資料執行自定義計算) countByWindow(對每個視窗的資料執行count操作) countByVaueAndWindow (對每個視窗的資料執行countByValue操作) reduceByWindow(對每個視窗執行reduce操作) reduceBykeyAndWindow(對每一個視窗執行reduceBykey操作) groupBykeyAndWindow(對每個視窗的資料執行groupBykey操作)

2.Output Operations

print saveAsTextFile savaAsObjectFile(将每個batch的資料以序列化對象的方式,儲存到SequenceFile中) saveAsHadoopFile(将資料儲存在hadoop中) foreachRDD

Dstream中的transform算子如何使用

1.把Dstream 轉換成RDD 來操作(rdd 擁有更加豐富的算子)

E1

Equals和==的差別

== : 如果比較的是基本資料類型,那麼比較的是變量的值

如果比較的是引用資料類型,那麼比較的是位址值(兩個對象是否指向同一塊記憶體)

equals:如果沒重寫equals方法比較的是兩個對象的位址值。

如果重寫了equals方法後我們往往比較的是對象中的屬性的内容

equals方法是從Object類中繼承的,預設的實作就是使用==

二次排序問題(mr/spark)?

1.什麼是二次排序?

首先按照第一個字段排序,如何第一個字段相同我們在按第二個字段排序

二次排序(secondary sort)問題是指在Reduce階段對某個鍵關聯的值排序. 利用二次排序技術,可以對傳入Reduce的值完成 升序/降序 排序.

MapReduce架構會自動對Map生成的鍵完成排序. 是以, 在啟動Reduce之前,中間檔案 key-value 是按照key有序的(而不是按照值有序). 它們的值得順序有可能是任意的.

2.spark

repartitionAndSortWithinPartitions 二次排序規則都需要在自定義的隐式變量my_self_Ordering中實作

3.mapreduce

第一種方案是讓Reduce讀取和緩存給定key的所有的value, 然後在Reduce中對這些值完成排序.(例如: 把一個key對應的所有value放到一個Array或List中,再排序). 但是這種方式有局限性, 如果資料量較少還可以使用,如果資料量太大,一個Reduce中放不下所有的值,就會導緻記憶體溢出(OutOfMemory).

第二種方式是使用MapReduce架構來對值進行排序. 因為MapReduce架構會自動對Map生成的檔案的key進行排序, 是以我們把需要排序的value增加到這個key上,這樣讓架構對這個new_key進行排序,來實作我們的目标.

應用場景:除了按照時間key 排序之外,還可以使用value 排序

ES節點類型和讀寫流程?

1.master node(主節點) 處理建立,删除索引等請求

2.data node (資料節點)儲存分片資料

3.用戶端節點:當主節點和資料節點配置都設定為false的時候,該節點隻能處理路由請求,處理搜尋,分發索引操作等,從本質上來說該客戶節點表現為智能負載平衡器

es裡面存的什麼資料?

1.快速,經常查詢的基本資訊,詳情資訊一般存儲在hbase中 人物基本資訊,如果點選詳情的時候需要從hbase中溯源

當然如果把es完全當成資料庫來用的話,還是有一定的局限性 A.關聯這塊無法實作多多的關聯 B.沒有使用者限制和

es分頁查詢問題?

1.淺分頁 from size(這種方式效率不高)

2.深度分頁 遊标查詢(scroll)

不允許使用分頁(from&size)查詢10000條以後的資料,是以如果要查詢第10000條以後的資料,要使用ES提供的 scroll(遊标) 來查詢

scroll遊标原理:

A.初始化時将所有符合搜尋條件的搜尋結果緩存起來,可以想象成快照

B.在周遊時,從這個快照裡取資料

https://www.liangzl.com/get-article-detail-16379.html

es的版本(你們用的是什麼版本)?

5.2.2

es的優化?

億級規模的ES查詢優化實戰

能用filter就不用query

增加備援字段将部分range aggregation查詢變成terms aggregation

為常用字段增加配置,将fielddata的loading設成eager,盡量多加載到記憶體

增加叢集的緩存資源,把記憶體盡量多的用起來

去掉_all字段可節省一半空間

開啟索引壓縮可節省空間,但會有10%-20%的性能損耗

不需分詞的字元串字段設成not_analyzed

ES與Solr的差別?

1.當實時建立索引的時候,solr會産生io阻塞,而es則不會,es查詢性能要高于solr

2.在不斷動态添加資料的時候,solr的檢索效率會變的低下,而es則沒有什麼變化

3.Solr利用zookeeper進行分布式管理,而es自身帶有分布式系統管理功能。Solr一般都要部署到web伺服器上,比如tomcat。

啟動tomcat的時候需要配置tomcat與solr的關聯。【Solr 的本質 是一個動态web項目】

4.Solr支援更多的格式資料[xml,json,csv等],而es僅支援json檔案格式

5.Solr是傳統搜尋應用的有力解決方案,但是es更适用于新興的實時搜尋應用

ES是否支援join操作?

需求:select user.* ,blog.* from user inner join blog where user.uid = '查詢的對象的uid ’ 類似這樣的查詢

1.ES中提供3種關聯關系:Field collapsing(嚴格來說不是關聯),Nested object,Parent-child。前兩種都是直接将一個mapping聲明在另一個mapping中,第三種關聯是在建立子文檔是指明他的父文檔,但是一個子文檔隻能有一個父文檔,是以也不能實作多對多的關聯。其實如果了解了ES的目的是提升檢索效率,就不難了解為什麼沒有多對多關聯了,在關系資料庫裡這就是個效率瓶頸

2.使用父子查詢可以,子文檔每一篇指定父文檔的id,但是父子查詢性能比較差,并且當資料分布不均時,可能存在熱點shard,最好結合業務測試一下

F1

Flink的運作架構(原理和流程)?

1.flink的整體架構是這樣的核心是它runtime(運作時層),以jobGraph形式接受程式,

jobGraph 是一個并行化的資料流程圖(data Flow) 它擁有任意數量的task 接受和

産生data stream

2.再往上的話是兩種核心的api 一種是DataStream API 和 DataSet api,

分别對應我們的流處理和批處理,流處理上的又有CEP庫和Table 批處理上面的

是FlinkML和Gelly,table

3.最下面是我們部署方式:local模式,叢集模式(standAlone,yarn),Cloud(remote)

4.整體的程式設計過程是source–>transformation -->sink 的過程,transformation

使我們要實作的邏輯

寫好程式之後,達成jar 開始運作,流出如下

1.client向hdfs 上傳jar 包

2.向resourceMananger 提價任務 申請資源

3.resourceMananger 配置設定資源 并通知nodeManager 啟動applicationMaster

4.applicationMaster啟動後加載Flink 的jar并建構運作環境 然後啟動jobManager 和taskManager

5.jobManager 向taskManager 配置設定任務,并執行

flink 的視窗函數有幾種?支援自定義嗎?可以

1.Tumbling Window(滾動視窗)

2.Sliding Window(滑動視窗)

3.Session Window(會話視窗)

4.Global Window(全局視窗)

可以自定義,主要是一下步驟:

基本操作如下:

window:建立自定義視窗

trigger:自定義觸發器

evictor:自定義evictor

apply:自定義window function

從定義視窗的基本操作可以看出,先調用window函數,定義一個WindowAssigner對象,

在WindowAssigner中 通過 assignWindows 設定視窗類型,然後基于trigger,evictor來設定觸發器,過濾器等,

最後apply來設定使用者自定義的視窗函數,同時flink自身也內建了若幹個視窗函數,如sum,max,maxBy,reduce等

Flink和spark差別?

1.架構設計方面

flink是真正意義上的流處理,spark 是微批處理

2.處理速度

Flink處理資料是在毫秒級别,spark是秒級别

Flink作業的監控怎麼實作?

1.Metrics

首先,常用的如 Counter,寫過 mapreduce 作業的開發人員就應該很熟悉 Counter,其實含義都是一樣的,就是對一個計數器進行累加,即對于多條資料和多兆資料一直往上加的過程。

第二,Gauge(給雞 原意:測量),Gauge 是最簡單的 Metrics,它反映一個值。比如要看現在 Java heap 記憶體用了多少,就可以每次實時的暴露一個 Gauge,Gauge 目前的值就是heap使用的量。

第三,Meter,Meter 是指統計吞吐量和機關時間内發生“事件”的次數。它相當于求一種速率,即事件次數除以使用的時間。

第四,Histogram,Histogram 比較複雜,也并不常用,Histogram 用于統計一些資料的分布,比如說 Quantile、Mean、StdDev、Max、Min 等。

Flink的程式設計模型?

1.DataSet API用于批處理

2.DataStream API用于流式處理

A.獲得執行環境,

B.加載/建立初始資料,

C.指定此資料的轉換,

D.指定放置計算結果的位置,

E.觸發程式執行

Flink 的反壓機制?

1.反壓機制出現的原因:在保證資料不丢失的前提下,以最高效的方式處理資料

2.把處理端的資料積壓回報到source端,進而增大和減少資料的擷取資料的速度

具體原理如下:

1.5版本之前是采用TCP形式反壓,這種形式弊端是:TM中會有多個Task運作,是以單個Task的反壓會阻斷整個TM的socket,此外反壓傳播路徑長,導緻生效延遲比較大。

是以1.5之後進行改進,引入了credit這種反壓機制

flink的水印機制能說一下嘛?

1.水位線機制是針對于eventTime而言的,水印是Flink判斷遲到資料的标準,同時也是視窗觸發的标記

特點如下:

A.水印并不會影響原有Eventtime

B.當資料流添加水印後,會按照水印時間來觸發視窗計算

C.一般會設定水印時間,比Eventtime小幾秒鐘

D.當接收到的水印時間 >= 視窗的endTime,則觸發計算

Flink 送出jar 包的指令

A./app/flink-1.9.1/bin/flink run

-m node1:8081

/app/flink-1.9.1/examples/batch/flink-demo_1.0-SNAPSHOT_20200330120613.jar

-c com.dqu.flink.submit.task.KafkaOnHDFSAsHive

–para 10

B./bin/flink run -m yarn-cluster -yn 2 ./examples/batch/WordCount.jar --input /app/flink/flink-1.9.1standalone/README.txt --output /app/flink/flink-1.9.1standalone/

flink資料不丢失如何保證?

1.反壓機制

2.水位線機制

3.基于狀态(state)的存儲

與批計算相比,State是流計算特有的,批計算的failover機制,是失敗後重新計算;流計算在大多數場景下是增量計算,資料逐條處理,每次計算是在上一次計算結果之上進行處理的,這就要求對上一次的計算結果進行存儲,當因為機器,網絡,髒資料等原因導緻程式錯誤的時候,可以重新開機Job進行state恢複。Flink就是基于state存儲,通過CheckPoint機制來保證資料的準确性。

此外,State存儲的内容還有流計算過程中計算節點的中間結果或中繼資料屬性,比如Window方面的操作,需要累加資料;在aggregation過程中的中間聚合結果;在以Apache Kafka作為資料源時候,記錄已經讀取資料的offset等

flink 的state存儲如何實作?

1.flink内部有三種狀态的内部實作

A.(預設)基于記憶體的MemoryStateBackend- 在debug模式使用,在生産模式下不建議使用;

B.基于HDFS的FsStateBackend –基于分布式檔案系統的持久化,每次讀寫都産生網絡IO,整體性能不太好;

C.基于RocksDB的RocksDBStateBackend - 本地檔案+異步HDFS持久化,目前版本在生産環境下使用的

flume的場景問題,使用過程當中,flume拉取日志拉取一半的時候,會産生一個.tmp檔案?這個.tmp檔案裡面是什麼? 如果删除了.tmp檔案,kafka能不能接受到資料?

1…tmp檔案是重新整理之間的資料,删除之後會影響結果(待定)

Flume 拉取Nginx日志伺服器 和log4j的差別?

nginx的日志是埋點自定義的而log4j是标準輸出日志

Flume的監控?

有兩種方式:

A.Http監控

bin/flume-ng agent --conf conf --conf-file conf/flume_conf.properties --name collect -Dflume.monitoring.type=http -Dflume.monitoring.port=1234

B.ganglia 監控

這種監控方式需要先安裝ganglia然後啟動ganglia,然後再啟動flume的時候加上監控配置

bin/flume-ng agent --conf conf --conf-file conf/producer.properties --name collect -Dflume.monitoring.type=ganglia -Dflume.monitoring.hosts=ip:port

Ganglia監控Flume發現發現嘗試送出的次數大于最終成功的次數

(1)增加Flume記憶體

(2)增加Flume台數

Flume自定義攔截器(過濾)?

1.flume自帶的攔截器

Timestamp Interceptor; 時間戳攔截器

Host Interceptor; 主機名稱攔截器

Static Interceptor;

UUID Interceptor;UUID攔截器

Morphline Interceptor;

Search and Replace Interceptor;查詢替換攔截器

Regex Filtering Interceptor; 正則過濾攔截器

Regex Extractor Interceptor;正則抽取攔截器

2.自定義攔截器步驟

a)實作 Interceptor

b)重寫四個方法

initialize 初始化

public Event intercept(Event event) 處理單個Event

public List intercept(List events) 處理多個Event,在這個方法中調用Event intercept(Event event)

close 方法

c)靜态内部類,實作Interceptor.Builder

Flume支不支援一對多關系?

1.不支援

2.支援

flume寫hdfs寫入的時候産生很多小檔案,怎麼處理?

flume有三種滾動方式。

1.按照時間

2.按照大小

3.按照count.

如何時間不合适就用大小來處理

Flume+Spark streaming pull 和push 兩種方式的差別?

flume和logtash的差別?

Logstash:有ELK 技術成熟 使用場景廣泛 資料預處理 帶緩存

Flume: 分布式業務場景 事務傳輸 配置複雜 輕量級線程 對接資料源有優勢

Sqoop2:Hadoop和關系型資料庫互相轉換

flume的容災機制和負載均衡?

1.負載均衡

首先了解一下 檔案内容是什麼意思

a1.sinkgroups = g1

a1.sinkgroups.g1.sinks = k1 k2 k3

a1.sinkgroups.g1.processor.type = load_balance

a1.sinkgroups.g1.processor.backoff = true #如果開啟,則将失敗的 sink 放入黑名單

a1.sinkgroups.g1.processor.selector = round_robin # 另外還支援 random 随機round_robin 是輪訓的意思

a1.sinkgroups.g1.processor.selector.maxTimeOut=10000 #在黑名單放置的逾時時間,逾時結

束時,若仍然無法接收,則逾時時間呈指數增長

2.flume 的容錯機制

Failover Sink Processor 能夠實作 failover(失效備援) 功能。

Failover Sink Processor 維護一個優先級 Sink 元件清單,隻要有一個 Sink

元件可用,Event 就被傳遞到下一個元件。故障轉移機制的作用是将失敗的 Sink

降級到一個池,在這些池中它們被配置設定一個冷卻時間,随着故障的連續,在重試

之前冷卻時間增加。一旦 Sink 成功發送一個事件,它将恢複到活動池。 Sink 具

有與之相關的優先級,數量越大,優先級越高。

例如,具有優先級為 100 的 sink 在優先級為 80 的 Sink 之前被激活。如果

在發送事件時彙聚失敗,則接下來将嘗試下一個具有最高優先級的 Sink 發送事

件。如果沒有指定優先級,則根據在配置中指定 Sink 的順序來确定優先級。

flume為什麼選擇kafkachannel

1.傳統方式:TailFileSource–>MemoryChannel–>KafkaSink的這種方式

這種方式的弊端:

A.TailFileSource隻能監聽一個檔案

B.MemoryChannel資料會有堆積,記憶體可能溢出(而FileChannel又比較慢)

C.這種方式經曆多個元件,效率變低,出現問題的機率也變大。

2.新的思路:

使用TailFileSource–>KafkaChannel這種方式,将KafkaChannel作為緩沖,效率變高,而且資料不會丢失"

flume的事務機制?

1.Put事務(source–>channnel)

doput :先将批資料寫入臨時緩沖區putlist裡面

docommit:去檢查channel裡面有沒有空位置,如果有就傳入資料,如果沒有那麼dorollback就把資料復原到putlist裡面。

2.Take事務(channel–>sink)

dotake:将資料讀取到臨時緩沖區takelist,并将資料傳到hdfs上。

docommit :去判斷資料發送是否成功,若成功那麼清除臨時緩沖區takelist

若不成功(比如hdfs系統伺服器崩潰等)那麼dorollback将資料復原到channel裡面

範式模組化(範式模組化和次元模組化的差別)?

規範的數倉為了友善管理,通常分層級3層以上

ods dwd dws ads 等等

次元模組化源自下而上(DM-DW)的資料倉庫架構。

它的特點是:模型結構簡單,星型模型為主,開發周期短,

能夠快速疊代,維護成本高

方式模組化是自上而下的資料倉庫架構

同一份資料隻存放在一個地方,是以隻能從一個地方擷取,沒有資料備援,保證了資料一緻性;

解耦(系統級與業務級),友善維護;

開發周期較長,開發成本較高

1.範式模組化

設計思路自上而下,适合上遊基礎資料存儲,同一份資料隻存儲一份,沒有資料備援,友善解耦,易維護,缺點是開發周期一般比較長,維護成本高

2.次元模組化

設計思路是自下而上,适合下遊應用資料存儲,适合統計多層次次元的彙總,開發周期短,缺點是維護成本高

G1

GC相關問題:

1.什麼樣的對象是垃圾2.是垃圾怎麼回收,3用的什麼算法,各有什麼特點

1.判斷對象是否"活着",死去的就是垃圾

2.通過算法判斷

3.1 Mark-Sweep(标記-清除)算法

優點:标記-清除算法實作起來比較容易

缺點:但是有一個比較嚴重的問題就是容易産生記憶體碎片,碎片太多可能會導緻後續過程中需要為大對象配置設定空間時無法找到足夠的空間而提前觸發新的一次垃圾收集動作。

3.2 Copying(複制)算法

優點:這種算法雖然實作簡單,運作高效且不容易産生記憶體碎片。

缺點:但是卻對記憶體空間的使用做出了高昂的代價,因為能夠使用的記憶體縮減到原來的一半
           

3.3 Mark-Compact(标記-整理)算法

為了解決Copying算法的缺陷,充分利用記憶體空間,提出了Mark-Compact算法。該算法标記階段和Mark-Sweep一樣,但是在完成标記之後,它不是直接清理可回收對象,而是将存活對象都向一端移動,然後清理掉端邊界以外的記憶體

3.44.Generational Collection(分代收集)算法

分代收集算法是目前大部分JVM的垃圾收集器采用的算法。

它的核心思想是根據對象存活的生命周期将記憶體劃分為若幹個不同的區域。

一般情況下将堆區劃分為老年代(Tenured Generation)和新生代(Young Generation)

老年代的特點是每次垃圾收集時隻有少量對象需要被回收

新生代的特點是每次垃圾回收時都有大量的對象需要被回收,那麼就可以根據不同代的特點采取最适合的收集算法

grouobykey和reducebykey和aggregateByKey三種對比?

1.groupByKey()是對RDD中的所有資料做shuffle,根據不同的Key映射到不同的partition中再進行aggregate。

2.reduceByKey()也是先在單台機器中計算,再将結果進行shuffle,減小運算量

3.aggregateByKey()是先對每個partition中的資料根據不同的Key進行aggregate,然後将結果進行shuffle,完成各個partition之間的aggregate。是以,和groupByKey()相比,運算量小了很多。

4.distinct()也是對RDD中的所有資料做shuffle進行aggregate後再去重。

ha的原理

1.主備關系:一主一備

2.難點:1)如何保證主備之間資訊同步,這樣才能保證無縫切換2)防止腦裂情況的發聲

3.基于zk 并且有zkfc 機制 :

H1

fsimage和edit的差別?

1.當NN SN 同步資料同步的時候就用到了fsimage與edit,edit記錄我們對hdfs的最新的操作,達到周期值(可以自行設定),把edit的資訊合并到fsimage ,生成一個新的fsimage

Hadoop(datanode)當機的原因和解決辦法?

1.主從節點ID 不一緻 原因多數是對nameNode 多次format 造成

2.dataNode 磁盤空間占滿

hashMap的底層原理?

數組:其實所謂的數組指的就是一組相關類型的變量集合,并且這些變量彼此之間沒有任何的關聯。存儲區間連續,占用記憶體嚴重,數組有下标,查詢資料快,但是增删比較慢;

連結清單:一種常見的基礎資料結構,是一種線性表,但是不會按照線性的順序存儲資料,而是每一個節點裡存到下一個節點的指針。存儲區間離散,占用記憶體比較寬松,使用連結清單查詢比較慢,但是增删比較快;

哈希表:Hash table 既滿足了資料的快速查詢(根據關鍵碼值key value 而直接進行通路的資料結構),也不會占用太多的記憶體空間,十分友善。哈希表是數組加連結清單組成。

1.HashMap底層就是一個數組結構,數組中的每一項又是一個連結清單。數組+連結清單結構

hashshuffle 為什麼被淘汰而是采用采用sortShuffle?

1.總概括

Spark2.0X版本前,使用的是hashShuffle和優化過後的hashShuffle兩種模式

Spark2.0X版本後,開始使用sortShuffle和bypass模式下的sortShuffle兩種模式

2.前提:

在Spark中Executor的一個core一次性隻能處理一個task的資料,

在Spark中一個partition對應一個task

3.hashShuffle的缺點

因為hashShuffle 的是依據reduceTask 進行hash 散列,一個task的資料溢寫到一個磁盤file中,一個file對應一個reducetask去讀取

這種模式的缺點就是小檔案太多,優化之後小檔案仍然很多

4.sortShuffle的優點

Spark的sortShuffle模式,對資料進行sort全排序,然後寫入磁盤,一個task隻生成一個file檔案;并且在索引檔案中記錄了每個reducetask需要拉取的那部分資料的start offset和end offset,是以reducetask在拉取file資料前需要先讀取索引檔案,然後再去資料結構中拿到相應的那部分切片資料。

5.總結

采用sortShuffle起到了兩點好處:

  1. 小檔案明顯變少了,一個task隻生成一個file檔案

    2.file檔案整體有序,加上索引檔案的輔助,查找變快,雖然排序浪費一些性能,但是查找變快很多

HashMap和HashTable差別?

1.線程安全性不同

hashTable 線程安全,效率低下 hashMap 相反

2.key和value是否允許null值

hashTable key 不能是null 但是hashMap可以有一個

3.數組初始化和擴容機制

ashtable的初始長度是11,之後每次擴充容量變為之前的2n+1(n為上一次的長度)

而HashMap的初始長度為16,之後每次擴充變為原來的兩倍

建立時,如果給定了容量初始值,那麼Hashtable會直接使用你給定的大小,而HashMap會将其擴充為2的幂次方大小

hadoop的機架感覺(或者說是擴普)?

資料塊會優先儲存在namenode機架近的機器上

1.如果一個機架出回題,不會影響資料讀寫

2.寫入資料的時候會寫到不同機架的 DataNode中

3. MapReduce會根據機架擷取離自己比較近的網絡資料(就近原則)

hadoop的TextInputFormat作用是什麼,如何自定義實作

1.作用InputFormat會在map操作之前對資料進行兩方面的預處理

A.是getSplits,傳回的是InputSplit數組,對資料進行split分片,每片交給map操作一次

B.是getRecordReader,傳回的是RecordReader對象,對每個split分片進行轉換為key-value鍵值對格式傳遞給map

常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行内容作為值

2.自定義實作

自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法

在createRecordReader中可以自定義分隔符

Hbase的讀寫流程(結合架構圖說)

1.讀流程

A.用戶端通過zookeeper以及root表和meta表找到目标資料所在的regionserver

B.聯系regionserver查詢目标資料

C.regionserver定位到目标資料所在的region,發出查詢請求

D.region先在memstore中查找,命中則傳回

E.如果在memstore中找不到,則在storefile中掃描,最後結果傳回

2.寫流程

A.client向region server送出寫請求

B.region server找到目标region

C.region檢查資料是否與schema(表結構)一緻

D.如果用戶端沒有指定版本,則擷取目前系統時間作為資料版本

E.将更新寫入WAL log 和 Memstore

F.判斷Memstore的是否需要flush為StoreFile檔案。 完成!!

hbsae的協處理器

為什麼會出現協處理器:

在0.92版本之前 建立二級索引較難,很難進行簡單的排序、求和、計數等操作。這裡是指在該版本限制下難以進行上述操作,不是不行。為了降低難度,提出了協處理器的概念。

兩類

1.observer(類似于關系資料庫的觸發器)

A、RegionObserver:使用者可以通過這種處理器來處理資料修改事件,它們與表的Region緊密關聯。region級的操作。對應的操作是:put/delete/scan/get

B、MasterObserver:可以用作管理或DDL類型的操作,是叢集級的操作。對應的操作是:建立、删除、修改表。

C、WALObserver:提供控制WAL的鈎子函數。

2.endPoint(類似于關系資料庫的存儲過程)

将使用者的自定義操作添加到伺服器端,endPoint可以通過添加遠端過程調用來擴充RPC協定。使用者可以将自定義完成某項操作代碼部署到伺服器端。例如:伺服器端的計算操作。

Hbase優化有哪些?

1.AutoFlush 設定為false ,然後可以批量導入資料

2.WAL Flag hbase 寫入資料的時候,首先會吓到WAL(Write Ahead Log)日志,既Hlog日志,一個RegionServer上的所有Region共享一個HLog,隻有當WAL日志寫成功後,再接着寫MemStore,如果寫入資料失敗,用戶端被告知送出失敗,這樣做的好處是可以做到RegionServer當機後的資料恢複 ,當然對于不太重要的資料,可以調用Put.setWriteToWAL(false)或Delete.setWriteToWAL(false)函數,放棄寫WAL日志,以提高資料寫入的性能。

3.Compression 壓縮

資料量大,邊壓邊寫也會提升性能的,畢竟IO是大資料的最嚴重的瓶頸,哪怕使用了SSD也是一樣。衆多的壓縮方式中,推薦使用SNAPPY。從壓縮率和壓縮速度來看,成本效益最高

4.批量寫

調用HTable.put(Put)方法可以将一個指定的row key記錄寫入HBase,HTable.put(List)方法可以将指定的row key清單,批量寫入多行記錄

5.多并發程式設計

寫在用戶端開啟多個 HTable 寫線程,每個寫線程負責一個 HTable 對象的 flush 操作,這樣結合定時 flush 和寫 buffer(writeBufferSize),可以既保證在資料量小的時候,資料可以在較短時間内被 flush(如1秒内),同時又保證在資料量大的時候,寫 buffer 一滿就及時進行 flush。

6.HMaster 配置成主備形式 高可用

7.rowkey 設計優化

8.建立表的時候,開啟預分區

hbsae的熱點問題?

1.當大量的client通路hbase叢集的一個或少數幾個節點,造成少數region server的讀/寫請求過多、負載過大,而其他region server負載卻很小,就造成了“熱點”現象

2.熱點帶了的問題

大量通路會使熱點region所在的單個主機負載過大,引起性能下降甚至region不可用

3.引發熱點的原因

有大量連續編号的row key ==> 大量row key相近的記錄集中在個别region

hbase資料(使用spark讀取)具體寫了什麼代碼?

1.val hbaseRDD = sc.newAPIHadoopRDD(configuration, classOf[TableInputFormat], classOf[ImmutableBytesWritable], classOf[Result])

hbase一整表能存多大資料?

1.億 如10億條

hbase LSM?

https://blog.csdn.net/u014432433/article/details/51557834

hbase的導入批量資料的方式?

1.sql (hive/phoenix) 批量執行sql

2.hbase api (put) putList

3.bulkLoad :在外生成Hfile 不在經過wal–>memorystore ,直接存放到hbase中

弊端是:1.隻适合初次資料導入 2.hbase和hadoop 必須同在一個叢集

hbase的過濾器

1.行鍵過濾器 RowFilter

2.列簇過濾器 FamilyFilter

3.列過濾器 QualifierFilter

4.值過濾器 ValueFilter

5.時間戳過濾器 TimestampsFilter

6.專用過濾器

A.單列值過濾器 SingleColumnValueFilter ----會傳回滿足條件的整行

B.單列值排除器 SingleColumnValueExcludeFilter

C.字首過濾器 PrefixFilter----針對行鍵

D.列字首過濾器 ColumnPrefixFilter

E.分頁過濾器 PageFilter

Hbase 支援事務嗎 ?

支援 Hbase事務原子性

Hbase的資料會先寫入WAL,再寫入Memstore,寫入Memstore的時候出現異常可以復原

Hbase的事務一緻性保證:強制一緻性保證

Hbase的事務隔離

每次都是在寫入的時候先擷取行鎖,如果擷取不到就說明其他線程已經擷取了行鎖,就需要不斷的等待直到其他線程釋放該鎖才可以寫入資料

Hbase的持久化

HBase事務持久化可以了解為WAL持久化ASYNC_WAL表示異步将WAL持久化到硬碟

hbase中WAL和HLog是什麼?

WAL(Write Ahead Log)相似于MySQL BIN日志; 它記錄了資料中發生的所有變化。它是Hadoop的标準序列檔案,它存儲HLogkey。這些密鑰由序列号和實際資料組成,使用于在伺服器崩潰後重放尚未保留的資料。因而,在伺服器故障的現金中,WAL作為生命線工作并檢索丢失的資料。

hbase的關健元件是什麼?

1.HMaster的作用:

A.為region server 配置設定region;

B.負責region server的負載均衡,region分裂完成監控;

C.處理schema更新請求,資料表的建立,更新;

D.HDFS上的垃圾檔案回收;

E.發現失效的region server并重新配置設定上面的region;

2.HRegionServer的作用:

A.切分過大的region,合并region;

B.維護master配置設定的給的region,并處理這些io請求;

C.負責資料的讀寫功能,如果hmaster挂了,不影響資料的讀寫操作。

3.zookeeper的作用:

A.HRegionServer向zookeeper注冊,提供是否還線上的資訊;

B.Hbase啟動的時候将hbase系統表加載到zk cluster,zk cluster擷取目前表上有的regionserver資訊;

C.Hmaster提供是否線上,避免單點故障;

4.Region:它包含在記憶體資料存儲(MemStore)和Hfile中。

5.目錄表:目錄表由ROOT和META組成

Hbase rowkey設計的原則,你們怎麼設計的?

1.rouwkey長度不超過16個位元組,最好加上時間戳,按天分表,提高查詢效率

2.防止熱點問題:高位做散列(最好兩位元組做散列,四個位元組存時間) 在rowkey加鹽 (類如在rowkey前拼接字元串–UUID)

3.rowkey 是按照字典順序排列的

rowkey:

區号|間戳|身份證号/裝置id/手機号|tableName

HDP的版本?

2.6.5

Hdfs如何實作磁盤挂載問題?

0.使用mount 增加磁盤空間

  1. 修改配置檔案hdfs-site.xml

dfs.datanode.data.dir /data1/appData/hdfs/data /data2/appData/hdfs/data 2.添加修改磁盤存放選擇政策 dfs.datanode.fsdataset.volume.choosing.policy org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy

hdfs的讀寫流程圖(邊畫邊講)?

1.讀流程

(1)使用HDFS提供的用戶端開發庫,向遠端的Namenode發起RPC請求;

(2)Namenode會視情況傳回檔案的部分或者全部block清單,對于每個block,Namenode都會傳回有該block拷貝的datanode位址;

(3)用戶端拿到block的位置資訊後調用FSDataInputStream API的read方法并行的讀取block資訊,圖中4和5流程是并發的,block預設有3個副本,是以每一個block隻需要從一個副本讀取就可以。用戶端開發庫會選取離用戶端最接近的datanode來讀取block;

(4)讀取完目前block的資料後,關閉與目前的datanode連接配接,并為讀取下一個block尋找最佳的datanode;傳回給用戶端。

(5)當讀完清單的block後,且檔案讀取還沒有結束,用戶端開發庫會繼續向Namenode擷取下一批的block清單。

讀取完一個block都會進行checksum驗證,如果讀取datanode時出現錯誤,用戶端會通知Namenode,然後再從下一個擁有該block拷貝的datanode繼續讀。

2.寫流程

(1)用戶端向NameNode發出寫檔案請求。

(2)檢查是否已存在檔案、檢查權限。若通過檢查,直接先将操作寫入EditLog,并傳回輸出流對象。

(3)client端按128MB的塊切分檔案。

(4)client将NameNode傳回的配置設定的可寫的DataNode清單和Data資料一同發送給最近的第一個DataNode節點

client端和NameNode配置設定的多個DataNode構成pipeline管道,client端向輸出流對象中寫資料。

(5)每個DataNode寫完一個塊後,會傳回确認資訊。

(6)寫完資料,關閉輸輸出流。

(7)發送完成信号給NameNode

hive的參數優化:

1.map 和reducer 的數量

2.tez将會根據vertice的輸出大小動态預估調整reduce的個數(底層引擎設定)

3.Map Join優化, 不太大的表直接通過map過程做join(map 端join)

set hive.auto.convert.join=true;

set hive.auto.convert.join.noconditionaltask=true;

hdfs的調優經驗?

1.小檔案提前合并

2.配置壓縮格式 / 備份數目

3.配置datanode 的檔案存儲路徑

4.開啟JVM重用

5.合理設定block的大小(dfs.block.size)

6.将中間結果目錄設定為分布在多個磁盤以提升寫入速度(mapred.local.dir)

7.設定DadaNode處理RPC的線程數,大叢集可以适當加大。(dfs.datanode.handler.count)

HQL轉化為MR?

1.互動接口送出SQL

2.驅動器驅動

3.解析器,進行解析

4.編譯器,進行編譯

5.優化器,進行優化

6.執行器進行執行的過程

hive的資料傾斜問題?

1.資料傾斜(join)

a.大表(2.8G)與小表關聯(580K)(會發生)

b.大表(2.8G)與大表(3.0G)關聯(不會發生)

:由于大表與小表資料量相差3000倍,周遊整個過程需要大表資料條數X小表的資料條數=總量。這樣會導緻資料嚴重傾斜。具體表現:背景資料寫入一直出去某種狀态如控制台一直處于38%處理狀态。二,磁盤的容量被大量占用,嚴重會導緻叢集崩潰。

解決方案:左右表關聯查詢将小表置于左側。這樣其資料先讀入磁盤中(原理僅用map在磁盤中處理),減少線上(reduce)資料處理的壓力。

2.group by (每一個字段值過多)

A.map 端提前解決 提前聚合 相當于Combiner

hvieSql的優化?

1.分區設定

動态分區和靜态分區 盡量是動态分區 使用起來比較友善

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

2.分桶

set hive.enforce.bucketing=true;

set hive.enforce.sorting=true;

3.join優化

hive.optimize.skewjoin=true;如果是join過程中出現傾斜 應該設定為true

set hive.skewjoin.key=100000; 這個是join的鍵對應的記錄條數,超過這個值則會進行優化

4.mapjoin

set hive.auto.convert.join=true;

hive.mapjoin.smalltable.filesize預設值是25mb

select /+mapjoin(A)/f.a, f.b from A t join B f on (f.a=t.a)

5.group by優化

hive.group.skewindata=true; 如果是group by過程出現傾斜,應該設定為true

set hive.groupby.mapaggr.checkinterval=100000; 這個是group的鍵對應的記錄條數超過這個值則會進行優化

6.并行化執行

set hive.exec.parallel=true;

set hive.exec.parallel.thread.number=8;

7.輸入輸出小檔案合并

8.jvm 的重用

set mapred.job.reuse.jvm.num.tasks=20;

9.壓縮格式

中間壓縮就是處理hive查詢的多個job之間的資料,對于中間壓縮,最好選擇一個節省CPU耗時的壓縮方式 比如snappy

hiveSql訓練:

1.rowNumber() over() :打标函數 例題:找出所有學生中成績從來沒有低于60分的學生student_id

2.

hive和hbase的整合?怎麼整合?

1.複制hbase 的jar 包到hive 的目錄下面

hbase-client-0.98.13-hadoop2.jar

hbase-common-0.98.13-hadoop2.jar

hbase-server-0.98.13-hadoop2.jar

hbase-common-0.98.13-hadoop2-tests.jar

hbase-protocol-0.98.13-hadoop2.jar

htrace-core-2.04.jar

hive-hbase-handler-1.0.0.jar

zookeeper-3.4.5.jar

2.修改hive-site.xml 的目錄

hive.aux.jars.path 把對應的jar 配上去

3.修改hive.zookeeper.quorum 屬性

hive支援的底層資料格式?他們之間的差别

1.TextFile:預設的類型,行存儲 不對文本進行壓縮,效率比較低下

2.rcfile:按行塊,每塊再按列存儲

3.avro:二進制 Avro是一個資料序列化系統,設計用于支援大批量資料交換的應用。

4.ORC rcfile:的更新版,預設是zlib,支援snappy 其格式不支援

5.parquet :列式 快

6.SEQUENCEFILE:二進制檔案,以<key,value>的形式序列化到檔案中,可分割,可壓縮,優勢是檔案和Hadoop api中的mapfile是互相相容的

hive如何自定義函數?

1.繼承類 如 UDF

2.重寫方法 如evaluate

3.打成jar包

4.添加jar 到lib 目錄

5.配置hive-site.xml

6.注冊成函數

hive内部表和外部表的差別?

1.hive建立表的時候通過 external修飾的來建立外部表,沒有 external的則是内部表,

2.當删除内部表時,存儲在HDFS的資料将會被一起删除,而删除外部表時,資料則會保留

hvie的條件函數coalesce?

從左到右傳回第一個不為NULL

hive 使用視窗函數切割url

1.parse_url 使用此函數就能解決問題

parse_url(url, partToExtract[, key]) - extracts a part from a URL

artToExtract的選項包含[HOST,PATH,QUERY,REF,PROTOCOL,FILE,AUTHORITY,USERINFO]

A.select parse_url(‘http://hujiang.com/category/12258437290?query=test’, ‘PROTOCOL’) from dual;

–http

B.select parse_url(‘http://hujiang.com/category/12258437290?query=test’, ‘PROTOCOL’) from dual;

–http

C.select parse_url(‘http://hujiang.com/category/12258437290?query=test’, ‘REF’) from dual;

—空

D.select parse_url(‘http://hujiang.com/category/12258437290?query=test’, ‘PATH’) from dual;

—/category/12258437290

E.select parse_url(‘http://hujiang.com/category/12258437290?query=test’, ‘QUERY’) from dual;

—query=test

F.select parse_url(‘http://hujiang.com/category/12258437290?query=test’, ‘QUERY’) from dual;

—query=test

G.select parse_url(‘http://hujiang.com/category/12258437290?query=test’, ‘QUERY’) from dual;

—query=test

H.select parse_url(‘http://hujiang.com/category/12258437290?query=test’, ‘USERINFO’) from dual;

—空

hive常見的基礎函數使用

rpad: rpad(string str, int len, string pad)。将str進行用pad進行右補足到len位

lpad:(string str, int len, string pad)。将str進行用pad進行左補足到len位

Split:split(string str, string pat)。按照pat字元串分割str,會傳回分割後的字元串數組

舉例:select split(‘abtcdtef’,‘t’) from dual; ##傳回值為[“ab”,“cd”,“ef”]

explode函數可以将一個array或者map展開,其中explode(array)使得結果中将array清單裡的每個元素生成一行;explode(map)使得結果中将map裡的每一對元素作為一行,key為一列,value為一列,一般情況下,直接使用即可,但是遇到以下情況時需要結合lateral view 使用

regexp_replace:替換函數

Hive的分區和分桶的差別?

1.partition By( )

分區就是分檔案夾,在表檔案夾下多一個檔案夾,分區字段是虛拟的,用于辨別檔案,分區字段一定不是表中存在的字段,否則會便宜報錯

2.cluster into

分桶功能預設不開啟,需要手動開啟,分桶個數自定義,是相對于分區更細粒度的劃分,是分檔案

hive的視窗函數?

RANK() 排序相同時會重複,總數不會變

DENSE_RANK() 排序相同時會重複,總數會減少

ROW_NUMBER() 會根據順序計算

驗證執行個體如下:

hive的動态分區和靜态分區的差別?

靜态分區 SP(static partition)

  1、靜态分區是在編譯期間指定的指定分區名

  2、支援load和insert兩種插入方式

    2.1load方式

      1)會将分區字段的值全部修改為指定的内容

      2)一般是确定該分區内容是一緻的時候才會使用

    2.2insert方式

      1)必須先将資料放在一個沒有設定分區的普通表中

      2)該方式可以在一個分區記憶體儲一個範圍的内容

      3)從普通表中選出的字段不能包含分區字段

  3、适用于分區數少,分區名可以明确的資料

動态分區 DP(dynamic partition)

  1、根據分區字段的實際值,動态進行分區

  2、是在sql執行的時候進行分區

  3、需要先将動态分區設定打開(set hive.exec.dynamic.partition.mode=nonstrict )

  4、隻能用insert方式

  5、通過普通表選出的字段包含分區字段,分區字段放置在最後,多個分區字段按照分區順序放置

I1

idea 中安全删除啥意思?

删除的時候,給你做調用地方檢查,如果有就給你提示,如果沒有就直接删除

impala(presto kylin )元件的調優

1.大資料量來說,Parquet檔案格式是最佳的 選擇合适的Parquet塊大小

2.防止入庫時産生大量的小檔案(insert … values會産生大量小檔案,應該避免使用)

在impala外生成資料時,最好是text格式或者Avro,這樣你就可以逐行的建構檔案,到了impala之後,再通過簡單的insert … select語句将其轉換為Parquet格式

3.根據實際的資料量大小選擇合适的分區粒度

4.确認查詢是以高效的邏輯方式進行規劃

在執行之前使用EXPLAIN來檢視邏輯規劃,分析執行邏輯

J1

job (spark運作有多少job/job界定的方式)?

一個action算子就是一個job

一個類的有30左右,然後循環使用

join(mapjoin跟redurcejoin的差別 以及代碼實作)?

hive 中的join可分為倆類,一種是common join(也叫Reduce join或shuffle join),另一種是 map join,後者是對hive join的一個優化,

利用本地的task對較小的表hash生産一個hashtable檔案,然後直接和map出來另一個表進行比對,最終完成join

set hive.auto.convert.join = false 在0.7.0到0.10.0版本預設是false,表示不使用優化

set hive.auto.convert.join = true在0.11.0到之後的版本是ture,代表使用優化

叢集的規模和版本(遇到哪些坑)?

1.hdp 叢集規模問題

2.kafka版本問題

3.phonenix 版本對SQL 支援的問題

4.impala 和ambari 平台內建的問題

計算引擎(公司主要的計算引擎)是什麼?

hive(mr) spark flink storm(逐漸淘汰)

棘手的問題(工作和項目遇到的)?

1.資料傾斜

2.即時查詢問題

3.資料丢失問題

4.hbase 增量導入問題

java -jar 和java -cp 的差別?

1.java -jar 執行指令的時候會用到會用到目錄META-INF\MANIFEST.MF檔案,在該檔案中,有一個叫Main-Class的參數,它說明了java -jar指令執行的類

2.java -cp 和 -classpath 一樣,是指定類運作所依賴其他類的路徑,通常是類庫,jar包之類,需要全路徑到jar包,window上分号“;”

A.打包時指定了主類,可以直接用java -jar xxx.jar。當然也可以使用 -cp 但是需要手動指定主類

B.打包時沒有指定主類就是java -cp jarName mainClass

C.要引用其他的jar包,可以用java -classpath $CLASSPATH:xxxx.jar 主類名稱(絕對路徑)。其中 -classpath 指定需要引入的類。

jvm 每一個區存儲的内容:

1.虛拟機(jvm)主要有程式電腦,虛拟機棧,本地方法棧,堆和方法區

A.程式電腦是一塊比較小的記憶體空間,主要存放代碼執行的位置,分支,循環,跳轉,異常處理,線程回複等基本功能都需要一個計數器來完成

B.經常有人把java記憶體分為堆記憶體和棧記憶體。這裡所說的棧指的就是虛拟機棧 虛拟機棧中存放了各種基本資料類型和對象引用

C.堆和方法區是各個線程共享的記憶體區域 堆是jvm所管理的記憶體中最大的一塊,在虛拟機啟動的時候建立,此區域的唯一目的就是為了存放對象執行個體

D.方法區:用于存放被虛拟機加載的類資訊,常量,變量,也就是編譯器編譯之後的代碼

另外運作時常量池用于存放編譯器生産的各種字面量和符号引用

jvm垃圾收集器,各自的優缺點?

1.如果說

jvm調優經驗

https://www.cnblogs.com/baizhanshi/p/6590406.html

java實作同或|異或操作?

1.同或 :相同為真 不同為假

2.異或 :不同為真 相同為假

java中垃圾收集的方法有哪些?

1.引用計數法

2.複制算法

3.标記清除

4.标記壓縮

5.标記清除壓縮

Java自帶有哪幾種線程池?

Java通過Executors提供四種線程池,分别為:

1.newCachedThreadPool建立一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則建立線程

2.newFixedThreadPool建立一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待

3.newScheduledThreadPool建立一個定長線程池,支援定時和周期性任務執行

4.newSingleThreadExecutor建立一個單線程化的線程池,它隻會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO,LIFO,優先級)執

K1

java語言和scala語言的差別?

  1. 二者的共性都是基于jvm運作,并且可以互相調用 scala和java最大差別就是scala是多範式的語言 支援函數式程式設計 當然具體細節方面有很多如:

    A.源檔案字尾名不一樣 B.變量常量修飾不一樣 var val C.函數定義不一樣 D.循環寫法不一樣 E.集合類型 scala 獨有tuple F.scala 獨有的隐式轉換功能 G.get set方法不一樣

    1,首先scala中沒有interface scala 中有trait(類似java中抽象類)

    2.scala中比較靈活 可以不定義變量/常量聲明類型

    3.scala中的單例類是用ibject修飾,java需要自己實作

    4.scala中通配符_ java中通配符*

    5.scala 的傳回值 可以直接寫 java 需要些return

課程回顧(各個元件的作用)?

主要所學技術:

1.資料采集傳輸:flume kafka sqoop logstash DataX

2.資料存儲 :mysql hdfs hbsae redis mongpodb es

3.資料計算 :hive tez spark flink storm

4.資料查詢 :presto impala Druid kylin

Kafka分區配置設定政策?

在 Kafka内部存在兩種預設的分區配置設定政策:Range和 RoundRobin。

Range是預設政策。Range是對每個Topic而言的(即一個Topic一個Topic分),首先對同一個Topic裡面的分區按照序号進行排序,并對消費者按照字母順序進行排序。然後用Partitions分區的個數除以消費者線程的總數來決定每個消費者線程消費幾個分區。如果除不盡,那麼前面幾個消費者線程将會多消費一個分區。

kafka出現資料積壓問題,怎麼解決?

1.增加分區資料和消費者的數量,提高消費能力

2.提高每批次拉取的數量和縮短批次等待時長

kafka跟sparkstreaming的兩種連接配接方式

兩種:awl 和 直連 (公司常用的是直連)

1.awl

Awl :(createStream)自動維護偏移量 有接收者 PUSH推送資料 調用的Kafka進階API

2.直接

直連:(createDirectStream)手動維護偏移量 沒有接收者 PULL拉取資料 調用kafka低級API

kafka高階Api和低階Api的差別

1.進階 API 寫起來簡單不需要去自行去 管理offset,系統通過 zookeeper 自行管理

2.低級API 能夠開發者自己控制 offset,想從哪裡讀取就從哪裡讀取。自行控制連接配接分區,對分區自定義進行負載均衡

對 zookeeper 的依賴性降低(如:offset 不一定非要靠 zk 存儲,自行存儲 offset 即可,比如存在檔案或者記憶體中)

kafka消費者和分區的關系

topic下的一個分區隻能被同一個consumer group下的一個consumer線程來消費,但反之并不成立,

即一個consumer線程可以消費多個分區的資料,比如Kafka提供的ConsoleConsumer,預設就隻是一個線程來消費所有分區的資料。

即分區數決定了同組消費者個數的上限

kafka怎麼增加消費者?

這取決于Topic/Partition的數量,假設M個topic,N個partition,那麼可以用M * N個consumer擴充消費速度

kafka擴充一個節點,怎麼保證分區配置設定一緻,新加的kafka怎麼和其他節點的kafka結合?

問題:

新增一台kafka 但是資料不經過這個節點?

遷移資料的過程是手動啟動的(手動)==>整個過程自動化的

如何進行分區和資料的遷移?

執行bin下面重新分區指令 :

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to-move-json-file topics-to-move.json --broker-list “5,6”

–generate

有三種模式:

–generate:在此模式下,給定主題清單和代理清單,該工具會生成候選重新配置設定,以将指定主題的所有分區移動到新代理。此選項僅提供了一種友善的方法,可在給定主題和目标代理清單的情況下生成分區重新配置設定計劃。

–execute:在此模式下,該工具根據使用者提供的重新配置設定計劃啟動分區的重新配置設定。(使用–reassignment-json-file選項)。這可以是由管理者手工制作的自定義重新配置設定計劃,也可以使用–generate選項提供

–verify:在此模式下,該工具将驗證最後一次–execute期間列出的所有分區的重新配置設定狀态。狀态可以是成功完成,失敗或正在進行中

kafka 注冊?

broker.id=2 配置檔案給的(差別其他的節點)

zookeeper.connect=vm0:2181,vm1:2181,vm2:2181 啟動的時候想zk 中注冊自己資訊

kafka的三種部署模式?

1)單broker模式

2)單機多broker模式 (僞叢集)

3)多機多broker模式 (真正的叢集模式)

kafka的hw和isr機制

1.HW(high waterMark):高水位,它辨別了一個特定的消費偏移量(offset),

消費者隻能拉去到offset 之前的資料

2.isr機制:kafka為了保證消息的一緻性二提一種機制

Kafka的三種語義(你們用的是哪一種)?

1.最多一次

2.最少一次

3.僅有一次

Kafka有幾種資料保留的政策?

Kafka有兩種儲存資料的政策:

1.按照過期時間保留

2.按照存儲消息大小保留

kafka的資料如何做下一步的落地工作?

1.flink/Spark streaming 進行消費,然後邏輯分析

2.flume拉去kafka資料,然後寫入我們數倉中

kafka為什麼速度快?

1.Kafka速度的秘訣在于,它把所有的消息都變成一個批量的檔案,并且進行合理的批量壓縮,減少網絡IO損耗

2.通過map提高I/O速度,寫入資料的時候由于單個Partion是末尾添加是以速度最優讀取資料的時候配合sendfile直接暴力輸出

3.零拷貝技術,可以有效的減少上下文切換和拷貝次數

4.順序寫磁盤的性能是随機寫入的性能的6000倍的提升,媲美記憶體随機通路的性能,磁盤不再是瓶頸點。

kafka如何做資料遷移?

https://www.cnblogs.com/smartloli/p/10551165.html

kafka多個partition如何保證順序消費?

1.寫入資料的時候通過partitionKey 将某類消息寫入同一個partition

一個partition隻能對應組内的一個消費線程,以保證資料有序。

Kafka的消費保證消息不重複,不丢失?

幂等原則,kafka ack機制(事務)

https://www.cnblogs.com/smartloli/p/11922639.html

kafka如何重置offset?

1.檢視topic 的offset 範圍

用下面指令可以查詢到topic:DynamicRange broker:SparkMaster:9092的offset的最小值:

bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list slave6:9092 -topic videoplay --time -2

輸出

DynamicRange:0:1288

查詢offset的最大值:

bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list slave6:9092 -topic videoplay --time -1

輸出

DynamicRange:0:7885

結論:從上面的輸出可以看出topic:DynamicRange隻有一個partition:0 offset範圍為:[1288,7885]

2.設定consumer group的offset

啟動zookeeper client

/zookeeper/bin/zkCli.sh

通過下面指令設定consumer group:DynamicRangeGroup topic:DynamicRange partition:0的offset為1288:

set /consumers/DynamicRangeGroup/offsets/DynamicRange/0 1288

注意如果你的kafka設定了zookeeper root,比如為/kafka,那麼指令應該改為:

set /kafka/consumers/DynamicRangeGroup/offsets/DynamicRange/0 1288

生效

重新開機相關的應用程式,就可以從設定的offset開始讀資料了

kafka(自己維護offset 代碼示範)

https://blog.csdn.net/qq_38483094/article/details/99118140

kafka的offset過期了怎麼辦?

1.offset存放位置 0.9 版本之前放在zk中 0.9之後放在自己的一個topic中(__consumer_offsets),同時也保留了zk的接口,可以通過 offsets.storage 屬性來進行設定

更新的原因是:ZKClient的API操作Zookeeper頻繁的Write很低效,後期擴充受zk 影響比較大

2.offset 在zookeeper 中或者自身的一個topic中,預設儲存的時間是24小時 資料預設儲存的時間是7天

offset過期造成的影響分情況來定:

過期分兩種:1.offset過期 2.源資料過期

A.

B.

kafka_2.11-1.0.1 中的offset 預設失效時間是 24小時,也就是1440分鐘。

配置參數為offsets.retention.minutes, 機關是 分鐘。

kafka每10分鐘運作一次清理過期offset資料。

是以如果offsets.retention.minutes 設定小于10分鐘,則仍為10分鐘清理。

就是說,預設情況下,如果你已經讀到第5條了,然後停了24小時後再讀,如果資料還沒過期(log.retention.hours),則會從第一條重新開始讀;而在24小時内重新開始讀,則從第6條開始

kafka的group關系 新添加一個group 對于offset的劃分 ?

kafka怎麼保證資料不丢失?

1.每個partition中有多個replication備份 類似hdfs的備份機制

2.生産者 ack機制 三種狀态(0 1 -1)

0:不管接受沒有接受資料,都發送下一條資料

1:隻要leader确認接收到消息,才發送下一條資料

-1:隻要follwer确認接收到消息,才發送下一條資料

3.Consumer 端保證資料不丢失

3.offset 偏移量,它是存放在zookeeper中保證資料不重複 不丢失。Enable.auto.commit=true 開啟自動送出(false關閉自動送出),一般是關閉,避免資料的丢失。 新的版本0.9存在自己的topic

Kylin技術的了解?

K8s的了解和應用?

Kappa 架構(什麼事kappa架構)?

真正意義上的流處理架構

L1

連結清單和數組的差別?

1.連結清單不用要連續的存儲空間 但是數組需要

2.連結清單的大小可動态變化,但是數組是固定的

3.連結清單增删較快 數組較慢

4.連結清單查詢較慢 數組查詢較快 因為連結清單必須順序通路,數組可以随機通路

零拷貝(kafka)是什麼?

零拷貝就是一種避免 CPU 将資料從一塊存儲拷貝到另外一塊存儲的技術。針對作業系統中的裝置驅動程式、檔案系統以及網絡協定堆棧而出現的各種零拷貝技術極大地提升了特定應用程式的性能,并且使得這些應用程式可以更加有效地利用系統資源。這種性能的提升就是通過在資料拷貝進行的同時,允許 CPU 執行其他的任務來實作的。

零拷貝技術可以減少資料拷貝和共享總線操作的次數,消除傳輸資料在存儲器之間不必要的中間拷貝次數,進而有效地提高資料傳輸效率。而且,零拷貝技術減少了使用者應用程式位址空間和作業系統核心位址空間之間因為上下文切換而帶來的開銷。進行大量的資料拷貝操作其實是一件簡單的任務,從作業系統的角度來說,如果 CPU 一直被占用着去執行這項簡單的任務,那麼這将會是很浪費資源的;如果有其他比較簡單的系統部件可以代勞這件事情,進而使得 CPU 解脫出來可以做别的事情,那麼系統資源的利用則會更加有效。綜上所述,零拷貝技術的目标可以概括如下:

避免資料拷貝

①避免作業系統核心緩沖區之間進行資料拷貝操作。

②避免作業系統核心和使用者應用程式位址空間這兩者之間進行資料拷貝操作。

③使用者應用程式可以避開作業系統直接通路硬體存儲。

④資料傳輸盡量讓 DMA 來做。

将多種操作結合在一起

①避免不必要的系統調用和上下文切換。

②需要拷貝的資料可以先被緩存起來。

③對資料進行處理盡量讓硬體來做

類加載的原理(過程)?

類裝載器就是尋找類的位元組碼檔案,并構造出類在JVM内部表示的對象元件。在Java中,類裝載器把一個類裝入JVM中,要經過以下步驟:

裝載:查找和導入Class檔案。


 連結:把類的二進制資料合并到JRE中。


      校驗:檢查載入Class檔案資料的正确性。


      準備:給類的靜态變量配置設定存儲空間。


      解析:将符号引用轉成直接引用。



 初始化:對類的靜态變量,靜态代碼塊執行初始化操作。
           

連結清單反轉操作(java/scala)(一個單向連結清單如何實作反轉)?

1.單連結清單:每個節點包含兩部分,一部分存放資料變量的data,另一部分是指向下一節點的next指針

2.雙聯表:每個節點包含兩部分,一部分存放資料變量的data,另一部分是指向下一節點的next指針

連結清單的優點在于,不需要連續的存儲單元,修改連結清單的複雜度為O(1) (在不考慮查找時)

但是缺點也很明顯:無法直接找到指定節點,隻能從頭節點一步一步尋找複雜度為O(n)

listBuffer ==> rdd 如何轉換?

sc.mkRDD(list) sc.parallzie(list)

拉連結清單(什麼是拉連結清單?怎麼設計?你們業務怎麼用)

https://blog.csdn.net/qq_27657429/article/details/103020761

Lambda 架構(什麼事Lamdba架構)?

同時維護兩種架構

Lucene是啥啊?

1.lucene是apache的一個開源項目,是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎

linux的目錄結構?

https://www.cnblogs.com/pythonywy/p/11752701.html

Linux常用指令?

1.有關檔案目錄操作指令:ls cd pwd mkdir rmdir cp rm mv touch cat more head tail

2.使用者管理的指令 :useradd userdel sermod passwd groupadd groupdel groupmod

3.磁盤管理的指令 :df du fdisk fsck mount unmount top

4.檔案賦權指令 :chmod chwon

5.定時的 指令 :crontab

6.程序相關指令 :ps jps kill

7.重新開機關系 :shutdown half

8.搜尋查找 :find which grep

9.壓縮解壓 :gzip tar bzip2 zip unzip

M1

離線過程遇到哪些問題? 你是怎麼解決的 ?

1.問題:斷點續傳

解決:添加增量的辨別 ,下次導入的時候 讀取上次的記錄的增量 繼續導入

2.問題:資料傾斜

解決: 對key進行處理(加鹽,hash,翻轉) ,增加分區,提高并行度

3.問題:檔案格式 Windows換行字元 cr lf linux換行符 lf 讀取檔案的時候出現問題

解決:直接在linux建立檔案

4.問題: hbase熱點

解決: rowkey重新設定

預分區的數量的添加(hbase shell指令常見分區,java API進行設定)

mapreduce的原理

“分而治之”

mapreduce的資料傾斜原因和解決辦法?

1.原因

A.key分布不均勻 B.業務資料本身的特性 C.建表時考慮不周 D.某些SQL語句本身就有資料傾斜

2.解決辦法

A.key 的打散 兩次mr B.map階段對應某些key 提前進行一次合并 C.增加reduce個數

mapreducer的分區政策(如何分區的),分區如何确定的?

1.hashPartition (預設)

KV對根據key的hashcode值與reduceTask個數進行取模,決定該鍵值歸哪一個reduceTask

mr的map端任務數量如何指定?reducer 數怎麼指定?

1.map的個數是有檔案的大小決定的,一般不需要我們設定,FileInputFormat分成了幾個切片就會有幾個mapper,當然如果檔案是.gz格式的檔案,無法進行切分,每個檔案會生成一個mapper

2.reducer的個數如果不設定,會根據兩個參數自動計算:

(1)hive.exec.reducers.bytes.per.reducer

這是每個reduce處理的資料量,預設為1G=1000000000

(2)hive.exec.reducers.max(每個任務的最大reduce個數,預設1009)

reduce個數=min(參數2,map端輸出資料總量/參數1)

當然也可以直接設定:set mapred.reduce.tasks=5;

MR中排序發生在哪幾個階段?這些排序是否可以避免?

1.一個MapReduce作業由Map階段和Reduce階段兩部分組成,這兩個階段會對資料排序

2.Map Task會在本地磁盤輸出一個按照key排序(采用的是快速排序)的檔案(中間可能産生多個檔案,但最終會合并成一個)

3.在Reduce階段,每個Reduce Task會對收到的資料排序,這樣,資料便按照key分成了若幹組,之後以組為機關交給reduce()處理

4.map階段的提前合并是為了減輕reduce 的壓力

mapreduce的調優

調優三原則 :

1.增大作業并行程度

2.給每個任務足夠的資源

3.在滿足前兩個的條件下,盡可能地給shuffle預留資源

MapJoin的原理

https://blog.csdn.net/u010010664/article/details/79731044

mapreduce的shuffle工作原理:

https://blog.csdn.net/youngflycode/article/details/82349680

MongoDB和Redis差別

1.MongODB更類似Mysq,支援字段索引、遊标操作,其優勢在于查詢功能比較強大,擅長查詢]SON資料,能存儲海量資料,但是不支援事務。

Mysql在大資料量時效率顯著下降, MongoDB更多時候作為關系資料庫的一種替代

2.記憶體管理機制

Redis資料全部存在記憶體,定期寫入磁盤,當記憶體不夠時,可以選擇指定的LRU算法删除資料。

MongoDB資料存在記憶體,由inux系統mmap實作,當記憶體不夠時,隻将熱點資料放入記憶體,其他資料存在磁盤

3.支援的資料結構

Redis支援的資料結構豐富,包括hash、set、list等

MongoDB資料結構比較單一,但是支援豐富的資料表達,索引,最類似關系型資料庫,支援的查詢語言非常豐富

mysql的索引失效的場景

1.當語句中帶有or的時候 即使有索引也會失效

select * from USER where name=‘xzz’ or age=16; name 為索引

2.語句索引 like 帶%的時候索引失效(注意:如果上句為 like‘xzz’此時索引是生效的)

select * from USER where name like‘%xzz’ ;

3.如果列類型是字元串,那一定要在條件中将資料使用引号引用起來,否則不使用索引

4.假如上述将name和age設定為聯合索引,一定要注意順序,mysql聯合是以有最左原則,下面以name,age的順序講下

(1)select * from USER where name=‘xzz’ and age =11;

(2)select * from USER where age=11 and name=‘xzz’;

例如上訴兩種情況:以name,age順序為聯合索引,(1)索引是生效的,(2)索引是失效的

5.比如age為索引:select * from USER where age-1>11;

例如這種情況:索引失效,不要在索引上進行操作,否則索引會失效(是有類似時間轉換的問題和上訴問題一樣)

mysql 的存儲過程?

SQL語句需要先編譯然後執行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後存儲在資料庫中,

使用者通過指定存儲過程的名字并給定參數(如果該存儲過程帶有參數)來調用執行它

mysql索引的原理?

B-Tree和B+Tree

mysql存儲引擎?

1.InnoDB(預設)(支援事務)

2.MyISAM(不支援事務)

3.MEMORY

4.MERGE

MySQL的事務?

1.事務是一個最小的不可再分的工作單元

2.事務的特性

A.原子性

B.一緻性

C.隔離性

D.持久性

N1

mysql/oracle中有的話就更新沒有的話就插入?

1.mysql

INSERT INTO tableName (_id,password) VALUES (‘1’,‘多條插入1’)

ON DUPLICATE KEY UPDATE

password = VALUES(password);

2.oracle

merge into

npm 的介紹?

https://www.npmjs.cn/

你這邊還有什麼問題?

1.貴公司大資料崗位人員怎麼配置設定的 2.咱們公司現在大資料情況、 3.公司用的什麼架構

O1

sort by 和order by的差別

order by 是全局排序 sort by 局部排序 整體無序

OLAP什麼是OLTP(說一下他們思想)?

P1

Presto的優化?

1)合理設定分區

與Hive類似,Presto會根據元資訊讀取分區資料,合理的分區能減少Presto資料讀取量,提升查詢性能。

2)使用列式存儲

Presto對ORC檔案讀取做了特定優化,是以在Hive中建立Presto使用的表時,建議采用ORC格式存儲。相對于Parquet,Presto對ORC支援更好。

3)使用壓縮

資料壓縮可以減少節點間資料傳輸對IO帶寬壓力,對于即席查詢需要快速解壓,建議采用Snappy壓縮。

4)預先排序

對于已經排序的資料,在查詢的資料過濾階段,ORC格式支援跳過讀取不必要的資料。比如對于經常需要過濾的字段可以預先排序。

INSERT INTO table nation_orc partition§ SELECT * FROM nation SORT BY n_name;

如果需要過濾n_name字段,則性能将提升。

SELECT count(*) FROM nation_orc WHERE n_name=’AUSTRALIA’;

爬蟲技術介紹

1.爬蟲的目的是從網際網路上擷取對業務有價值的資訊

2.爬蟲的流程是:從一個或者是若幹個url開始,在抓取網頁内容的過程中,不斷的從目前的頁面抽取新的url,然後一直打到某一個條件的時候停止(如指定爬取深度)

3.一個完整的爬蟲系統包含三個子產品:網絡請求子產品,爬取流程控制子產品,内容分析提取子產品

4.順手語言:python

5.現有爬蟲工具:八爪魚,集搜客,queryList,

6.工程師必備工具:Chrome(谷歌浏覽器),Charles:Chrome對應 隻不過是分析APP的,cUrl:分析反爬蟲的工具,Postman:url測試工具,Online JavaScript Beautifier:格式化js,Sketch:設計爬蟲結構

Q1

全鍊路(談談你認為的資料全鍊路)?

清洗(資料)的規則怎麼制定的?

1.1 非空校核

要求字段為非空的情況下,對該字段資料進行校核。如果資料為空,需要進行相應處理。

1.2 重複校核

多個業務系統中同類資料經過清洗後,在統一儲存時,為保證主鍵唯一性,需進行校核工作。

1.3 異常值校核

包括取值錯誤、格式錯誤、邏輯錯誤、資料不一緻等,需根據具體情況進行校核及修正。

1.4 無用值校核

目前業務中不需要使用到的、無價值的資料字段,需要進行校核及去除。

二、 具體規則

2.1缺失值清洗

2.1.1确定缺失值範圍:按照缺失比例和字段重要性,分别制定政策:

(a) 重要性高,缺失率低:通過計算進行填充;通過經驗或業務知識估計;

(b) 重要性高,缺失率高:嘗試從其他管道取數補全;使用其他字段通過計算擷取;

© 重要性低,缺失率低:不做處理或簡單填充;

(d) 重要性低,缺失率高:去掉該字段。

2.1.2填充缺失内容,某些缺失值可以進行填充,方法有以下三種:

(a) 以業務知識或經驗推測填充缺失值;

(b) 從其他業務系統資料中取數補全;

© 以同一名額的計算結果(均值、中位數、衆數等)填充缺失值;

(d) 以不同名額的計算結果填充缺失值。

2.2重複值清洗

重複資料可以進行去重或者進行标記。

2.3 異常值清洗

2.3.1 取值錯誤清洗:

(a) 範圍錯誤:可以通過添加限制的方式過濾掉指定字段數值超出範圍的資料。

(b) 位數錯誤:可以通過其他業務系統資料進行更改。

2.3.2 格式錯誤清洗:格式内容問題主要有以下幾類:

(a) 時間、日期、數值、全半角等顯示格式不一緻:在整合多來源資料時也有可能遇到,将其處理成一緻的某種格式即可;

(b) 内容中有不該存在的字元:某些内容可能隻包括一部分字元,比如身份證号是數字+字母,中國人姓名是漢字。最典型的就是頭、尾、中間的空格,也可能出現姓名中存在數字元号、身份證号中出現漢字等問題。這種情況下,需要以半自動校驗半人工方式來找出可能存在的問題,并去除不需要的字元;

© 内容與該字段應有内容不符:某些字段内容應該是數值,而實際資料中字段的内容卻是字元串。這種情況可以采用類型轉換來處理。

2.3.3邏輯錯誤清洗,主要包含以下幾個步驟:

(a) 去除/替換不合理值;

(b) 修正沖突内容。

2.4.無用資料清洗

無用資料字段可以直接進行删除。但在進行該過程的時候,要注意備份原始資料

R1

Repartition和Coalesce關系與差別?

1)關系:

兩者都是用來改變RDD的partition數量的,repartition底層調用的就是coalesce方法:coalesce(numPartitions, shuffle = true)

2)差別:

repartition一定會發生shuffle,coalesce根據傳入的參數來判斷是否發生shuffle

一般情況下增大rdd的partition數量使用repartition,減少partition數量時使用coalesce

redis持久化?

1.RDB 指定的時間間隔内儲存資料快照

2.AOF 先把指令追加到記錄檔的尾部,儲存所有的曆史操作

redis沒有持久化,記憶體滿了,插入資料會怎麼樣? 解決辦法

1.會根據配置的記憶體淘汰政策,淘汰相應的消息

解決辦法有三種:

1.增加記憶體

2.使用記憶體淘汰政策(maxmemory-policy) 其中預設的是:其預設值是noeviction。

具體規則如下:

volatile-lru 使用LRU算法删除一個鍵(隻對設定了生存時間的鍵)

allkeys-lru 使用LRU算法删除一個鍵

volatile-random 随機删除一個鍵(隻對設定了生存時間的鍵)

allkeys-random 随機删除一個鍵

volatile-ttl 删除生存時間最近的一個鍵

noeviction 不删除鍵,隻傳回錯誤

3.叢集管理redis cluster

redis的五種資料類型?

set

string

zset

hash

list

redis的key是怎麼設計?

Reids 為什麼快(效率高)?

1、完全基于記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似于HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O

2、資料結構簡單,對資料操作也簡單,Redis中的資料結構是專門進行設計的;

3、采用單線程,避免了不必要的上下文切換和競争條件,也不存在多程序或者多線程導緻的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導緻的性能消耗;

4、使用多路I/O複用模型,非阻塞IO;

5、使用底層模型不同,它們之間底層實作方式以及與用戶端之間通信的應用協定不一樣,Redis直接自己建構了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求;

Redis的哨兵模式?

1.哨兵是一個獨立的程序,作為程序,它會獨立運作。其原理是哨兵通過發送指令,等待Redis伺服器響應,進而監控運作的多個Redis執行個體。

當發現主的不行的時候就slave 變成Master

RDD中map 操作一個變多行

使用ListBuffer()承接,然後使用flatMap操作

Rdd和DataFrame和dataset 的差別

1)RDD

優點:

編譯時類型安全

編譯時就能檢查出類型錯誤

面向對象的程式設計風格

直接通過類名點的方式來操作資料

缺點:

序列化和反序列化的性能開銷

無論是叢集間的通信, 還是IO操作都需要對對象的結構和資料進行序列化和反序列化。

GC的性能開銷,頻繁的建立和銷毀對象, 勢必會增加GC

2)DataFrame

DataFrame引入了schema和off-heap

schema : RDD每一行的資料, 結構都是一樣的,這個結構就存儲在schema中。 Spark通過schema就能夠讀懂資料, 是以在通信和IO時就隻需要序列化和反序列化資料, 而結構的部分就可以省略了。

3)DataSet

DataSet結合了RDD和DataFrame的優點,并帶來的一個新的概念Encoder。

當序列化資料時,Encoder産生位元組碼與off-heap進行互動,能夠達到按需通路資料的效果,而不用反序列化整個對象。Spark還沒有提供自定義Encoder的API,但是未來會加入。

RDD的特性(五大特性)?

1.可分區

2.函數作用在所有的分區

3.血緣關系 rdd 之間有互相依賴的關系

4.可以按照k v 存儲

5.每一個分片計算時都要遵循資料本地性原則。(計算和存儲最好在同一個節點

RDD中map 操作多行變一行

groupby + reduce

S1

RPC協定(談談你對rpc 協定的了解)?

1、RPC是一種API,HTTP是一種無狀态的網絡協定。RPC可以基于HTTP協定實作,也可以直接在TCP協定上實作。

2、RPC主要是用在大型網站裡面,因為大型網站裡面系統繁多,業務線複雜,而且效率優勢非常重要的一塊,這個時候RPC的優勢就比較明顯了。

HTTP主要是用在中小型企業裡面,業務線沒那麼繁多的情況下

scala的隐式轉換?

(1)隐式轉換就是:當Scala編譯器進行類型比對時,如果找不到合适的候選,那麼隐式轉化提供了另外一種途 徑來告訴編譯器如何将目前的類型轉換成預期類型。

(2)隐式轉換兩種定義方法:舊的定義方法指是的“implict def”形式,這是Scala 2.10版本之前的寫法,

在Scala 2.10版本之後,Scala推出了“隐式類”用來替換舊的隐式轉換文法,“隐式類”是一種更加安全的方式,對 被轉換的類型來說,它的作用域更加清晰可控。

(3)隐式轉換有四種常見的使用場景:

a.将某一類型轉換成預期類型

b.類型增強與擴充

c.模拟新的文法

d.類型類

設計模式?

工廠模式、原型模式、單例模式、代理模式

1.工廠模式主要解決了接口選擇的問題,讓其子類去繼承接口,不會透露出邏輯

2.原型模式需要實作Cloneable接口 可以快速複制已有的執行個體

3.單例模式保證一個類僅有一個執行個體,并提供一個通路它的全局通路點。

代理模式為其他對象提供一種代理以控制對這個對象的通路。

Shell 的是使用?

cut:在檔案中剪切内容使用

sed:是一個流處理器,一次處理一行資料

awk: 強大的文本分析工具

sort:将檔案進行排序,并将排序結果标準輸出

資料中台?資料中台和資料倉庫的差別?

項目中資料品質的監控問題?

(門檻值,空值,重複資料。。。)

資料庫存儲(公司主要的資料庫)?

oracle(mysql)/redis/mongodb sqlServer / hbase kudu / es

spark 自定義任務監控?

1.rest api

http://spark.apache.org/docs/latest/monitoring.html#rest-api

sparkstream和struct Streaming的差別

struct Streaming 新特性

spark的shuffle的原理(流程)?

Spark視窗函數注意事項?

1.整個 SparkStreaming每個批次的時間間隔假設為N秒

2.通過建構 Streaming Context對象設定 Streaming Context(sc, Seconds(N)

3.設定開窗函數參數第一個時間為視窗長度第二個參數為窗體滑動間隔

reduce BykeyAndWindow((a: Int, b: Int)=>a+b, Seconds(2N), Seconds(2N))

需要注意的是

1.窗體滑動時間和長度要為每個批次的整數倍避免資源浪費

2.視窗長度應該與滑動時間相同,若是視窗長度大于滑動時間資料會被重複讀取反之會丢失資料

spark如何自定義累加器?

1.spark 兩個版本有差别

2.在2.0中使用自定義累加器需要繼承AccumulatorV2這個抽象類,同時必須對以下6個方法進行實作:

1.reset 方法: 将累加器進行重置;

abstract defreset(): Unit

Resets this accumulator, which is zero value.

2.add 方法: 向累加器中添加另一個值;

abstract defadd(v: IN): Unit

3.merge方法: 合并另一個類型相同的累加器;

abstract defmerge(other: AccumulatorV2[IN, OUT]): Unit

Merges another same-type accumulator into this one and update its state, i.e.

4.value 取值

abstract defvalue: OUT

Defines the current value of this accumulator

5.複制:Creates a new copy of this accumulator.

abstract defcopy(): AccumulatorV2[IN, OUT]

abstract defisZero: Boolean

Returns if this accumulator is zero value or not

spark的共享變量?

1.廣播變量

A.廣播變量緩存到各個節點的記憶體中,而不是每個Task

B.廣播變量被建立後,能在叢集中運作的任何函數調用

C.廣播變量是隻讀的,不能在被廣播後修改

D.對于大資料集的廣播, Spark嘗試使用高效的廣播算法來降低通信成本

val broadcaster= sc. broad cast(Aray(1,2,3)方法參數中是要廣播的變量

2.累加器

A.累加器隻支援加法操作,可以高效地并行,用于實作計數器和變量求和。 Spark原生支援數值類型和标準可變集合的計數器,但使用者可以添加新的類型。隻有驅動程式才能擷取累加器的值

spark的進階算子?

Spark常用的算子?

1.action 算子

reduce,collect,first,take,aggregate,countByKey,foreach,saveAsTextFile

2.transformation算子

map mapPartition reduceByKey,aggregateByKey,combineByKey,join,cogroup,glom,union,fliter

3.設計到shuffle的算子

reduceBykey:

groupByKey:

…ByKey:

spark程式運作原理(流程)?

簡單版:

1、Spark通過SparkContext向Cluster manager(資料總管)申請所需執行的資源(cpu、記憶體等)

2、Cluster manager配置設定應用程式執行需要的資源,在Worker節點上建立Executor

3、SparkContext 将程式代碼(jar包或者python檔案)和Task任務發送給Executor執行,并收集結果給Driver。

詳細版:

1.建構sparkApplication的運作環境 2.向資料總管注冊sparkContext 3.sparkContext 向資料總管申請運作executor 4.資料總管配置設定并啟動executor 5.executor 發送心跳到資料總管 6.SparkContext 建構有向無環圖,并劃分stage,stage中劃分具體的taskSet 7.将taskset 發送給taskSchedular 8.executor 向sparkContext 申請task 9.taskSchedular 将task 配置設定至executor同時spark context 将應用程式發送給executor 10.收集結果導driver端

spark 送出叢集的指令

spark-submit

–master local[5]

–driver-cores 2

–driver-memory 8g

–executor-cores 4

–num-executors 10

–executor-memory 8g

–class PackageName.ClassName XXXX.jar

–name “Spark Job Name”

InputPath

OutputPath

spark 相關的優化經驗?

  1. 采用高性能序列化類庫(kryo序列化機制)

    2.優化資料結構

    3.提高并行度

    4.廣播共享資料

    5.資料本地化

    6.shuffle性能優化(算子的選擇:比如reducebykey和groupbykey)

    7.盡量避免shuffle的過程

    A.使用廣播變量+fliter算子 替代 join

spark預設的序列化架構?

spark 預設的是java 的序列化,kyro 的性能java 的10多倍,Spark之是以沒有預設使用Kryo作為序列化類庫,是因為它不支援所有對象的序列化,同時Kryo需要使用者在使用前注冊需要序列化的類型,不夠友善

spark 的task not serializable 問題解決?

spark 如何處理不能被序列化的對象?

1.封裝成object 2.封裝成樣例類

sortshuffle的好處,為什麼bypass機制不需要排序?

1.産生更少的中間磁盤檔案,性能優于hashShuffle,尤其是下遊task的read操作

2.它有兩種機制:普通運作機制和byPass機制

Sql這塊的優化經驗:

1.大表join小表時,小表放在前面

2.用索引提高效率

3.盡量早過濾資料,減少每個階段的資料量

4.查詢分區表要加分區

5.盡量減少子查詢,使用關聯查詢(left join,right join,inner join)替代

6.使用表的别名(Alias):

7.用IN來替換OR

8.SELECT子句中避免使用 ‘ *’

9.建表的時候能使用數字類型的字段就使用數字類型,數字類型的字段作為條件查詢比字元串的快

那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的最末尾

SparkSql的執行過程?

SQL 文本

—> ANLTRV4解析器–>未解析的邏輯計劃

—> 分析器 -->解析後的邏輯計劃

—> 優化器 -->優化後的邏輯計劃

—> 轉換器 -->可執行的實體計劃

Spark的checkpoint的過程?什麼時候使用checkPoint?

checkpoint的使用很簡單

1、對于普通應用,首先要設定checkpoint目錄,使用SparkContext的setCheckpointDir設定,然後對具體的RDD資料集調用checkpoint方法即可。

2、對流處理應用(結構化流),寫出流時必須設定checkpoint,否則會報錯,未設定checkpoint目錄異常。用.option(“checkpointLocation”, “your checkpoint-pathname”)設定即可。

https://blog.csdn.net/weixin_43878293/article/details/90752738

spark2.X的記憶體管理模型?

1.spark的記憶體大緻分為兩種類型 一種是執行 一種是執行

執行記憶體是指用于用于shuffle、join、排序、聚合等計算的記憶體,而存儲記憶體是指用于在叢集中持久化和廣播内部資料的記憶體.在Spark中,執行記憶體和存儲記憶體共享一個統一的區域。當沒有使用執行記憶體時,存儲記憶體可以擷取所有可用記憶體,反之亦然。如有必要,執行記憶體可以占用存儲存儲,但僅限于總存儲記憶體使用量低于某個門檻值

雖然有兩種相關配置,但一般情況下不需要調整它們,因為預設值适用于大多數工作負載:

spark.memory.fraction預設大小為(JVM堆記憶體 - 300MB)的一小部分(預設值為0.6)。剩下的空間(40%)保留用于使用者資料結構,Spark中的内部中繼資料,以及在稀疏和異常大的記錄的情況下防止OOM錯誤。
    spark.memory.storageFraction預設大小為(JVM堆記憶體 - 300MB)*0.6*0.5。
           

spark sql 三種自定義函數的應用場景?實作步驟

spark有幾種部署方式?

1)本地模式

2) standalone模式

3) spark on yarn模式

A.yarn-client B.yarn-cluster

4) mesos模式

spark Streaming從哪看任務進行度 看task任務量 資料傾斜

1.通過4040端口界面 4041 4042

sparkstreaming拉取資料的時候有沒有遇到資料丢失

1.有

原因可能如下:

A.視窗時間設定不合理

B.oom 導緻資料的溢出

C.kafka offset丢失導緻資料丢失

spark streaming 幾個重要參數

spark.streaming.backpressure.enabled 開啟反壓機制

spark.streaming.blockInterval 每一批的間隔

spark.streaming.recevier.maxRate 接受的最大速率

spark.streaming.recevier.writeAheadLog.enabled 開啟WL

spark.streaming.stopGracefullyOnShutdown 優雅關閉

spark.streaming.kafka.maxRatePerPartition 直連最大速率

SpringBoot了解多少?

SpringBoot解決的問題

1、使編碼變得簡單

2、使配置變得簡單

3、使部署變得簡單

4、使監控變得簡單

springboot的核心功能

1、獨立運作spring項目。springboot可以以jar包的形式進行獨立運作,使用java -jar xx.jar 就可以成功運作項目。

2、内嵌servlet容器。内嵌容器,使得我們可以執行運作項目的主程式main函數,使得項目可以快速運作。

3、提供starter簡化Maven配置。springboot提供了一系列的start pol用來簡化maven依賴。如:常用的spring-boot-starter-web、spring-boot-starter-tomcat、spring-boot-starter-actuator等

4、自動配置spring。springboot會根據我們項目中類路徑的jar包,為jar包的類進行自動裝配bean。

5、應用監控。springboot提供了基于HTTP、ssh、telnet對運作時的項目進行監控。

Sql的執行順序?

1.寫的順序:select … from… where… group by… having… order by… limit [offset,]

(rows)

2.執行順序:from… where…group by… having… select … order by… limit

Sqoop資料導出Parquet?

hdfs資料用Sqoop往MySql中導入資料的時候,如果是Parquet不能導入,需轉化成text格式才行

Sqoop導入導出Null存儲一緻性問題?

Hive中的Null在底層是以“\N”來存儲,而MySQL中的Null在底層就是Null,為了保證資料兩端的一緻性。在導出資料時采用–input-null-string和–input-null-non-string兩個參數。導入資料時采用–null-string和–null-non-string。

sqoop适用于那些場景?

1.hive 和關系型資料之間的同步

sqoop導入導出 給4m,說一下他的工作原理? 4m 的情況下 如何保證資料一緻性

1.Sqoop導入底層工作原理

(1)在導入前,Sqoop使用JDBC來檢查将要導入的資料表。

(2)Sqoop檢索出表中所有的列以及列的SQL資料類型。

(3)把這些SQL類型的映射到java資料類型,例如(VARCHAR、INTEGER)———>(String,Integer)。

(4)在MapReduce應用中将使用這些對應的java類型來儲存字段的值。

(5)Sqoop的代碼生成器使用這些資訊來建立對應表的類,用于儲存從表中抽取的記錄。

注意:對于導入來說,更關鍵的是DBWritable接口的序列化方法,這些方法能使(生成的類)和JDBC進行互動。

2.Sqoop導出底層工作原理

(1)在導出前,sqoop會根據資料庫連接配接字元串來選擇一個導出方法 ————>對于大部分系統來說,sqoop會選擇JDBC。

(2)Sqoop會根據目标表的定義生成一個java類。

(3)這個生成的類能夠從文本中解析出記錄,并能夠向表中插入類型合适的值(除了能夠讀取ResultSet中的列)。

(4)然後啟動一個MapReduce作業,從HDFS中讀取源資料檔案。

(5)使用生成的類解析出記錄,并且執行標明的導出方法。

sqoop常用的參數?

https://blog.csdn.net/qq_41610418/article/details/81713319

Sqoop導入是否可以斷點續傳?

1.可以 類似于增量導入

2.增量資料導入分兩種,一是基于遞增列的增量資料導入(Append方式)。二是基于時間列的增量資料導入(LastModified方式)

Sqoop 如何将兩張mysql 表導入到一張hive 表中?

1.存在覆寫的問題 2.可以在mysql中提前合并

sqoop傳遞資料時最終結果會比原資料量多十幾條資料,怎麼解決?

1.value中特殊符号引起字段的資料增多或者減少,解決辦法是,導入hive時使用 --hive-drop-import-delims 指令去掉特殊符号 如:\n,\r,\001

Sqoop導資料效率?

1.适當增加m 的參數

補充:

-m N :開啟N個map來導入資料

–query : 從查詢結果導入資料,注意,如果使用了該參數,那麼必須指定–target-dir參數,并且查詢條件中要包含$CONDITIONS

–target-dir :指定資料在HDFS中的存放目錄

–hive-table :導入到hive的目标表名

–fetch-size :一次從資料庫中讀取的記錄數

-null-string :對于string類型的字段,如果值為null,那麼使用替代

–non-null-string :對于非string類型的字段,如果值為null,那麼使用替代

S手寫代碼:冒泡排序,快速排序,歸并排序,二叉樹,斐波那契,以及排序算法的複雜度?

String buffer和String build差別

1、StringBuffer 與 StringBuilder 中的方法和功能完全是等價的,

2、隻是StringBuffer 中的方法大都采用了 synchronized 關鍵字進行修飾,是以是線程安全的,而 StringBuilder 沒有這個修飾,可以被認為是線程不安全的。

3、在單線程程式下,StringBuilder效率更快,因為它不需要加鎖,不具備多線程安全而StringBuffer則每次都需要判斷鎖,效率相對更低

實時數倉的了解?

https://blog.csdn.net/weixin_44904816/article/details/104285711

實時數倉和離線數倉的差異?

1.業務場景

2.架構選型

離線:hive+hdfs

實時:Druid impala clickhouse es

3.

T1

TreeSet和HashSet差別?

HashSet是采用hash表來實作的。其中的元素沒有按順序排列,add()、remove()以及contains()等方法都是複雜度為O(1)的方法。

TreeSet是采用樹結構實作(紅黑樹算法)。元素是按順序進行排列,但是add()、remove()以及contains()等方法都是複雜度為O(log (n))的方法。它還提供了一些方法來處理排序的set,如first(), last(), headSet(), tailSet()等等。

TaskSetManager 的 Locality Levels 分為以下五個級别

https://www.cnblogs.com/jxhd1/p/6702224.html?utm_source=itdadao&utm_medium=referral

吞吐量(各個元件的吞吐量)?

1.sparkStreaming中100個節點(每節點4個core),數秒延遲可處理6GB/s的shujuliang 。吞吐量是storm的2~5倍。

2.kafka

10個broker 每秒百萬級别

3.flume

5.flink

TEZ查詢引擎你們用過嘛,特點

Tez引擎優點?

Tez可以将多個有依賴的作業轉換為一個作業,這樣隻需寫一次HDFS,且中間節點較少,進而大大提升作業的計算性能。

W1

次元模組化(詳細說一下次元模組化)/實體模組化/範式模組化?

https://dantezhao.gitbooks.io/data-warehouse-in-action/content/di-san-zhang-xiang-jie-wei-du-jian-mo.html

X1

系統更新優化(系統更新優化)?

A.是這樣的,我們的大部分結果資料還是存在hbase中,但是hbase的查詢響應速度滿足不了我們的業務需求,我們這樣改進把我們最近3個月的資料存儲在ES中,也就是Hbase結合ES使用

B.我們向Hbase資料庫寫入資料的時候遇到了熱點問題,我是提出了預分區和重新設計rowkey的方案 很好的解決了我們的問題

你是怎麼預分區的

1)拼接區号 設定兩位 00-99,把區号拼接在rowkey前面

2)建立表的時候調用 createTable(HTableDescriptor var1, byte[][] va2)

C. 對hbase的優化,第一加入布隆過濾器,資料資料格式的壓縮,減少存儲空間等

Y1

Yarn的記憶體和CPU怎麼配置設定 ?

https://www.cnblogs.com/wwcom123/p/10561806.html

https://blog.csdn.net/qq_43688472/article/details/92796141

Hadoop Yarn 的三種資源排程器?

1.FIFO排程器(FIFO Scheduler )

先進先出,但不适合資源公平性

2.容量排程器(Capacity Scheduler)

獨立的專門隊列保證小作業也可以送出後就啟動,隊列容量是專門保留的

以整個叢集的使用率為代價,與FIFO比,大作業執行的時間要長

3.公平排程器(FairS cheduler)

不需要預留資源,排程器可以在運作的作業之間動态平衡資源,大作業啟動時,因為是唯一運作的,是以獲得叢集的所有資源,之後小作業啟動時,被配置設定到叢集的一半的資源,這樣每個作業都能公平共享資源

yarn兩種運作模式的差別?

1.yarn-client和yarn-cluster

2.差別:

SparkContext初始化不同,這也導緻了Driver所在位置的不同,YarnCluster的Driver是在叢集的某一台NM上,但是Yarn-Client就是在RM在機器上;

(2)而Driver會和Executors進行通信,這也導緻了Yarn_cluster在送出App之後可以關閉Client,而Yarn-Client不可以;

(3)最後再來說應用場景,Yarn-Cluster适合生産環境,Yarn-Client适合互動和調試

yarn出現的原因?

yarn調優

yarn的資源表示模型Container,Container将資源抽象為兩個次元,記憶體和虛拟CPU核(vcore)

  1. 選擇正确的排程器(FIFO Fair Caption)
  2. 動态配置設定資源,減少資源浪費

中繼資料管理?

1.用一張oracle的表記錄了我們所有的中繼資料資訊

2.apache

移動計算比移動資料更容易?

隐式轉換(scala)的應用場景

1.用于從一種類型到另一種類型的轉換(批量轉換)

2.用于缺少參數方法的調用(隐式參數)

3.豐富類的功能

源碼檢視(你都看過哪些源碼)?

1.看過mr的map個數和reduce個數源碼

2.case class 的源碼

3.kafka的底層源碼

4.spark 底層通信的源碼 actor模型

5.cache和persist的源碼講解

zookeeper的四種類型的節點?

Z1

z自我介紹?

Zookeeper的假死 和腦裂?

1.假死是心跳機制的誤判leader死亡 重新選舉leader 造成腦裂

2.腦裂是因為假死 會有兩個leader

Zookeeper zab協定?

1.ZAB協定是為分布式協調服務Zookeeper專門設計的一種支援崩潰恢複的原子廣播協定。

2.ZAB協定包括兩種基本的模式:崩潰恢複和消息廣播。

當整個zookeeper叢集剛剛啟動或者Leader伺服器當機、重新開機或者網絡故障導緻不存在過半的伺服器與Leader伺服器保持正常通信時,所有程序(伺服器)進入崩潰恢複模式,首先選舉産生新的Leader伺服器,然後叢集中Follower伺服器開始與新的Leader伺服器進行資料同步,當叢集中超過半數機器與該Leader伺服器完成資料同步之後,退出恢複模式進入消息廣播模式,Leader伺服器開始接收用戶端的事務請求生成事物提案來進行事務請求處理。

ZK節點當機如何處理?

Zookeeper本身也是叢集,推薦配置不少于3個伺服器。Zookeeper自身也要保證當一個節點當機時,其他節點會繼續提供服務。

如果是一個Follower當機,還有2台伺服器提供通路,因為Zookeeper上的資料是有多個副本的,資料并不會丢失;

如果是一個Leader當機,Zookeeper會選舉出新的Leader。

ZK叢集的機制是隻要超過半數的節點正常,叢集就能正常提供服務。隻有在ZK節點挂得太多,隻剩一半或不到一半節點能工作,叢集才失效。

是以

3個節點的cluster可以挂掉1個節點(leader可以得到2票>1.5)

2個節點的cluster就不能挂掉任何1個節點了(leader可以得到1票<=1)

zookeeper的選舉機制?

zookeeper 提供三種選舉機制

A.LeaderElection

B.AuthFastLeaderElection

C.FastLeaderElection (最新預設)

選舉流程簡述:

目前有5台伺服器,每台伺服器均沒有資料,它們的編号分别是1,2,3,4,5,按編号依次啟動,它們的選擇舉過程如下:

伺服器1啟動,給自己投票,然後發投票資訊,由于其它機器還沒有啟動是以它收不到回報資訊,伺服器1的狀态一直屬于Looking(選舉狀态)。

伺服器2啟動,給自己投票,同時與之前啟動的伺服器1交換結果,由于伺服器2的編号大是以伺服器2勝出,但此時投票數沒有大于半數,是以兩個伺服器的狀态依然是LOOKING。

伺服器3啟動,給自己投票,同時與之前啟動的伺服器1,2交換資訊,由于伺服器3的編号最大是以伺服器3勝出,此時投票數正好大于半數,是以伺服器3成為上司者,伺服器1,2成為小弟。

伺服器4啟動,給自己投票,同時與之前啟動的伺服器1,2,3交換資訊,盡管伺服器4的編号大,但之前伺服器3已經勝出,是以伺服器4隻能成為小弟。

伺服器5啟動,後面的邏輯同伺服器4成為小弟。

Zookeeper怎麼保證消息一緻性的

zab 協定 消息同步機制 Zab協定有兩種模式,它們分别是恢複模式和廣播模式

A2

安全行業數倉和分析統計業務:

1.人物畫像(一張寬表(A.B.C.D.買車等級(汽車模型),是否是孕婦(孕婦模型)))…

2.要素抽取:人員基本表 交通資訊表 … ==>要素表

3.關系圖譜:根據我們現有的資訊,分析人物之間關系

4.話單分析:誰跟誰通話 通話的時長和頻率(區域) 通話方式

5.模型挖掘:同戶分析(戶号) 同行分析(規則) 通聯分析(電話/微信/qq)

6.重點人物分析:社交度 影響力 涉恐度

B2

部門的人員組成和分工?

小型公司(3人左右):組長1人,剩餘組員無明确分工,并且可能兼顧javaEE和前端。

中小型公司(3~6人左右):組長1人,離線2人左右,實時1人左右(離線一般多于實時),JavaEE 1人(有或者沒有人單獨負責JavaEE,有時是有組員大資料和JavaEE一起做,或者大資料和前端一起做)。

中型公司(510人左右):組長1人,離線35人左右(離線處理、數倉),實時2人左右,JavaEE 1人左右(負責對接JavaEE業務),前端1人左右(有或者沒有人單獨負責前端)。

中大型公司(520人左右):組長1人,離線510人(離線處理、數倉),實時5人左右,JavaEE2人左右(負責對接JavaEE業務),前端1人(有或者沒有人單獨負責前端)。(發展比較良好的中大型公司可能大資料部門已經細化拆分,分成多個大資料組,分别負責不同業務)

上面隻是參考配置,因為公司之間差異很大,例如ofo大資料部門隻有5個人左右,是以根據所選公司規模确定一個合理範圍,在面試前必須将這個人員配置考慮清楚,回答時要非常确定。

C2

null

null

D2

對我們公司有什麼期待嗎

1.盡快上班 2.晉升規則 3.能在公司長久發展 提升自身實力 4.接觸更多地業務

打算在我們公司待幾年

1.長久發展 2.

代碼送出(實戰當中寫完代碼的流程 如何送出)?那個工具?

svn

電商行業數倉和分析統計業務:

1.你們的資料是通過什麼方式收集的?簡單談談

2.收集的原始資料是什麼格式的?舉例子

3.你們數倉怎麼分層?每一層存放的都是什麼資料?

4.活躍裝置數你們是怎麼計算的(你們的規則是什麼)?

5.每日新增裝置資料你們是怎麼計算的?

6.你們的留存使用者是怎麼定義的?留存率比例是怎麼計算的?

7.你們的沉默使用者是怎麼計算的?

8.你們的本周回流數目怎麼計算的?

9.你們的流失使用者是怎麼計算的?

10.你們的連續三周活躍使用者怎麼計算的?

11.最近七天内連續三天内的活躍使用者你們怎麼計算的?

16.你們資料模組化的時候,遵循哪些原則?

17.全量表、增量表、新增及變化表、拉連結清單?資料是怎麼同步?

18.GMV成交總額名額計算的規則?

19.你們的轉化率怎麼計算的?

20.你們的使用者新鮮度怎麼計算的?

20.你們的品牌複購率怎麼計算的?

電商行業實時業務名額:

A.實時統計每個分類被點選的次數

B.實時計算商品銷售額,成交量

C.實時統計網站動态行為pv,uv

D.實時展示客戶線上數量

https://blog.csdn.net/qq_22473611/article/details/88085050

E2

ES(es/redis/hbsae/hdfs/mysql存的是什麼資料)?

null

F2

房産行業

null

G2

公司的工作内容(說一下你公司的主要業務)?

1.自己做好準備 不至于尬場

H2

回流使用者的計算規則?

1.這次登陸距離上次登陸已經有三周的時間

亮點:這樣的名額隻是對我們的使用者做一個宏觀的把控,但是并不能起到實質性的作用(效果)

其實呀.,我們真正的精力應該放在如何降低(提高)這個名額

Hbase的查詢延遲?

1.3s作用(建立索引的前提下) 如果沒有索引 5s開外

Hsql:連續七天統計三天登入次數(手寫sql)

null

行業定位和案例

1.房屋租賃

二手房,新房 貝殼找房 我愛我家 鍊家 安居客 找房網 搜房網 蛋殼較高價的電梯大廈 麥田房産

2.車輛行業

易車網 太平洋汽車網 第一車網 淘車網 搜狐汽車 二手車之家 卡車之家 愛車網 滴滴出行 首汽約車 快拼車 神州專車 嘀嗒拼車

3.電商行業

惠客商城 貝貝母嬰 母嬰之家 媽樂購 優購網 卷皮網 易迅網 返利網 一淘網 易購網 當當網 唯品會 蘇甯易購 牛摩網

4.新聞/資訊/娛樂/視訊/廣告

直播吧 九秀網 鬥魚TV 新浪體育 虎牙直播 央視網 搜狐體育 球探網 虎撲體育 黑夜影視 小窩電影院 抖音 快手 火山 戰旗TV 優酷網 一點資訊 網易新聞 知乎日報 讀讀日報 頭條

5.遊戲行業

騰訊手遊 愛遊戲 立即玩 4399小遊戲 遊戲盒子 逗遊 樂玩遊戲 沃遊戲 360手遊 網易遊戲

6.旅遊/遊樂/酒店行業

攜程 撿人網 窮遊網 途牛旅遊 旅媽媽 美團 約伴旅遊網 樂途 藝龍旅行網 北京旅行網 同程

芒果網

7.物流行業

中鐵快運 速易遞 閃送 全峰快遞 國通快遞 立通快遞 佳吉快運 華宇物流 百世彙通 妙優車

8.電信業務

移動 聯通 電信 手機靓号網 好号網 号碼網 搶卡網 挑卡網 找号網 曬号網 卡号網

9.“智慧領域”

高德地圖 百度地圖 智慧交通 智慧物流 智慧校園 智慧能源 車聯網系統 智慧醫療

J2

交通行業

http://www.raincent.com/content-10-12364-1.html

加班(咱們公司會有加班 你感覺可以嗎?)

1.可以 沒問題

教育日志分析報表系統

1.使用者分析

2.課程分析

3.資源分析

4.精品分析

K2

空白字段怎麼操作?

1.過濾掉

2.數值類型:取平均數或者中位數

3.字元類型:就近原則

L2

留存率是怎麼計算?

流程圖(畫出你項目的流程圖,并講解)?

Q2

企業合作(項目都和那些企業合作)?

清洗(資料)的規則怎麼制定的?

R2

熱力圖的資料劃分?基于熱力圖的資料對客流的走向判斷?

1.熱力圖是利用擷取的手機基站定位該區域的使用者數量,通過使用者數量渲染地圖顔色

例如:百度慧眼

http://www.360doc.com/content/19/0512/14/276037_835190545.shtml

日志拉去使用幾台伺服器(flume幾台,kafka幾台)?

S2

資料量(你每天資料量多大,總共資料量多大,每天增量多少)?

1.100萬的日活 差不多每天産生80G

2.資料總量 50T 左右

實時數倉的應用場景:

https://blog.csdn.net/weixin_44904816/article/details/104285711

事實表(具體說出兩種事實表都有哪些)

資料流程(手繪項目的資料流程圖)?

T2

調試(打jar包的方式,有沒有在編譯器打斷點,然後上傳到叢集,如何實作連調?

脫敏(資料脫敏)怎麼做?

資料脫敏是指對某些敏感資訊通過脫敏規則進行資料的變形,實作敏感隐私資料的可靠保護

圖書綜合管理系統

1.圖書管理

2.使用者分析

3.廣告推廣

4.客戶分析

5.精準推薦

6.物流管理

推薦系統(電商)

例如:有貨網商品多元度個性分析推薦系統

針對網站使用者以及商品進行分析,分析出多元度的資訊使用算法來分析使用者的喜好,利用協同過濾來分析使用者行為,商家可以利用電子商務網站向客戶提供商品資訊和建議,幫助使用者決定應該購買什麼産品,模拟銷售人員幫助客戶完成購買過程。根據使用者的興趣特點和購買行為,向使用者推薦使用者感興趣的資訊和商品。

W2

物流行業

1.

2.

3.

4.

為什麼從上一家離職?

1.合同到期 2.沒有晉升空間 3.疫情裁員

為什麼來北京?

1.尋找更好的發展機遇多,提升快 2.北京距離家近 3.

次元表(具體說說你們的次元表)?

X2

項目周期問題(多長)?

1.半年左右

2.知識擴充:https://cj.sina.com.cn/articles/view/1720289731/668989c301900n0c6?from=finance

項目需求誰去對接?

産品

項目每個環節遇到的問題?

新的環境中能給自己帶來什麼

薪資組成?

底薪+KPI+獎金

新聞/資訊/娛樂/視訊/廣告 行業

使用者畫像系統

https://www.sensorsdata.cn/product/userTag.html?utm_source=360sem&utm_medium=cpc&utm_term=%E7%94%A8%E6%88%B7%E7%94%BB%E5%83%8F&utm_content=%E7%94%BB%E5%83%8F%5F%E5%90%8D%E8%AF%8D%5F%E7%94%BB%E5%83%8F&utm_campaign=%E4%BA%A7%E5%93%81%2D%E7%A5%9E%E7%AD%96%E7%94%A8%E6%88%B7%E7%94%BB%E5%83%8F%5FN

Z2

主題(資料分析的時候都是以什麼為主)?

1.使用者消費

2.使用者活躍

3.使用者流失

4.使用者年齡/區域

資源配置設定問題(大家一起送出,資源怎麼管理)

1.分時段 跑任務 錯開高峰

2.流處理按比例配置設定資源10%

繼續閱讀