大數據面試題(二)

基礎html

一、 hashmap的初始值大小---16java

二、 ArrayList的初始值大小---10node

三、 hashmap的排序問題程序員

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("d", 2);
map.put("c", 1);
map.put("b", 1);
map.put("a", 3);

List<Map.Entry<String, Integer>> infoIds =
    new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
//排序
Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {   
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {      
        //return (o2.getValue() - o1.getValue()); 
        return (o1.getKey()).toString().compareTo(o2.getKey());
    }
}); 

算法

四、 Java異常 多線程sql

java中廣義的異常是指Throwable接口,這個接口下有兩個實現類:ErrorExceptionError表示嚴重的錯誤,一旦產生,則不作處理或者重寫代碼;若是是Exception,分爲檢查異常和運行異常。檢查異常在出現時必須處理,或者拋出或者捕獲;運行異常在出現時能夠處理能夠不處理。shell

多線程是指一個進程中多個邏輯後者任務的執行,會產生安全問題,爲了解決這個問題,能夠利用同步代碼塊或者lock()方法數據庫

五、 Java Stringapache

String類是用final修飾的,所以不可被繼承,其中重寫了equalshashCode方法,所以調用equals方法時比較的是兩個字符串的值;String提供了比較多的構造方法,須要注意不一樣的構造方法所產生的對象的個數也不同。用+鏈接運算拼接字符串的時候,調用的是StringBuilder中的append方法編程

六、 string stringbuffer stringbuilder對比

這三個類都是final修飾的,都不能夠被繼承。String這個類是線程不安全的,其中的+鏈接運算用的是StringBuilder中的append方法,每一次的+都會產生一個新的StringBuilderconcat方法是將字符串轉化爲字符數組以後再進行合併,而後轉化爲字符串。StringBuilderStringBuffer中的方法幾乎一致,其不一樣之處在於StringBuilder是線程不安全的,StringBuffer是線程安全的。

七、 string常量池

常量池是在方法區中的,用於存儲計算機中的常量

八、 Finally   final

finally是異常中用於異常處理捕獲後的一些後續操做的關鍵字,final能夠用來修飾類、方法和屬性。修飾類這個類不能被繼承,修飾方法這個方法不能被重寫能夠被重載,final不能修飾抽象方法;修飾屬性這個屬性在被初始化以後就不能在被改變(對於基本類型的數據而言是值不可變,對於引用類型而言是地址不可改變)

九、 wait notify

這兩個方法都是設計在了Object類上,所以任何一個類產生的對象均可以調用這兩個方法。wait方法會使當前執行的對象轉入凍結狀態;notify方法使凍結的對象轉入活躍狀態

10. sleep

11gc垃圾回收原理

  GC的工做原理: 引用計數,標記複製

    "引用計數"是一種簡單但速度很慢的垃圾回收技術.全部對象都有一個引用計數器,當有引用鏈接時計數器加1,當引用離開做用域時或者被置於NULL時,計數器-1,垃圾回收器會在因此包含對象引用的列表上進行遍歷,當發現某個對象的引用計數爲0時,就釋放佔用的空間.

    "標記複製"的運行機制,垃圾回收器遍歷包含全部引用的列表,當發現存活的對象引用時作上標記,這樣當遍歷完全部對象引用並作上標記的時候,執行垃圾回收,將沒有標記的對象堆空間釋放.

12jvm內存管理機制

將內存空間劃分爲堆、JVM方法棧、方法區、本地方法棧、PC寄存器。

堆:堆用於存儲對象實例及數組值,能夠認爲Java中全部經過new建立的對象的內存都在此分配,Heap中對象所佔用的內存由GC進行回收,在32位操做系統上最大爲2GB,在64位操做系統上則沒有限制,其大小可經過-Xms-Xmx來控制,-XmsJVM啓動時申請的最小Heap內存,默認爲物理內存的1/64但小於1GB-XmxJVM可申請的最大Heap內存,默認爲物理內存的1/4但小於1GB,默認當空餘堆內存小於40%時,JVM會增大Heap-Xmx指定的大小,可經過-XX:MinHeapFreeRatio=來指定這個比例;當空餘堆內存大於70%時,JVM會減少Heap的大小到-Xms指定的大小,可經過-XX:MaxHeapFreeRatio=來指定這個比例,對於運行系統而言,爲避免在運行時頻繁調整Heap 的大小,一般將-Xms-Xmx的值設成同樣。

    JVM方法棧:爲線程私有,其在內存分配上很是高效。當方法運行完畢時,其對應的棧幀所佔用的內存也會自動釋放。當JVM方法棧空間不足時,會拋出StackOverflowError的錯誤,在Sun JDK中能夠經過-Xss來指定其大小。

方法區:要加載的類的信息(名稱、修飾符等)、類中的靜態變量、類中定義爲final類型的常量、類中的Field信息、類中的方法信息。方法區域也是全局共享的,在必定條件下它也會被GC,當方法區域要使用的內存超過其容許的大小時,會拋出OutOfMemory的錯誤信息。在Sun JDK中這塊區域對應Permanet Generation,又稱爲持久代,默認最小值爲16MB,最大值爲64MB,可經過-XX:PermSize-XX:MaxPermSize來指定最小值和最大值。

