1、redis和mc的区别


Memcached
Memcached的优点:
Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。
支持直接配置为session handle。
坑少。
Memcached的局限性:
只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。
Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。

Redis
Redis的优点:
支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。
支持简单的事务需求,但业界使用场景很少,并不成熟。

Redis的局限性:
Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。
支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。

:)以下是我个人的补充
Mc和Redis都是Key-Value类型,不适合在不同数据集之间建立关系,也不适合进行查询搜索。比如redis的keys pattern这种匹配操作,对redis的性能是灾难。

Mogodb
mogodb是一种文档性的数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系那个的数据。这些数据具备自述性(self-describing),呈现分层的树状数据结构。redis可以用hash存放简单关系型数据。
mogodb存放json格式数据。
适合场景:事件记录、内容管理或者博客平台,比如评论系统。

nosq的产品目前很多,架构师的选择导向主要有以下两个因素:
1)适合应用程序的使用场景,比如评论系统用比较适合使用mogodb,而mc也可以实现(应用程序把数据转化成json存入,但是部分数据更新不方便)
2)团队开发比较熟悉的技术,比如一个团队一直在使用mc,因而有限选择mc,而不是redis。
还有中严重的状况,开发团队一直使用mogodb,在适合kv nosq的场景下而继续选择mogodb。

2、DataFrame和DataSet的区别

3、DataSet和RDD的区别

4、Spark Driver的作用。

5、spark任务提交流程

6、HDFS读写流程

7、HBASE读写流程

8、Yarn组件

9、MapReduce跨行读写

LineRecordReader使用了一个简单而巧妙的方法:既然无法断定每一个split开始的一行是独立的一行还是被切断的一行的一部分,那就跳过每个split的开始一行(当然要除第一个split之外),从第二行开始读取,然后在到达split的结尾端时总是再多读一行,这样数据既能接续起来又避开了断行带来的麻烦

10、Scala case class的用途

a、初始化可以不用new

b、支持模式匹配

11、IP转地区

12、Spark跟Spark Streaming的区别

13、HashMap的实现原理

14、CurrentHashMap实现原理

15、HashMap、Hashtable、CurrentHashMap的区别

16、Hbase业务场景

17、Hbase rowkey设计

18、Hbase二级索引

19、

 

 

“介绍下你做过的项目”

这个问题每个人都能回答,我问这个问题的目的,就是需要通过这问题的答案了解候选人:

  1. 在项目中独立完成了哪些事,取得了什么成绩
  2. 在项目中是如何和其他人团队协作的

在回答这个问题时,一个常见的问题是没有通过数字来量化的解释他做的事情。比如有个学生他说他去年暑假去一个单位实习,帮助写了一些Excel的脚本帮助提升了处理报表效率,我建议他可以加上具体的数字,于是他修改了以下,说在没有用他的脚本之前,公司要有专人每月花10个小时左右的时间处理报表,在用了他的脚本之后,只需要花不到3小时就可以完成。这样听起来就让人印象深刻多了。

还有一个常见问题就是太啰嗦,讲了几分钟流水账,没重点,这在我模拟面试的两个中国留学生身上比较突出,可能有语言的原因。我给他们的建议是可以先挑做的最好的项目讲,捡重点部分讲,同时在说完一件事后,可以先停下来问下面试官意见,例如说:“你对我在这个项目中做的事情有没有想要了解的?”、“我觉得我在这个项目的时候,在和同事之间合作的不错,有兴趣的话我可以给你讲讲我是怎么做的”,这样即可以增强互动,也可以掌握主动权。

“当你和团队成员有冲突时,是如何处理的?”

这是个常见问题,也是个常见场景,目的就是看你如何沟通协作的。有一个学生回答比较好,说他会先去了解背后的原因,然后再思考是不是自己的观点是错的,再和对方沟通消除分歧。

“你的职业目标是什么?”

一个有明确目标有计划的人是会更容易成功一些的,这个问题就是看候选人是不是对自己未来有明确的规划,以及针对这个目标,有没有开始制定计划,开始行动。基本上这个问题稍微准备下都能回答的不错,除了有一个同学的答案给我感觉不太好,他在说完一个职业目标后,又说了一个完全不一样的职业目标,我当时就一脸懵逼:同学你将来到底想干嘛呀?

“你是怎么打发你的业余时间的?”

每个回答这个问题的同学都很兴奋,开始滔滔不绝讲他的兴趣爱好。这个问题其实不简简单单是想了解一下你兴趣爱好,还想了解一下你这个人是不是真的热爱你的职业。比如说一个程序员,你要说业余时间就是看看电视剧玩玩游戏,也不看书也不写程序,怎么让人相信你真的喜欢编程?相反回答说自己业余时间喜欢看看技术文章,在github写点开源项目的程序员自然会加分很多。

但是也千万别自作聪明编一些故事,紧接着肯定会针对你的回答有更多问题的,比如说你github账号是什么?做过什么开源项目?作假的话,回去一看就穿帮了。

“你有没有什么问题想问我的?”

这通常是面试的最后一个问题,意味着面试要结束了,这个问题主要就是给候选人一个机会,了解一下公司的情况,或者想从面试官那得到一些建议等。正常来讲最好是问一个有准备的问题,例如:“你们公司的开发流程是什么样的?”,“能简单介绍一下你的日常工作吗?”,显得对公司重视有兴趣,也可以借此了解一下。

我在模拟面试的时候,也遇到一个学生,他问了一个自己都很难描述清楚的问题,当然也很难回答,我当时感觉就是:同学你这样连一个问题都描述不清楚,我不禁要怀疑你在工作中是不是能很好和其他人沟通了!如果正式面试中,他前面表现突出还罢了,如果表现一般,这一下基本上就决定了我不会想录用了。

 

1、 Spark 内存管理