面试准备-hive-hbase整合

应用场景(数据转移)

什么情况下需要整合hive,hbase

Hive与HBase的整合功能从Hive0.6.0版本已经开始出现,利用两者对外
的API接口互相通信,通信主要依靠hive_hbase-handler.jar工具包(Hive
Storage Handlers)。由于HBase有一次比较大的版本变动,所以并不是每个
版本的Hive都能和现有的HBase版本进行整合,所以在使用过程中特别注意
的就是两者版本的一致性。

面试准备-spark+hive

基础环境

组件 版本
spark 2.2
hadoop 2.7.4
hive 1.2.2

spark 读取hive数据

测试一下电脑上已经安装的Spark版本是否支持Hive

需要把Hive的配置文件hive-site.xml拷贝到Spark的conf目录下

mysql驱动拷贝到$SPARK_HOME/jars下 或者spark-shell –driver-class-path /path/to/mysql-connector-java-5.1.44.jar

对于2.0版本以后,入口变成了SparkSession,使用SparkSession.builder()来构建

依赖 spark-hive_2.11

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-hive_2.11 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.2.0</version>
<scope>provided</scope>
</dependency>

参考资源

  1. Spark2.1.0入门:连接Hive读写数据(DataFrame)

面试准备-sparkStreaming数据流

sparkStreaming核心抽象

Dstream

两种方式消费kafka(Receiver与Direct)

Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式

Direct优势

Receiver的offset保存在zookeeper,如果要同步需要开启(WAL)(会造成性能损耗及增加数据冗余量)

基于receiver的方式,是使用Kafka的高阶API来在ZooKeeper中保存消费过的offset的。这是消费Kafka数据的传统方式。这种方式配合着WAL机制可以保证数据零丢失的高可靠性,但是却无法保证数据被处理一次且仅一次,可能会处理两次。因为Spark和ZooKeeper之间可能是不同步的。

Direct的同步交给spark来控制(checkpoint)
基于direct的方式,使用kafka的简单api,Spark Streaming自己就负责追踪消费的offset,并保存在checkpoint中。Spark自己一定是同步的,因此可以保证数据是消费一次且仅消费一次。

spark-kafka整合

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka_2.11 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka_2.11</artifactId>
<version>1.6.3</version>
</dependency>

面试准备-java基础

String 是最基本的数据类型吗?

不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。

int和Integer有什么区别?

自动装箱/拆箱机制

用最有效率的方法计算2乘以8?

2 << 3

数组有没有length()方法?String有没有length()方法?

答:数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。

在Java中,如何跳出当前的多重嵌套循环?

java中支持带标签的break和continue语句,作用有点类似于C和C++中的goto语句,应尽量避免使用

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。
hash code的基本思想

是否可以继承String类?

String 类是final类,不可以被继承
这个没继承过,不过看下源码有没有final关键字修饰,就知道了
补充:继承String本身就是一个错误的行为,对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。

解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。

1
String str = new String("hello");

上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而”hello”这个字面量放在静态区。

Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。

类型转换问题

short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

答:对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。

float f=3.4;是否正确?
答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。

谈谈你对反射机制的理解及其用途?

运行时探测类的信息
CLASS.forName(xxx) xxx.class xxx.getClass
程序的灵活性,
有类似API和相同行为
的类,配置到xml文件中,比如JDBC加载oracle、mysql等
一般的框架只需要在配置文件中,把配置信息改一下就可以,这样在不改变源代码的情况下就可以实现数据源的切换类似的还有logger的选择

如果要重写一个对象的equals方法,还要考虑什么?

答案:hashCode。

sizeof是Java的关键字吗?

不是。JAVA的基本数据类型大小是确定的,跟硬件及OS无关(平台无关性),没必要用sizeof

public static void写成static public void会怎样?

程序正常编译及运行。

Java支持哪种参数传递类型?

Java参数都是进行传值。对于对象而言,传递的值是对象的引用,也就是说原始引用和参数引用的那个拷贝,都是指向同一个对象。

一个类能拥有多个main方法吗?

可以,但只能有一个main方法拥有以下签名:

1
public static void main(String[] args) {}

最常见到的runtime exception

List,Set是
Map不是

启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

构造器Constructor是否可被override?

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

不能,一个对象的一个synchronized方法只能由一个线程访问。

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

会执行,在return前执行

sbt实用操作

国内镜像源

在~/.sbt/下添加一个repositories文件