本地方法棧:用於支持native方法的執行,存儲了每一個native方法調用的狀態。在Sun JDK的實現中,和JVM方法棧是同一個。

PC寄存器:佔用的可能爲CPU寄存器或操做系統內存。

13、多線程安全

多線程安全是經過synchronize代碼塊或者lock()方法進行控制來保障其安全性的,可是也有可能形成死鎖等爲題

14map的實現類有哪些

HashTableHashMapLinkedHashMapTreeMap

15hashmap存儲原理

HashMap 基於 hashing 原理,咱們經過 put ()get ()方法儲存和獲取對象。當咱們將鍵值對傳遞給 put ()方法時,它調用鍵對象的 hashCode ()方法來計算 hashcode,讓後找到 bucket 位置來儲存值對象。當獲取對象時,經過鍵對象的 equals ()方法找到正確的鍵值對,而後返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當發生碰撞了,對象將會儲存在 LinkedList 的下一個節點中。 HashMap 在每一個 LinkedList 節點中儲存鍵值對對象。

16抽象類和接口的做用

抽象類是將一些類中的共有屬性和方法進行抽取,其中一些共有方法因爲實現細節不同,所以以抽象方法的形式存在。接口更相似於一個標準,定義實現這個接口的實例中的方法,可是具體的實現細節不用這個接口來管理。

17java的反射

ClassMethodConstructorField這四個類是java實現反射的API。在一些場景下沒法直接經過new關鍵字來建立變量,例如配置文件中數據庫的配置,那麼這時候就須要用反射來完成相關的操做

18intInteger全部區別?

int是基本數據類型,其變量是存儲到佔內存中的,其上是沒有任何方法的。Integer是一個引用數據類型,是int的包裝類,其中含有大量的方法。

19StringStringBuffer的區別?

參照6

20說出ArrayList,vectorLinkedList的存儲性能和特性?

ArrayList是基於數組的,其內存空間是連續的,所以存儲的時候更快一些,便於查詢不便於增刪;vector是基於數組的,其內存空間也是連續的,因爲它線程的安全性,所以存儲的時候相對較慢;LinkedList是基於指針(鏈表)的,所以內存空間是不連續的,其便於增刪不便於查詢

21&&&的區別?

&能夠是位運算也能夠是邏輯運算,&&是邏輯運算,在運算的時候若是前面的表達式爲false,則&&後的表達式就不在進行

22final,finally,finalize的區別?

finalfinally參看8finalizegc中的方法,程序員能夠調用這個方法通知過程進行內存的回收

2三、程序中捕獲異常的方法?

try-catch-finally代碼塊

2四、用最有效的方法算出2乘以8等於幾

    2<<3

2五、寫一個方法,用一個for循環打印九九乘法表

for (int i = 1, j = 1; j <= 9; i++) {
   System.out.print(i + "*" + j + "=" + i * j + " ");
   if (i == j) {
    i = 0;
    j++;
    System.out.println();
   }

  }

 

26、如何避免java多線程的死鎖

減小共享資源,避免鎖嵌套

