1. 程式人生 > >2019最新JAVA學習路線-技術要點-面試題

2019最新JAVA學習路線-技術要點-面試題

contains ddl 發送 sequence 寫入文件 rgs apt api array

技術分享圖片

——————————————————面試題————————————————————————————

第一套

1.hadoop運行原理

包括HDFS和Mapreduce兩部分。

1HDFS自動保存多個副本,移動計算。缺點是小文件存取占用namenode內存,寫入只支持追加,不能隨機修改。

它存儲的邏輯空間稱為block,文件的權限類似linux。整體架構分三種節點,NN,SNN,DN

NN 負責讀寫操作保存metadata(Ownership Permission blockinfo)

SNN 負責輔助NN合並fsimage和edits,減少nn啟動時間

DN 負責存數據,每個數據(文件)分割成若幹block,每個block默認3個副本。啟動後像NN發送心跳保持聯系

NN保存的metadata在hdfs啟動後加載到計算機內存,除block位置信息的metadata保存在OS文件系統中的fsimage文件中,對metadata的操作日誌保存在OS文件系統中的edits文件中。block位置信息是hdfs啟動後由DN上報NN再加載到內存的。

HDFS的安全模式:直到NN完全加載完metadata之前的這段時間。期間不能寫入文件,DN檢查各個block完整性,並修復。

2MapReduce

離線計算框架,過程分為split map shuffle reduce四個過程

架構節點有:Jobtracker TaskTracker

Split將文件分割,傳輸到mapper,mapper接收KV形式的數據,經過處理,再傳到shuffle過程。

Shuffle先進行HashPartition或者自定義的partition,會有數據傾斜和reduce的負載均衡問題;再進行排序,默認按字典排序;為減少mapper輸出數據,再根據key進行合並,相同key的數據value會被合並;最後分組形成(key,value{})形式的數據,輸出到下一階段

Reduce輸入的數據就變成了,key+叠代器形式的數據,再進行處理

2.MapReduce原理

邏輯上:

1、split

2、map

3、shuffle

4、reduce

四個過程

物理上:

JobTracker節點:JobTracker創建每一個Task(即MapTask和ReduceTask)

並將它們分發到各個TaskTracker服務中去執行。負責調度Job的每一個子任務task運行於TaskTracker上。

TaskTracker節點:運行在多個節點上的slaver服務。TaskTracker主動與JobTracker通信,接收作業,並負責直接執行每一個任務。TaskTracker都需要運行在HDFS的DataNode上

3.hdfs存儲機制

1) client端發送寫文件請求,namenode檢查文件是否存在,如果已存在,直接返回錯誤信息,否則,發送給client一些可用namenode節點
2) client將文件分塊,並行存儲到不同節點上datanode上,發送完成後,client同時發送信息給namenode和datanode
3) namenode收到的client信息後,發送確信信息給datanode
4) datanode同時收到namenode和datanode的確認信息後,提交寫操作。

4.用MapReduce找出存在公共好友的兩個人

數據樣本:

A:B,C

B:A,E

C:A,D

D:C

E:B

import java.io.IOException;

import java.util.ArrayList;

//import java.util.Collection;

//import java.util.Map.Entry;

//import java.util.HashMap;

import java.lang.Iterable;

import org.apache.hadoop.conf.Configured;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.Reducer;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

//import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.util.ToolRunner;

import org.apache.hadoop.util.Tool;

import org.apache.commons.lang.StringUtils;