1
2
3
4
5
6
7
[repositories]
local
osc: http://maven.aliyun.com/nexus/content/groups/public
typesafe: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
sonatype-oss-releases
maven-central
sonatype-oss-snapshots

国内镜像源生效

1
sbt -Dsbt.override.build.repos=true

eclipse 项目

sbt-eclipse插件

build.sbt 添加了新的依赖但是eclipse未生效

进入项目根目录下打开sbt

1
2
3
4
5
6
➜ ~ sbt -Dsbt.override.build.repos=true
update
# update 会下载新添加的依赖包,这一步好像不是必须的
sbt> update
# 重新执行eclipse
sbt> eclipse with-source=true execution-environment=JavaSE-1.8

面试准备-sparkSql

Spark RDD、DataFrame和DataSet的区别

Spark RDD、DataFrame和DataSet的区别

DataFrame = RDD + SCHEMA + (off-heap意味着JVM堆以外的内存, 这些内存直接受操作系统管理(而不是JVM)。Spark能够以二进制的形式序列化数据(不包括结构)到off-heap中, 当要操作数据时, 就直接操作off-heap内存. 由于Spark理解schema, 所以知道该如何操作)

DataFrame = DataSet[Row]

DataFrame 又是DataSet的一种

创建dataframe :

1
val dataframe = sc.createDataFrame(RowRDD,structType)

join 操作一定会产生宽依赖吗

如果RDD的每个分区最多只能被一个Child RDD的一个分区使用,则称之为narrow dependency;若多个Child RDD分区都可以依赖,则称之为wide dependency。

elasticSearch学习笔记

elasticSearch 安装与运行

1
2
3
4
5
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.tar.gz
tar -xzvf elasticsearch-5.6.3.tar.gz
cd elasticsearch-5.6.3/bin
./elasticsearch

验证安装是否成功

浏览器或者curl,wget http://localhost:9200/
正常即成功

kibana安装与运行

1
2
3
4
5
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.3-linux-x86_64.tar.gz
tar -xzvf kibana-5.6.3-linux-x86_64
cd kibana-5.6.3-linux-x86_64/bin
./kibana

kibana插件sense 主要解决curl 交互不方便
以前的安装方式 ./kibana-plugin install elastic/sense

官网的安装方法已经过时了,在es 2.x是适用的,但是5.x后其实不再需要sense插件,因为kibana 界面有dev tools

kibana 使用

访问端口 5601 http://localhost:5601/
在dev tools 进行交互

elasticSearch 基本操作

{put|get|post|delete} + json

elasticSearch 基本查询

查询全部记录

基本格式: GET /index/docment/id

GET /log/test1/_search

根据某个字段进行查询(单个) match

GET /log/test1/_search?q=name:shuai

Elasticsearch 提供了更加丰富灵活的查询语言,它被称作 Query
DSL,通过它你可以完成更加复杂、强大的搜索任务

1
2
3
4
5
6
7
8
GET /log/test1/_search
{
"query": {
"match": {
"name": "shuai"
}
}
}

根据某个字段范围查询(多个)

1
2
3
4
5
6
7
8
9
10
11
GET /log/weblog/_search
{
"query": {
"range": {
"no": {
"gte": 10,
"lte": 20
}
}
}
}
  1. gt :: 大于
  2. gte:: 大于等于
  3. lt :: 小于
  4. lte:: 小于等于

    elasticSearch 操作符及关键字

    可通过dev tools 的自动提示解决

and 查询

多字段查询

elasticSearch性能

weblog表(102537575行) 时间
hive 47.553 seconds
es 瞬间

es hive 整合

添加jar包

1
2
3
hive> add jar /opt/jars/elasticsearch-hadoop-hive-5.6.3.jar;
# Added [/opt/jars/elasticsearch-hadoop-hive-5.6.3.jar] to class path
# Added resources: [/opt/jars/elasticsearch-hadoop-hive-5.6.3.jar]

创建外部表

1
2
3
hive>CREATE EXTERNAL TABLE es_weblog(no int,ip string, time string)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'log/weblog','es.index.auto.create' = 'true','es.mapping.names' = 'no:no,ip:ip,time:time');

es.mapping.names 是建立mapping ,前面为内部表的字段,后面为外部表的字段

遇到的问题

es.mapping.names 字段对照错误

导入数据

1
hive> INSERT OVERWRITE TABLE es_weblog select no,ip,time from weblog;

这个过程是比较慢的