27、兩個對象值相同(x.equalsy==true但卻可有不一樣的hashcode,這句話對不對?

對,若是重寫equalshashcode方法可能會出現這種狀況

28、重載和重寫的主要區別是什麼?重載的方法可否根據返回類型進行區別?

重載是發生在了一個類中,只看同名方法中的參數列表是否相同,對修飾符和返回值類型沒有限制;重寫是放生在了父子類中,函數同名,參數列表一致,權限修飾符要大於等於父類,返回值類型要小於等於父類;重載是編譯時多態,重寫是運行時多態。

2九、抽象類和接口有什麼區別?

抽象類中容許存在實體方法,容許存在靜態方法,有構造函數,有變量;接口中沒有實體函數,沒有靜態函數,變量默認是靜態常量

30、tcpudp的區別

UDP:沒有創建鏈接;不可靠的傳輸;底層是用流進行傳輸;傳輸速度快;進行封包

TCP:須要創建鏈接;底層用的也是流進行數據的傳輸;通過三次握手,是一個可靠的鏈接;不限制數據的大小;安全性比較高,可是傳輸速度比較

 

 

 

SQL部分

1sql語句題

|mobile|date

|13972647899|時間

|13927484736|時間

|13627274848|時間

  1. 各個手機號碼出現的次數?

Select mobile,count(mobile) from tab group by mobile;

b.手機號碼前三位各自出現的次數?

Select left(mobile,3) headnum,count(left(mobie,3)) from tab group by headnum;

2sql group by having的使用場景

Group by 進行分組查詢

Having 在分組後進行過濾

三、事務種類

Uncommitted

Read committed

Repeatable read

Serializable

 

四、大量數據處理方法

整體思路:分而治之 最終彙總

方式一:單機模式下,內存有限,能夠將要處理的數據進行分塊,依次加載入內存,進行處理,最終進行彙總靈活利用分桶、分區的思想,對數據進行處理

方式二:利用多機處理,將數據分塊後,並行在多臺機器中進行處理,最終彙總,即分佈式處理。目前有成熟的分佈式大數據處理框架,如hadoopstormspark等。

 

5sql關鍵字 例如trancatedelete的比較

Delete 刪除數據,能夠刪除表中的部分行,也能夠刪除正表數據,刪除時是真的去移除表中記錄,因此刪除正表數據時,若是數據量較大,效率會比較低。

Trancate刪除數據,只能刪除整表數據,原理是直接摧毀表,再從新建立表,效率會很高,可是隻能刪除整表數據,沒法進行部分數據的刪除。

 

6trancate是啥?

參考題10

7wherehaving的區別

Where用來在分組以前過濾,having用來在分組以後過濾。

Where語句中不能出現聚合函數,having能夠

八、樂觀鎖和悲觀鎖的區別

都是用來解決更新丟失問題的方案。

悲觀鎖經過在查詢階段加排他鎖在在查詢階段就避免了更新丟失的可能

樂觀鎖經過版本字段進行檢測,在修改階段檢查更新丟失,若是發現產生了更新丟失再進行補救。

根據其特色,若是查詢多而修改少,則用樂觀鎖,若是查詢少而更新多,則用悲觀鎖。

9select有事務嗎

看隔離級別,默認狀況下非Serializable隔離級別下查詢不加鎖,Serializable隔離級別下查詢加共享鎖。也能夠根據須要在查詢階段手動加鎖。

10、學生表 學生 課程關係表  課程表

    三表的關聯查詢    group by使用

11sql 查找學生成績都大於80的學生姓名;

Student S# Sname Sage Ssex 學生表

Course C# Cname T#課程表

SC S# C# score 成績表

Teacher T# Tname 教師表

 

select * from student,course,sc where sc.sname=student.sname and sc.cname=course.cname group by sc.sname having min(sc.score)>80;

 

 

12sql 刪除按姓名分組後對應成績最小的學生;

Delete from student where sname = (

Select sname from (Select Student.sname from student,course,sc where sc.sname=student.sname and sc.cname=course.cname group by sc.sname order by sum(sc.score) asc limit 0,1)  a) ;

13、如何防止sql注入

使用preparedstatment防止sql注入

1四、寫出學生表的建表語句

Create table student (sid int primary key auto_increment,sname varchar(20),sage int,ssex varchar(1));

1五、查詢姓「張」的學生名單

Select * from student where sname like ‘張%’;

1六、查詢全部學生的學號、姓名選課數、總成績

select student.sid,student.sname,count(course.cname),sum(sc.score) from student,course,sc where sc.sname=student.sname and sc.cname=course.cname group by student.sid;

1七、查詢選修「葉萍」老師所授課程的學生中,成績高的學生姓名及其成績

Select student.sname,sum(sc.score) from student,course,sc,teacher where student.sname = sc.sname and course.cname = sc.cname and teacher.tname =course.tname and teacher.tname = ‘葉萍’ group by student.sname order by sum(sc.score) desc limit 0,1 ;

1八、數據庫中,查看表中重複記錄

Select * from tab group by colm having count(colm)>1;

 

大數據

  1. hadoopspark的應用場景?

SparkSpark是一個基於內存計算的開源集羣計算系統,目的是更快速的進行數據分析。Spark由加州伯克利大學AMP實驗室Matei爲主的小團隊使用Scala開發開發,相似於Hadoop MapReduce的通用並行計算框架,Spark基於Map Reduce算法實現的分佈式計算,擁有Hadoop MapReduce所具備的優勢,但不一樣於MapReduce的是Job中間輸出和結果能夠保存在內存中,從而再也不須要讀寫HDFS,所以Spark能更好地適用於數據挖掘與機器學習等須要迭代的Map Reduce的算法。

Spark的適用場景:
1)屢次操做特定數據集的應用場合
Spark是基於內存的迭代計算框架,適用於須要屢次操做特定數據集的應用場合。須要反覆操做的次數越多,所需讀取的數據量越大,受益越大,數據量小可是計算密集度較大的場合,受益就相對較小。
2)粗粒度更新狀態的應用
因爲RDD的特性,Spark不適用那種異步細粒度更新狀態的應用,例如Web服務的存儲或者是增量的Web爬蟲和索引。就是對於那種增量修改的應用模型不適合。
總的來講Spark的適用面比較普遍且比較通用。

Hadoop是實現了MapReduce的思想,將數據切片計算來處理大量的離線數據數據。Hadoop處理的數據必須是已經存放在HDFS上或者相似HBase的數據庫中,因此Hadoop實現的時候是經過移動計算到這些存放數據的機器上來提升效率。
Hadoop的適用場景:
1)海量數據的離線分析處理
2)大規模Web信息搜索
3)數據密集型並行計算

  1. 數據處理都要通過哪些步驟?

數據採集 提取清洗 整合匯聚 存儲 分析處理 可視化展現

  1. 作的項目最後生成報表目的是什麼?

原始數據量一般大而混雜,隱含着大量業務內容,經過分析計算後經過報表形式表現數據背後隱含的數據含義。

  1. 你作的項目中數據來源都有哪些?

網站後臺日誌

傳統數據庫歷史數據

網站實時數據流

爬蟲採集

等等

  1. 你會什麼腳本語言?請用一種腳本語言將某條日誌數據寫到hive表中?

