hadoop面試記錄(二)

最近面試面試題,回答本身總結的,有不對的地方歡迎你們留言指正
1 hadoop中配置文件有哪些,各自做用?
hadoop-env.sh 
    JAVA_HOME,HADOOP_CONF_DIR,HADOOP_LOG_DIR,HADOOP_PID_DIR,HADOOP_CLASSPATH,hadoop相關進程JVM參數
    其餘
core-site.xml
    fs.defaultFS,hadoop.tmp.dir,ha.zookeeper.quorum,io.compression.codecs,io.file.buffer.size
hdfs-site.xml
    namenode的url信息,dfs.name.dir,dfs.data.dir,dfs.replication,dfs.namenode.shared.edits.dir,
    dfs.journalnode.edits.dir,dfs.hosts.exclude
slaves 
    datanode列表
mapred-site.xml
    mapreduce.framework.name,mapreduce.map.output.compress.codec
yarn-site.xml
    resourcemanager信息
excludes
    排除節點列表

2 hdfs存儲機制是什麼java

1. HDFS開創性地設計出一套文件存儲方式,即對文件分割後分別存放;
2. HDFS將要存儲的大文件進行分割,分割後存放在既定的存儲塊(Block)中,並經過預先設定的優化處理,模式對存儲的數據進行預處理,從而解決了大文件儲存與計算的需求;
3. 一個HDFS集羣包括兩大部分,即NameNode與DataNode。通常來講,一個集羣中會有一個NameNode和多個DataNode共同工做;
4. NameNode是集羣的主服務器,主要是用於對HDFS中全部的文件及內容數據進行維護,並不斷讀取記錄集羣中DataNode主機狀況與工做狀態,並經過讀取與寫入鏡像日誌文件的方式進行存儲;
5. DataNode在HDFS集羣中擔任任務具體執行角色,是集羣的工做節點。文件被分紅若干個相同大小的數據塊,分別存儲在若干個DataNode上,DataNode會按期向集羣內NameNode發送本身的運行狀態與存儲內容,並根據NameNode發送的指令進行工做;
6. NameNode負責接受客戶端發送過來的信息,而後將文件存儲位置信息發送給提交請求的客戶端,由客戶端直接與DataNode進行聯繫,從而進行部分文件的運算與操做。
7. Block是HDFS的基本存儲單元,默認大小是64M(hadoop2中時128M);
8. HDFS還能夠對已經存儲的Block進行多副本備份,將每一個Block至少複製到3個相互獨立的硬件上,這樣能夠快速恢復損壞的數據;
9. 用戶可使用既定的API接口對HDFS中的文件進行操做;
10. 當客戶端的讀取操做發生錯誤的時候,客戶端會向NameNode報告錯誤,並請求NameNode排除錯誤的DataNode後後從新根據距離排序,從而得到一個新的DataNode的讀取路徑。若是全部的DataNode都報告讀取失敗,那麼整個任務就讀取失敗;
11. 對於寫出操做過程當中出現的問題,FSDataOutputStream並不會當即關閉。客戶端向NameNode報告錯誤信息,並直接向提供備份的DataNode中寫入數據。備份DataNode被升級爲首選DataNode,並在其他2個DataNode中備份複製數據。NameNode對錯誤的DataNode進行標記以便後續對其進行處理。

3 怎麼查看,刪除,移動,拷貝hadoop文件
node

hdfs dfs -text ...
hdfs dfs -rm ...
hdfs dfs -mv ...
hdfs dfs -cp ...

4 hadoop中combiner做用
面試

一、combiner相似本地的reduce功能.實現本地key的聚合,減清到reduce的io壓力

5 mr工做原理,距離說明mr是怎樣運行的apache

不肯定是否是回答這個圖


6 hive與oracle區別,目前hive不支持哪些函數(列出5個以上)
hive處理數據量較大,高延遲,基於hdfs,hql轉換成mr執行,不支持數據修改
oracle處理數據量相對較小,有全部,低延遲,支持數據修改
7 hbase經常使用基本命令,建立表,添加記錄,查看記錄,刪除記錄
create '表名稱','列族名稱1','列名族稱2','列名族稱N'
put '表名','行名','列名','值'
get '表名','行名'
delete '表名','行名稱','列名稱'
8 見下圖
 
//建表
create table net_info (device_number int,lac int,ci int,imei bigint,start_time timestamp,end_time timestamp,duration int,send_bytes int,recv_bytes int,total_bytes int)
row format delimited 
fields terminated by '|';
//加載數據
load data local inpath '/home/hadoop/text.txt' into table net_info;
select * from net_info;
//統計
select sum(total_bytes) from net_info where start_time>='2014-12-31' and end_time<'2015-1-1'
//順便複習下修改列
alter table net_info change start_time start_time timestamp;
9 編寫hive自定義函數實現oracle中addmonths函數功能,而後封裝到hive函數庫中。addmonths(data a,int b)函數功能簡單說明:求傳入日期a通過b月後的日期是多少?
 Hive能夠容許用戶編寫本身定義的函數UDF,來在查詢中使用。Hive中有3種UDF:
        1)UDF:操做單個數據行,產生單個數據行。
        2)UDAF:操做多個數據行,產生一個數據行。
        3)UDTF:操做一個數據行,產生多個數據行一個表做爲輸出。
        用戶構建的UDF使用過程以下:
        第一步:繼承UDF或者UDAF或者UDTF,實現特定的方法。
        第二步:將寫好的類打包爲jar。如hivefirst.jar。
        第三步:進入到Hive外殼環境中,利用add jar /home/hadoop/hivefirst.jar 註冊該jar文件。
該例實現網上找了個做參考:
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.IntObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

public class AddMonth extends GenericUDF {

    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
        if (arguments.length != 2) {
            throw new UDFArgumentLengthException("The function add_month(local_date, months_to_add) requires 2 arguments.");
        }

        ObjectInspector localDateVal = arguments[0];
        ObjectInspector monthsToAddVal = arguments[1];

        if (!(localDateVal instanceof StringObjectInspector)) {
            throw new UDFArgumentException("First argument must be of type String (local_date as String)");
        }
        if (!(monthsToAddVal instanceof IntObjectInspector)) {
            throw new UDFArgumentException("Second argument must be of type int (Month to add)");
        }
        return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
    }

    @Override
    public Object evaluate(DeferredObject[] arguments) throws HiveException {
        String localDateVal = (String) ObjectInspectorUtils.copyToStandardJavaObject(arguments[0].get(),
                PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        IntWritable monthsToAddVal = (IntWritable) ObjectInspectorUtils.copyToStandardJavaObject(arguments[1].get(),
                PrimitiveObjectInspectorFactory.javaIntObjectInspector);

        LocalDate localDate = null;
        try {
            localDate = LocalDate.parse(localDateVal, DateTimeFormat.forPattern("yyyy-MM-dd"));
        } catch (Exception ex) {
            return null;
        }

        return new Text(localDate.plusMonths(monthsToAddVal.get().toString());
    }

    @Override
    public String getDisplayString(String[] arguments) {
        assert (arguments.length == 2);
        return "add_month(" + arguments[0] + ", " + arguments[1] + ")";
    }
}
10 利用spark編寫搜索日誌分析:用戶在0點-12點的搜索量。搜索路徑存放路徑爲/input/data.txt。文件用豎線分割,第一列爲時間字段。日誌內容以下:
相關文章
相關標籤/搜索