public class FindUsers extends Configured implements Tool {

static class Map extends Mapper<LongWritable, Text, Text, Text> {

public void map(LongWritable key, Text val, Context context) throws IOException, InterruptedException {

String line = val.toString();

String user = line.split(":")[0];

String[] friends = line.split(":")[1].split(",");

String joined_friends = StringUtils.join(friends, ",");

for(String friend : friends) {

int result = friend.compareTo(user);

if(result > 0) {

context.write(new Text(user + "," + friend), new Text(joined_friends));

}

else if(result < 0) {

context.write(new Text(friend + "," + user), new Text(joined_friends));

}

}

}

}

static class Reduce extends Reducer<Text, Text, Text, Text> {

public void reduce(Text key, Iterable<Text> vals, Context context) throws IOException, InterruptedException {

String string_key = key.toString();

String[] users = string_key.split(",");

ArrayList<String> list = new ArrayList<String>();

int i = 0;

String state = "Off";

for(Text val : vals) {

i++;

String[] all_people = val.toString().split(",");

ArrayList<String> inner_list = new ArrayList<String>();

if(state.equals("Off")) {

for(String one_people: all_people) {

list.add(one_people);

state = "On";

continue;

}

}

if( state.equals("On")) {

for(String one_people: all_people) {

inner_list.add(one_people);

}

}

list.retainAll(inner_list);

}

if( ! users[0].equals(users[1])) {

for(String user : users) {

if(list.contains(user)) list.remove(user);

}

if(list.size() >= 1 && i >=2) {

context.write(new Text(StringUtils.join(users, ",")), new Text(StringUtils.join(list,",")));

}

}

}

}

@Override

public int run(String[] args) throws Exception {

Job job = Job.getInstance(getConf());

job.setJarByClass(getClass());

job.setMapperClass(Map.class);

job.setReducerClass(Reduce.class);

//job.setNumReduceTasks(0);

job.setMapOutputKeyClass(Text.class);

job.setOutputValueClass(Text.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(Text.class);

job.setInputFormatClass(TextInputFormat.class);

job.setOutputFormatClass(TextOutputFormat.class);

FileInputFormat.addInputPath(job, new Path(args[0]));

FileOutputFormat.setOutputPath(job, new Path(args[1]));

return job.waitForCompletion(true) ? 0 : 1;

}

public static void main(String[] args) throws Exception {

ToolRunner.run(new FindUsers(), args);

}

}

5.用mr設計一個分組排重計數算法

輸入文件格式:二級域名,一級頻道,二級頻道,訪問ip地址,訪問者id

需求:按照二級域名,一級頻道,二級頻道分組,計算pageview數,計算獨立ip數和獨立訪問者id數

6.hadoop中combiner的作用

當map生成的數據過大時,帶寬就成了瓶頸,怎樣精簡壓縮傳給Reduce的數據,有不影響最終的結果呢。有一種方法就是使用Combiner,Combiner號稱本地的Reduce,Reduce最終的輸入,是Combiner的輸出

第二套

  1. 單例

5種寫法,1、懶漢2、惡漢3、靜態內部類4、枚舉5、雙重校驗鎖

1、

class LazySingleton{

private static LazySingleton singleton;

private LazySingleton(){

}

public static LazySingleton getInstance(){

if(singleton==null){

singleton=new LazySingleton();

}

return singleton;

}

}

2、

class HungrySingleton{

private static HungrySingleton singleton=new HungrySingleton();

private HungrySingleton(){}

public static HungrySingleton getInstance(){

return singleton;

}

}

3、

class InternalSingleton{

private static class SingletonHolder{

private final static InternalSingleton INSTANCE=new InternalSingleton();

}

private InternalSingleton(){}

public static InternalSingleton getInstance(){

return SingletonHolder.INSTANCE;

}

}

4、

enum EnumSingleton{

INSTANCE;

public void doSomeThing(){

}

}

5、

class LockSingleton{

private volatile static LockSingleton singleton;

private LockSingleton(){}

//詳見:http://www.ibm.com/developerworks/cn/java/j-dcl.html

public static LockSingleton getInstance(){

if(singleton==null){

synchronized(LockSingleton.class){

if(singleton==null){

singleton=new LockSingleton();

}

}

}

return singleton;

}

}

  1. Linkedlist和ArrayList的區別

 ArrayList是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢。LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。

3.http安全問題

1)重要信息:MD5,AES加密

2)不太重要的數據:用簽名

3)登錄態:

4.sparkStreaming和storm的區別

5.gc