Shell

Python

。。。。。根據自身狀況回答。。。。。

  1. hive如何從hbase中讀取數據?

參考文檔:使用hive讀取hbase數據.mht

  1. hdfs工做原理.

簡單來講,將大文件進行切塊上傳到hdfs集羣中進行分佈式存儲,利用集羣的力量提升海量數據處理時的吞吐能力。另外塊在保存時會自動進行備份操做,默認3份,從而保證了集羣中數據的可靠性。

 

  1. zookeeper相關知識介紹

zookeeper是一個開放源碼的分佈式協調服務,是一種典型的分佈式數據一致性解決方案。由雅虎建立,貢獻給了apache

利用zookeeper能夠實現數據發佈訂閱、負載均衡、命名服務、分佈式協調/通知、集羣管理、分佈式鎖、分佈式隊列等功能。

具備 順序一致性 原子性 單一視圖 可靠性 實時性的特色

採用選舉 投票 過半贊成 的機制保證了分佈式數據協調時的數據一致性。

 

  1. hdfs的角色

Hadoop分佈式數據存儲技術。

mapreduce hbase hive 等技術採用的底層分佈式數據存儲技術

  1. flume的扇入扇出

flume是分佈式的,可靠的,用於從不一樣的來源有效收集 彙集 和 移動 大量的日誌數據用以集中式的數據存儲的系統。

能夠經過自由配置agent來實現日誌的收集匯聚傳輸存儲。能夠實現收集日誌時多級傳輸、扇入、扇出等操做,並支持負載均衡失敗恢復,實現日誌的可靠傳輸。

扇入,即多個agent向一個agent發送日誌,一般用來實現日誌信息的匯聚。

刪除,即一個agent向多個agent發送日誌,能夠採用複製或路由方式工做,一般用來實現日誌的分發。

  1. hive的建表  hive如何存儲數據

create table book (id bigint, name string) partitioned by (category string) row format delimited fields terminated by '\t';

hive中的數據以文件的形式保存在hdfs文件系統中。Hdfs文件中的一行對應hive表中的一行數據,字段間經過指定分隔符進行分隔。

  1. hadoop版本

Apache Hadoop版本分爲兩代,咱們將第一代Hadoop稱爲Hadoop 1.0,第二代Hadoop稱爲Hadoop 2.0。第一代Hadoop包含三個大版本,分別是0.20.x0.21.x0.22.x,其中,0.20.x最後演化成1.0.x,變成了穩定版,而0.21.x0.22.xNameNode HA等新的重大特性。第二代Hadoop包含兩個版本,分別是0.23.x2.x,它們徹底不一樣於Hadoop 1.0,是一套全新的架構,均包含HDFS FederationYARN兩個系統,相比於0.23.x2.x增長了NameNode HAWire-compatibility兩個重大特性

  1. hive有幾個模塊

HiveQL:這是Hive的數據查詢語言,與SQL很是相似。Hive提供了這個數據查詢語言與用戶的接口,包括一個

shell的接口,能夠進行用戶的交互,以及網絡接口與JDBC接口。

JDBC接口能夠用於編程,與傳統的數據庫編程相似,使得程序能夠直接使用Hive功能而無需更改

Driver: 執行的驅動,用以將各個組成部分造成一個有機的執行系統,包括會話的處理,查詢獲取以及執行驅動

CompilerHive須要一個編譯器,將HiveQL語言編譯成中間表示,包括對於HiveQL語言的分析,執行計劃的生成以及優化等工做

Execution Engine:執行引擎,在Driver的驅動下,具體完成執行操做,包括MapReduce執行,或者HDFS操做,或者元數據操做

