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存储机制是什么

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文件

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

4 hadoop中combiner作用

1、combiner类似本地的reduce功能.实现本地key的聚合,减清到reduce的io压力

5 mr工作原理,距离说明mr是怎样运行的

不确定是不是回答这个图


6 hive与oracle区别,目前hive不支持哪些函数(列出5个以上)
hive处理数据量较大,高延迟,基于hdfs,hql转换成mr执行,不支持数据修改
oracle处理数据量相对较小,有所有,低延迟,支持数据修改
7 hbase常用基本命令,创建表,添加记录,查看记录,删除记录
create '表名称','列族名称1','列名族称2','列名族称N'
put '表名','行名','列名','值'
get '表名','行名'
delete '表名','行名称','列名称'
8 见下图
 hadoop面试记录(二)_第1张图片
//建表
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。文件用竖线分割,第一列为时间字段。日志内容如下:hadoop面试记录(二)_第2张图片

你可能感兴趣的:(hadoop面试记录(二))