自動監測對象是否超過作用域從而達到自動回收內存的機制,Java語言沒有提供

釋放已分配內存的顯式操作方法。

第三套·樂視

1.design a singleton class in multi-threading environment.

2.How to find middle element of linkedlist in one pass.

3.Reverse singly linked list in java recursively.

4.Write a java program to implement Stack in java.

Public class MyStack{

Private ArrayList data = new ArrayList();

Public Boolean pop(){}

Public Boolean push(){}

}

  1. scala 隱函數關鍵字

implicit

  1. val x=y=1結果

1)x、y都是var,x變為Unit

2)都是val,報錯

3.java內存模型

堆內存、棧內存、方法區

棧內存:保存局部變量

堆內存:存儲數組和對象

方法區:代碼區、字符串常量池、靜態區

  1. spark運行的job在哪裏可以看到

  1. HADOOP的一個job提交到resourcemanager之後,會生成什麽容器來放這個job

第四套·優酷

  1. java內存模型

2.gc

3.編譯好的scala程序,運行時還需要scala環境嗎

Scala的代碼執行是用REPL過程,Read Execute Print Loop

4.object中有哪些方法

5.監測集群中的cpu,內存使用情況?

6、ArrayList中的Array長度超了是怎麽增加的,一次增加多少?

第五套

linux的啟動順序

通電後讀取ROM的BIOS程序進行硬件自檢,自檢成功後把計算機控制權交給BIOS中BOOTsequence中的下一個有效設備,讀取該設備MBR找到操作系統,載入linux的bootloader,一般是grub。之後載入kernel,執行 /etc/rc.d/sysinit ,開啟其他組件(/etc/modules.conf),執行運行級別,執行/etc/rc.d/rc.local ,執行/bin/login,最後shell啟動。

使用過的開源框架介紹

Struts2

Spring

hibernate

mybatis

hadoop

hive

hbase

flume

sqoop

Zookeeper

Mahout

Kafka

Storm

Spark

擅長哪種技術

Hadoop。介紹

HIVE的優化

底層是MapReduce,所以又可以說是MapReduce優化。

  1. 小文件都合並成大文件
  2. Reducer數量在代碼中介於節點數*reduceTask的最大數量的0.95倍到1.75倍
  3. 寫一個UDF函數,在建表的時候制定好分區
  4. 配置文件中,打開在map端的合並

開發中遇到的問題

Hbase節點運行很慢,發現是Hfile過小,hbase頻繁split。

修改了hfile大小。或者設置major compack設置為手動

Major compack設置為手動會出現什麽問題

Zookeeper的二次開發

Flume 的實時和定時數據采集,項目和flume的解耦

Mogodb和hbase的區別

Mogodb是單機

Hbase是分布式??

項目組多少人?人員分配?數據量?集群的配置?

第六套·優化相關

Hbase優化

  1. 表設計

建表時就分區,rowkey設置定長(64字節),CF2到3個

Max Versio,Time to live,Compact&Split

  1. 寫表

多Htable並發寫

Htable參數設置,手動flush,降低IO

WriteBuffer

批量寫

多線程並發寫

  1. 讀表

多Htable並發讀

Htable參數設置

批量讀

釋放資源

緩存查詢結果

MapReduce優化

1. 任務調度

I/O 方面:Hadoop 會盡量將 Map 任務分配給 InputSplit 所在的機器,以減少網

絡 I/O 的消耗。

2.數據預處理與 InputSplit 的大小

合理地設置 block塊大小是很重要的調節方式。除此之外,也可以通過合理地

設置 Map 任務的數量來調節 Map 任務的數據輸入。

3. Map 和 Reduce 任務的數量

當 Reduce 任務的數量是任務槽的 1.75 倍時,執行速度快的機器可以獲得更多

的 Reduce 任務,因此可以使負載更加均衡,以提高任務的處理速度。

4. Combine 函數

MapReduce 框架運行用戶寫的 combine 函數用於本地合並,這會大大減少網

絡 I/O 操作的消耗

Oracle優化