Metastore:用以存儲元數據:存儲操做的數據對象的格式信息,在HDFS中的存儲位置的信息以及其餘的用於數據轉換的信息SerDe

  1. Java nio  nio組成部分(channel buffer selector

Java的非阻塞式io

Jdk5開始提供。

解決了傳統java bio阻塞式工做,服務器沒法在高併發場景下實現少許線程處理多客戶端請求的問題。

channel buffer selector組成

Channel稱爲通道,類比bio中的流,實現數據傳輸,但不一樣的是,爲雙向傳輸。

Buffer爲緩衝區,channle面向緩衝區進行數據處理

Selector爲選擇器,多個通道能夠註冊到一個選擇器中,經過少許線程從selector中選擇就緒通道進行處理,從而實現少許線程處理多個客戶端通道的效果。

  1. hivehbase比較一下,各自優點,應用場景

hivehbase的底層都是經過hdfs進行數據存儲,經過mapreduce進行數據處理。

但應用場景不一樣,hive是基於hadoop的數據倉庫工具,經過類sql的方式進行操做,簡化了離線數據的處理過程,可是仍然是一種離線數據處理工具。

Hbase則是基於hadoop的非關係型數據庫。能夠實現毫秒級別的實時查詢,是一種在線數據庫系統。相對於傳統的數據,適合於存儲非結構化半結構化的數據,按列存儲、經過rowkey來實現查詢,能夠存儲海量數據。

  1. 用大數據生態的那個組件作過項目,作了什麼,怎麼作的?具體處理流程。

能夠描述下zebra/網站流量分析項目的流程。

  1. mapreduce過程

從物理過程來說:

客戶端提交一個mrjar包給JobClient(提交方式:hadoop jar ...)

JobClient經過RPCResourceManager進行通訊,返回一個存放jar包的地址(HDFS)和jobId

clientjar包寫入到HDFS當中(path = hdfs上的地址 + jobId)

開始提交任務(任務的描述信息,不是jar, 包括jobidjar存放的位置,配置信息等等)

JobTracker進行初始化任務

讀取HDFS上的要處理的文件,開始計算輸入分片,每個分片對應一個MapperTask

TaskTracker經過心跳機制領取任務(任務的描述信息)

下載所需的jar,配置文件等

TaskTracker啓動一個java child子進程,用來執行具體的任務(MapperTaskReducerTask

將結果寫入到HDFS當中

 

從邏輯過程來說:

map任務處理

讀取輸入文件內容,解析成keyvalue對。對輸入文件的每一行,解析成keyvalue對。每個鍵值對調用一次map函數。

寫本身的邏輯,對輸入的keyvalue處理,轉換成新的keyvalue輸出。

對輸出的keyvalue進行分區。

對相同分區的數據,按照key進行排序(默認按照字典順序進行排序)、分組。相同keyvalue放到一個集合中。

(可選)分組後的數據進行歸約。

reduce任務處理

對多個map任務的輸出,按照不一樣的分區,經過網絡copy到不一樣的reduce節點。這個過程並非map將數據發送給reduce,而是reduce主動去獲取數據。

對多個map任務的輸出進行合併、排序。寫reduce函數本身的邏輯,對輸入的keyvalue處理,轉換成新的keyvalue輸出。

reduce的輸出保存到文件中。

 

簡單來講,整個過程通過:map suffle (partition sort combiner spile merge)reduce

  1. hbaseregion

hbase中的表在行的方向上分隔爲多個HRegion,分散在不一樣的RegionServer

這樣作的目的是在查詢時能夠將工做量分佈到多個RegionServer中以提升速度

region[startkey,endkey)表示

HRegionhbase分佈式存儲和負載均衡的最小單元

要注意HRegion不在hdfs中,而是在RegionServer的內存中,在內存(其實也有數據在本地文件系統中,由於內存空間畢竟是有限的)中存儲數據以提升查詢性能,對於修改會將數據同步到hdfs中,以持久化數據。

hbase中的數據按照rowkey的字典順序(字典順序!!!先比較第一位 若是相同再比較第二位。。。)按序存儲,因此當以rowkey查詢數據時,能夠提升速度。

hregion的分裂,當hregion變的很大時會分裂成兩個,存放到不一樣的RegionServer中,防止一個Region過大,致使查詢其中數據時速度很慢

  1. hbasehive區別

參考18

  1. hbase如何導入超大文件

將文件導入hbase主要有三種方式,應對與不一樣應用場景:

(1) 使用HBaseAPI中的Put方法  - 單機效率低,適用於少許數據的場景

(2) 使用bulk load 工具從TSV文件中導入數據 – hbase提供更的工具,效率高,能夠處理大文件,但只能處理固定格式的文件。

(3)本身編寫mapreduce來進行導入操做 靈活,能處理大量的數據及各類格式,可是須要手動編寫mr

  1. hbase行鍵創建時須要注意哪些?

~RowKey長度原則

Rowkey是一個二進制碼流,Rowkey的長度被不少開發者建議說設計在10~100個字節,不過建議是越短越好,不要超過16個字節。

 

緣由以下:

1)數據的持久化文件HFile中是按照KeyValue存儲的,若是Rowkey過長好比100個字節,1000萬列數據光Rowkey就要佔用100*1000=10億個字節,將近1G數據,這會極大影響HFile的存儲效率;

2MemStore將緩存部分數據到內存,若是Rowkey字段過長內存的有效利用率會下降,系統將沒法緩存更多的數據,這會下降檢索效率。所以Rowkey的字節長度越短越好。

3)目前操做系統是都是64位系統,內存8字節對齊。控制在16個字節,8字節的整數倍利用操做系統的最佳特性。

 

~RowKey散列原則

若是Rowkey是按時間戳的方式遞增,不要將時間放在二進制碼的前面,建議將Rowkey的高位做爲散列字段,由程序循環生成,低位放時間字段,這樣將提升數據均衡分佈在每一個Regionserver實現負載均衡的概率。若是沒有散列字段,首字段直接是時間信息將產生全部新數據都在一個RegionServer上堆積的熱點現象,這樣在作數據檢索的時候負載將會集中在個別RegionServer,下降查詢效率。

 

~RowKey惟一原則

必須在設計上保證其惟一性。

  1. hive怎樣實現分頁查詢?

~藉助惟一標識字段

若是分頁的表有惟一標識的字段,能夠經過這個字段來實現分頁:

獲取第一頁數據:

注:同時須要記錄這10條中最大的idpreId,做爲下一頁的條件。

select * from table order by id asc limit 10;

獲取第二頁數據:

注:同時保存數據中最大的id替換preId

select * from table where id >preId order by id asc limit 10;

後續的頁數獲取同理。

 

~使用row number()函數

若是分頁的表沒有惟一標識的字段,能夠經過row number()函數來實現分頁。

首先使用row number()函數來給這個表作個遞增的惟一標識:

create table newtable as select row number(1) as id ,* from table;

經過row number函數給表加了惟一標識以後,就能夠利用第一個方法來進行分頁

 

  1. 介紹下hbase寫入數據流程

數據在更新時首先寫入Log(WAL log)和內存(MemStore)中,MemStore中的數據是排序的,當MemStore累計到必定閾值時,就會建立一個新的MemStore,並 且將老的MemStore添加到flush隊列,由單獨的線程flush到磁盤上,成爲一個StoreFile。於此同時,系統會在zookeeper中 記錄一個redo point,表示這個時刻以前的變動已經持久化了。(minor compact)

 

當系統出現意外時,可能致使內存(MemStore)中的數據丟失,此時使用Log(WAL log)來恢復checkpoint以後的數據。

 

前面提到過StoreFile是隻讀的,一旦建立後就不能夠再修改。所以Hbase的更 新實際上是不斷追加的操做。當一個Store中的StoreFile達到必定的閾值後,就會進行一次合併(major compact),將對同一個key的修改合併到一塊兒,造成一個大的StoreFile,當StoreFile的大小達到必定閾值後,又會對 StoreFile進行split,等分爲兩個StoreFile

  1. 我給他介紹hbase行鍵列簇創建時注意事項時說創建行鍵儘可能不要用數字,他問爲何不能

雖然行鍵在HBase中是以byte[]字節數組的形式存儲的,可是建議在系統開發過程當中將其數據類型設置爲String類型,保證通用性;若是在開發過程當中將RowKey規定爲其餘類型,譬如Long型,那麼數據的長度將可能受限於編譯環境等所規定的數據長度。

 

  1. 瞭解region麼?介紹下,數據插入region會怎樣?而後說完了又問region怎樣讓他不分裂?

 

a) hbase.hregion.max.filesize配置的足夠大

b) hbase-site.xml配置文件中,添加:

namehbase.regionserver.region.split.policy

valueorg.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy

 

 

  1. flume數據源有哪些?使用過http+AVro搭配嗎?

Avro Source

Exec Source

Spooling Directory Source

NetCat Source

Sequence Generator Source

HTTP Source

Custom source

 

  1. 要作一個相似Hadoop 的軟件,如何作架構,api接口如何設計?

參考zebrajava實現

 

  1. hbase內部原理;

hbase中的表在行的方向上分隔爲多個HRegion,分散在不一樣的RegionServer

這樣作的目的是在查詢時能夠將工做量分佈到多個RegionServer中以提升速度

HRegionhbase分佈式存儲和負載均衡的最小單元

要注意HRegion不在hdfs中,而是在RegionServer的內存中,在內存(其實也有數據在本地文件系統中,由於內存空間畢竟是有限的)中存儲數據以提升查詢性能,對於修改會將數據同步到hdfs中,以持久化數據。

hbase中的數據按照rowkey的字典順序(字典順序!!!先比較第一位 若是相同再比較第二位。。。)按序存儲,因此當以rowkey查詢數據時,能夠提升速度。

hregion的分裂,當hregion變的很大時會分裂成兩個,存放到不一樣的RegionServer中,防止一個Region過大,致使查詢其中數據時速度很慢

爲何hbase能夠很快:

從邏輯結構上來講:

表按照行鍵進行了排序,因此查詢時能夠很快定位

數據按照行鍵切分爲多個HRegion,分佈在多個RegionServer中,查詢大量數據時,多個RegionServer能夠一塊兒工做,從而提升速度

從物理結構上來講:

HRegion是存活在RegionServer的內存中的,讀寫會很是的高效

還有HFileHLog的支持保證大量的數據能夠保存

數據最終落地到HDFS中,分佈式的存儲,保證數據段可靠性和可擴展性

 

爲何hbase能夠存儲不少數據:

基於hdfs,因此支持可擴展性,能夠經過增長大量的廉價的硬件提升存儲容量

按列存儲,空的數據不佔用空間,當存儲稀疏數據時,不會浪費空間

按列存儲,同一列的數據存放在一塊兒,而同一列的數據通常都是一樣的類型的內容類似的數據,能夠實現很是高效的壓縮,節省空間

 

爲何hbase的數據是可靠的:

基於hdfs,由hdfs的可靠性保證了hbase的可靠性--即數據能夠有多個備份

利用zookeeper實現了HA,即便某一臺機器掛掉另外的機器也能夠很快的替換它

  1. nio io區別,高併發編程

Nio 非阻塞失IO,面向通道操做緩衝區,在執行READ WRITE CONNECT ACCEPT 操做時不會產生阻塞。

BIO 傳統IO,面向流操做字節/字符。在執行READ WRITE CONNECT ACCEPT操做時會有阻塞。

傳統BIO因爲執行如上四種操做時,會產生阻塞因此沒法實現用少許線程處理多個客戶端通道的鏈接。

NIO利用非阻塞特色,解決了該問題,從而實現了高併發場景下服務器的開發需求。

  1. hadoop1hadoop2的區別