1、建立視圖

2、優化 sql 語句

3、分表、分庫

4、存儲過程

Spark優化

第七套·scala

scala 語言有什麽特點,什麽是函數式編程?有什麽優點

2.scala 伴生對象有什麽作用

3.scala 並發編程是怎麽弄得,你對 actor 模型怎麽理解有何優點

4.scala case class 有什麽重要

5.scala akka 框架有沒有接觸過,有什麽重要

6.scala 為什麽設計 var 和 val

第八套·spark

SDD,DAG,Stage怎麽理解?

寬依賴 窄依賴怎麽理解?

Stage是基於什麽原理分割task的?

血統的概念

任務的概念

容錯方法

粗粒度和細粒度

Spark優越性

Spark為什麽快

Transformation和action是什麽?區別?舉幾個常用方法

SDD怎麽理解

spark 作業提交流程是怎麽樣的,client和 cluster 有什麽區別,各有什麽作用

spark on yarn 作業執行流程,yarn-client 和 yarn cluster 有什麽區別

spark streamning 工作流程是怎麽樣的,和 storm 比有什麽區別

spark sql 你使用過沒有,在哪個項目裏面使用的

spark 機器學習和 spark 圖計算接觸過沒,,能舉例說明你用它做過什麽嗎?

spark sdd 是怎麽容錯的,基本原理是什麽?

第九套·java

1.關於 string 的選擇題

2.修飾符

3.兩個整數相除,保存到百分位

4.寫個封裝,抽象,繼承,多態的類集。

5.jsp 的作用域的描述。

6.如何得到 jsp 的參數。

7.寫幾個 SQL 語句。

第十套·美團(3-7)

1. 說說 hbase 的 API 都有哪些 filter?

2. 說說你用過的 storm?

3. 自己熟悉大數據的部分說一下?

4. hadoop 與 storm、spark 的比較?

5. 對一個字符串進行全排列?

6. 事務都有哪些特點?

7. hadoop 集群中的某個 block 不能 copy 數據到其他節點,怎麽辦?如果並發量大

了, 有多個 block不能 copy 數據,怎麽辦?

8. flum 是如何導入數據到 kafka?具體

9. 請使用 awk, sed 命令對文本文件中第二列和第三列取出來(58同城)

其他整理

1、 用戶文件 2 個屬性 10 萬行,課程文件 2 個屬性 2 萬行,日誌文件 1 個屬性很

大,這些屬性可以任意的組合查詢,每秒的請求數是 10000 個,請如何最快的方式查

詢出數據?

2、給你 2 個字符串,字符串最後一個字符可以循環到最前面,只要一個字符串中每

一個字符在另一個字符串都有就是相等的,請用你的方法比較是否相等?

3、任意使用MR或者Storm或者hive根據日誌表,求20150501當天每個用戶訪問頁面次數的前10的頁面,日誌表如下:

Userid pageid viste date

Aa 222 20150501

Aa 333 20150501

Aa 222 20150501

Aa 222 20150502

Bb 333 20150501

Cc 333 20150502

4、Hbase的major compact和minor compact的區別

5、A表有三個字段,id,name,age,id為主鍵,去除該表中name重復的數據,用mysql語法實現(千萬級別查詢量、考慮Sql語法的復雜性)

6、算法:TB級別數據排序

1)單機實現 2)分布式實現

7、static synchronized final volatile

8、concurrentHashMap的數據結構和應用場景

9、多線程的3種實現,說明他們的優缺點

10、JVM的內存模型,GC在何時何地,做了什麽事情

11、用java實現LRU緩存

12、實現單例,要求:線程安全、鎖的性能

13、目錄拷貝功能:目錄下上萬文件需要拷貝備份,拷貝同時輸出進度

14、jps命令作用

15、a和b兩個文件各存放80億URL,每個URL64字節,內存限制為4G,如何找出共同的URL

16、start-hbase.sh為起點hbase的啟動流程

17、hbase的compact

2019最新JAVA學習路線-技術要點-面試題