引入了yarn進行資源調度。

增長了NameNode的高可用機制

  1. hdfs原理,以及各個模塊的職責?

將文件切塊,分別存放在集羣中不一樣的機器中,而且進行備份,保證數據的可靠性。

NameNodehdfs元數據保存的場所

SecondaryNameNode: NameNode輔助者,幫助NameNode實現日誌數據合併。

DataNode:存放數據塊。

  1. 數據傾斜產生的緣由,用mapreduce如何處理數據傾斜問題?

數據來源中數據自己不均衡。

解決方案:合理設計partition

  1. SecondaryNamenodefsimageedit日誌文件合併有什麼意義,爲何要這樣作;

SecondaryNameNode並非NameNode的熱備份,而是協助者幫助NameNode進行元數據的合併,從另外的角度來看能夠提供必定的備份功能,但並非熱備,這種合併過程可能會形成極端狀況下數據丟失!能夠從ssn中恢復部分數據,可是沒法恢復所有。

NameNodehdfs存放元數據的場所,工做很是繁忙,若是讓NameNode來執行進行日誌合併操做,必然會致使NameNode壓力增大,另外在合併期間NameNode沒法響應外部寫需求,形成hdfs可用性降低。

  1. 簡述zookeeper,是幹什麼用的;

zookeeper是一個開放源碼的分佈式協調服務,是一種典型的分佈式數據一致性解決方案。由雅虎建立,貢獻給了apache

利用zookeeper能夠實現數據發佈訂閱、負載均衡、命名服務、分佈式協調/通知、集羣管理、分佈式鎖、分佈式隊列等功能。

  1. 說一下hadoop寫文件的流程

使用HDFS提供的客戶端開發庫Client,向遠程的Namenode發起RPC請求;

Namenode會檢查要建立的文件是否已經存在,建立者是否有權限進行操做,成功則會爲文件建立一個記錄,不然會讓客戶端拋出異常;

當客戶端開始寫入文件的時候,開發庫會將文件切分紅多個packets,並在內部以數據隊列"data queue"的形式管理這些packets,並向Namenode申請新的blocks,獲取用來存儲replicas的合適的datanodes列表, 列表的大小根據在Namenode中對replication的設置而定。

開始以pipeline(管道)的形式將packet寫入所 有的replicas中。開發庫把packet以流的方式寫入第一個datanode,該datanode把該packet存儲以後,再將其傳遞給在此 pipeline中的下一個datanode,直到最後一個datanode,這種寫數據的方式呈流水線的形式。

最後一個datanode成功存儲以後會返回一個ack packet,在pipeline裏傳遞至客戶端,在客戶端的開發庫內部維護着"ack queue",成功收到datanode返回的ack packet後會從"ack queue"移除相應的packet

若是傳輸過程當中,有某個datanode出現了故障,那麼當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除, 剩餘的block會繼續剩下的datanode中繼續以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持 replicas設定的數量。

  1. 假如在集羣運行中將數據塊A移動到Bnamenode是怎麼知道的

datanode的心跳包的響應中,namenodedatanode發送指令進行操做。

在執行過程當中,datanodenamenode進行彙報。

  1. Yarn在集羣中起到什麼做用?zookeeper在集羣中起到什麼做用?

Yarn mapreduce的資源調度框架

Zookeeper 集羣協調服務

  1. Hadoop配置文件

core-site.xml

hdfs-site.xml

mapred-site.xml

yarn-site.xml

  1. HadoopHa集羣中個服務的啓動和關閉順序

啓動zookeeper集羣

啓動journalnode集羣

啓動namenode

啓動datanode

啓動zkfc

 

  1. HDFSblock塊默認保存幾份?默認block size多大?

364MB(128MB)

  1. Namenodemeta數據是存放在NameNode自身,仍是DataNoda等其餘節點?Data節點自身是否有meta數據存在?

meta數據保存在namenode中,包括文件結構樹信息、文件和Block之間關係的信息、Block數量信息、BlockDataNode之間的關係信息。Datanode不存儲元數據,可是當集羣啓動時,datanode須要向namenode彙報當前datanode中保存的塊信息,便於namenode構建blockdatanode之間的映射關係。

  1. 下面那個程序同行倉與NameNode在一個節點啓動?- C

 A: SecondaryNameNode   B: DataNode   C:TaskTracker    D:jobtra

  1. HadoopHA集羣中Zookeeper主要做用,以及啓動和查看狀態的命令?

兩個namenode以前的狀態監控及ha時的協調。

  1. Hbase 在進行模型設計時重點在什麼地方?一張表中定義多少個column Family最合適?爲何
  2. 如何提升Hbase客戶端讀寫性能?請舉例說明。

~開啓bloomfilter過濾器,開啓bloomfilter比沒開啓要快34

~在硬件容許的狀況下配足夠多的內存給它

經過修改hbase-env.sh中的
export HBASE_HEAPSIZE=3000 #這裏默認爲1000m

~修改java虛擬機屬性替換掉默認的垃圾回收器,由於默認的垃圾回收器在多線程環境下會有更多的wait等待   

export HBASE_OPTS="-server -XX:NewSize=6m -XX:MaxNewSize=6m -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"

 

 ~增大RPC數量

經過修改hbase-site.xml中的   

hbase.regionserver.handler.count屬性,能夠適當的放大。默認值爲10有點小

 

 ~作程序開發是注意的地方

須要判斷所求的數據行是否存在時,儘可能不要用HTable.exists(final byte [] row)

而用HTable.exists(final byte [] row, final byte[]column)等帶列族的方法替代。

  不要使用HTable.get(final byte [] row, final byte []column) == null來判斷所求的數據存在,而是用HTable.exists(final byte [] row, final byte[] column)替代

 

  1. 基於hadoopHA集羣進行mapreduce開發時,configuration對象的 hbase.zookeeper.quorum 屬性值是什麼?

Hbase使用的zookeeper地址,客戶端能夠經過經過該屬性找到zookeeper客戶端從而獲取服務器信息。

  1. hadoop開發過程當中使用過這些算法,其應用場景是什麼?
  2. MapReduce程序如何發佈?如何MapReduce中涉及到了第三方的jar包,該如何處理?

打成jar包,上傳到系統中,經過hadoop jar 命令執行

方式1、將第三方jarcopy$HADOOP_HOME/lib目錄裏;

方式2、將第三方jar包和你的MapReduce程序打成一個jar包;

方式3、使用 libjars 這個參數。

 

  1. HadoopCombiner的做用?

Combiner能夠認爲是在map階段運行的一種特殊的reduce,能夠在shuffle以前,在map階段將map輸出的數據先進行一次合併,從而減小在網絡中的數據傳輸量。

  1. Hive的條件判斷有幾種?

返回類型

函數

說明

T

if(boolean testCondition, T valueTrue, T valueFalseOrNull)

判斷是否知足條件,若是知足返回一個值,若是不知足則返回另外一個值。

T

COALESCE(T v1, T v2, …)

返回一組數據中,第一個不爲NULL的值,若是均爲NULL,返回NULL

T

CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END

a=b,返回c;當a=d時,返回e,不然返回f

T

CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END

當值爲a時返回b,當值爲c時返回d。不然返回e

 

  1. Hbase如何存儲數據?

hbase中的表在行的方向上分隔爲多個HRegion,分散在不一樣的RegionServer

這樣作的目的是在查詢時能夠將工做量分佈到多個RegionServer中以提升速度

region[startkey,endkey)表示

HRegionhbase分佈式存儲和負載均衡的最小單元

要注意HRegion不在hdfs中,而是在RegionServer的內存中,在內存(其實也有數據在本地文件系統中,由於內存空間畢竟是有限的)中存儲數據以提升查詢性能,對於修改會將數據同步到hdfs中,以持久化數據。

hbase中的數據按照rowkey的字典順序(字典順序!!!先比較第一位 若是相同再比較第二位。。。)按序存儲,因此當以rowkey查詢數據時,能夠提升速度。

hregion的分裂,當hregion變的很大時會分裂成兩個,存放到不一樣的RegionServer中,防止一個Region過大,致使查詢其中數據時速度很慢

HRegion雖然是分佈式存儲的最小單元,但並非存儲的最小單元。

事實上,HRegion由一個或者多個Store組成,每一個store保存一個columns family

每一個Strore又由一個memStore0至多個StoreFile組成

  1. 簡單描述Client上傳數據到一提啊hdfs的過程?

使用HDFS提供的客戶端開發庫Client,向遠程的Namenode發起RPC請求;

Namenode會檢查要建立的文件是否已經存在,建立者是否有權限進行操做,成功則會爲文件建立一個記錄,不然會讓客戶端拋出異常;

當客戶端開始寫入文件的時候,開發庫會將文件切分紅多個packets,並在內部以數據隊列"data queue"的形式管理這些packets,並向Namenode申請新的blocks,獲取用來存儲replicas的合適的datanodes列表, 列表的大小根據在Namenode中對replication的設置而定。

開始以pipeline(管道)的形式將packet寫入所 有的replicas中。開發庫把packet以流的方式寫入第一個datanode,該datanode把該packet存儲以後,再將其傳遞給在此 pipeline中的下一個datanode,直到最後一個datanode,這種寫數據的方式呈流水線的形式。

最後一個datanode成功存儲以後會返回一個ack packet,在pipeline裏傳遞至客戶端,在客戶端的開發庫內部維護着"ack queue",成功收到datanode返回的ack packet後會從"ack queue"移除相應的packet

若是傳輸過程當中,有某個datanode出現了故障,那麼當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除, 剩餘的block會繼續剩下的datanode中繼續以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持 replicas設定的數量。

  1. 列舉hadoop的三種運行模式並簡單介紹?

單機模式:在單機中運行,沒法使用hdfs,而是使用本地文件系統進行模擬,一般用來mapreduce的開發測試。

僞分佈式:在單機中,啓動多個進程來模擬集羣工做狀態,除了不是真正的集羣狀態,沒法提高處理效率外,使用起來和徹底分佈式差異不大。可使用hdfsmapreduce

徹底分佈式:在多機種,分佈式部署,能夠經過集羣力量來處理海量數據。真正生產環境下的使用方式。

相關文章
相關標籤/搜索