PHP中高级面试题 – 第三天一、简述一下MongoDB的应用场景
mongodb 支持副本集、索引、自动分片,可以保证较高的性能和可用性 。
更高的写入负载
默认情况下,MongoDB 更侧重高数据写入性能,而非事务安全,MongoDB 很适合业务系统中有大量 “低价值” 数据的场景 。但是应当避免在高事务安全性的系统中使用 MongoDB,除非能从架构设计上保证事务安全 。
高可用性
MongoDB 的复副集 (Master-Slave) 配置非常简洁方便,此外,MongoDB 可以快速响应的处理单节点故障,自动、安全地完成故障转移 。这些特性使得 MongoDB 能在一个相对不稳定(如云主机)的环境中 , 保持高可用性 。
数据量很大或者未来会变得很大
依赖数据库 (MySQL) 自身的特性,完成数据的扩展是较困难的事,在 MySQL 中,当一个单达表到 5-10GB 时会出现明显的性能降级,此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用 MySQL 通常需要借助驱动层或代理层完成这类需求 。而 MongoDB 内建了多种数据分片的特性,可以很好地适应大数据量的需求 。
基于位置的数据查询
MongoDB 支持二维空间索引,因此可以快速及精确地从指定位置获取数据 。
表结构不明确
在一些传统 RDBMS 中 , 增加一个字段会锁住整个数据库 / 表,或者在执行一个重负载的请求时会明显造成其它请求的性能降级 。通常发生在数据表大于 1G 的时候(当大于 1TB 时更甚) 。因 MongoDB 是文档型数据库,为非结构货的文档增加一个新字段是很快速的操作,并且不会影响到已有数据 。另外一个好处当业务数据发生变化时,是将不再需要由 DBA 修改表结构 。
二、数据库设计经验 , 为什么进行分表?分库?一般多少数据量开始分表?分库?分库分表的目的?
1、为什么要分表
当一张表的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了 。分表的目的就在于此,减小数据库的负担,缩短查询时间 。日常开发中我们经常会遇到大表的情况 , 所谓的大表是指存储了百万级乃至千万级条记录的表 。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长 , 性能低下 , 如果涉及联合查询的情况 , 性能会更加糟糕 。
分表和表分区的目的就是减少数据库的负担 , 提高数据库的效率,通常点来讲就是提高表的增删改查效率 。数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地 , 数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈 。
2、分表的方案
做 mysql 集群,有人会问 mysql 集群,根分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担,说白了就是减少 sql 排队队列中的 sql 的数量,举个例子:有 10 个 sql 请求 , 如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这 10 个 sql 请求,分配到 5 个数据库服务器的排队队列中,一个数据库服务器的队列中只有 2 个,这样等待时间是不是大大的缩短了呢?
linux mysql proxy 的安装 , 配置,以及读写分离
mysql replication 互为主从的安装及配置,以及数据同步
优点:扩展性好,没有多个分表后的复杂操作(php 代码)
缺点:单个表的数据量还是没有变 , 一次操作所花的时间还是那么多,硬件开销大 。
三、简述一下数据库主从复制,读写分离
* 什么是主从复制
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;
* 主从复制的原理:
1.数据库有个bin-log二进制文件,记录了所有的sql语句 。
2.只需要把主数据库的bin-log文件中的sql语句复制 。
3.让其从数据的relay-log重做日志文件中再执行一次这些sql语句即可 。
* 主从复制的作用
1.做数据的热备份,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失 。
2.架构的扩展 。业务量越来越大 , I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问频率,提高单机的I/O性能
3.主从复制是读写分离的基?。?使数据库能制成更大 的并发 。例如子报表中 , 由于部署报表的sql语句十分慢,导致锁表,影响前台的服务 。如果前台服务使用master , 报表使用slave,那么报表sql将不会造成前台所,保证了前台的访问速度 。
* 主从复制的几种方式:
1.同步复制:所谓的同步复制,意思是master的变化,必须等待slave-1,slave-2,…,slave-n完成后才能返回 。
2.异步复制:如同AJAX请求一样 。master只需要完成自己的数据库操作即可 。至于slaves是否收到二进制日志 , 是否完成操作,不用关心 。MYSQL的默认设置 。
3.半同步复制:master只保证slaves中的一个操作成功,就返回,其他slave不管 。
这个功能,是由google为MYSQL引入的 。
* 关于读写分离
在完成主从复制时,由于slave是需要同步master的 。所以对于insert/delete/update这些更新数据库的操作,应该在master中完成 。而select的查询操作 , 则落下到slave中 。
常见大数据公司面试问题有哪些?1、您对“大数据”一词有什么了解?
答: 大数据是与复杂和大型数据集相关的术语 。关系数据库无法处理大数据,这就是为什么使用特殊的工具和方法对大量数据执行操作的原因 。大数据使公司能够更好地了解其业务,并帮助他们从定期收集的非结构化和原始数据中获取有意义的信息 。大数据还使公司能够根据数据做出更好的业务决策 。
2、告诉我们大数据和Hadoop之间的关系 。
答: 大数据和Hadoop几乎是同义词 。随着大数据的兴起,专门用于大数据操作的Hadoop框架也开始流行 。专业人士可以使用该框架来分析大数据并帮助企业做出决策 。
注意: 在大数据采访中通常会问这个问题 。可以进一步去回答这个问题 , 并试图解释的Hadoop的主要组成部分 。
3、大数据分析如何有助于增加业务收入?
答:大数据分析对于企业来说已经变得非常重要 。它可以帮助企业与众不同 , 并增加收入 。通过预测分析,大数据分析为企业提供了定制的建议 。此外 , 大数据分析使企业能够根据客户的需求和偏好推出新产品 。这些因素使企业获得更多收入,因此公司正在使用大数据分析 。通过实施大数据分析,公司的收入可能会大幅增长5-20% 。一些使用大数据分析来增加收入的受欢迎的公司是-沃尔玛,LinkedIn,Facebook,Twitter,美国银行等 。
大数据面试题以及答案整理(一)一、Map端php大数据处理面试题的shuffle
Map端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是HDFS 。每个Mapphp大数据处理面试题的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫做spill 。
在spill写入之前,会先进行二次排序,首先根据数据所属的partition进行排序 , 然后每个partition中的数据再按key来排序 。partition的目的是将记录划分到不同的Reducer上去,以期望能够达到负载均衡 , 以后的Reducer就会根据partition来读取自己对应的数据 。接着运行combiner(如果设置了的话) , combiner的本质也是一个Reducer,其目的是对将要写入到磁盘上的文件先进行一次处理 , 这样,写入到磁盘的数据量就会减少 。最后将数据写到本地磁盘产生spill文件(spill文件保存在{mapred.local.dir}指定的目录中,Map任务结束后就会被删除) 。
最后,每个Map任务可能产生多个spill文件,在每个Map任务完成前,会通过多路归并算法将这些spill文件归并成一个文件 。至此,Map的shuffle过程就结束了 。
二、Reduce端的shuffle
Reduce端的shuffle主要包括三个阶段,copy、sort(merge)和reduce 。
首先要将Map端产生的输出文件拷贝到Reduce端,但每个Reducer如何知道自己应该处理哪些数据呢php大数据处理面试题?因为Map端进行partition的时候,实际上就相当于指定了每个Reducer要处理的数据(partition就对应了Reducer),所以Reducer在拷贝数据的时候只需拷贝与自己对应的partition中的数据即可 。每个Reducer会处理一个或者多个partition,但需要先将自己对应的partition中的数据从每个Map的输出结果中拷贝过来 。
接下来就是sort阶段 , 也称为merge阶段,因为这个阶段的主要工作是执行了归并排序 。从Map端拷贝到Reduce端的数据都是有序的,所以很适合归并排序 。最终在Reduce端生成一个较大的文件作为Reduce的输入 。
最后就是Reduce过程了,在这个过程中产生了最终的输出结果,并将其写到HDFS上 。
读php大数据处理面试题:
1、跟namenode通信查询元数据,找到文件块所在的datanode服务器
2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流
3、datanode开始发送数据(从磁盘里面读取数据放入流 , 以packet为单位来做校验)
4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件
写:
1、与namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
2、namenode返回是否可以上传
3、client请求第一个 block该传输到哪些datanode服务器上
4、namenode返回3个datanode服务器ABC
5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端
6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器
PHP面试题2--常用的数组函数一,数组操作的基本函数
1. 数组的键名与值
array_values($arr);获得数组的值
array_keys($arr); 获得数组的键名
array_flip($arr); 数组的值与键名互换(如果有重复前面的会被后面的覆盖)
in_array("apple",$arr); 在数组中检索apple
array_search("apple",$arr); 在数组中检索apple,如果存在返回键名
array_key_exists("apple",$arr); 检索给定的键名是否存在数组中
isset($arr["apple"]); 检索给定的键名是否存在数组中
array_unique() 删除数组中的重复值
2. 数组的内部指针
current($arr); 返回数组中的当前单元
pos($arr); 返回数组中的当前单元
key($arr); 返回数组中的当前单元的键名
prev($arr); 将数组中的内部指针倒回一位
next($arr); 将数组中的内部指针向前移动一位
end($arr);将数组中的内部指针指向最后一单元
reset($arr); 将数组中的内部指针指向第一单元
each($arr); 将返回数组当前元素的一个键/值的构造数组,并使数组指针向前移动一位
list($key,$value) = each($arr); 获得数组当前元素的键名和值
3. 数组和变量之间的转换
extract(array,extract_rules,prefix); 函数从数组中将变量导入到当前符号表 。该函数使用数组键名作为变量名,使用数组键值作为变量值 。针对数组中的每个元素,将在当前符号表中创建对应的一个变量 。
compact(var1,var2...); 创建一个包含变量名和它们的值的数组 。任何没有变量名与之对应的字符串都被略过 。
二,数组的分段和填充
1. 数组的分段
array_slice(array,start,length,preserve); 返回数组中的选定部分 。如果数组中有字符串键名,返回的数组将保留键名 。
array_splice(array1,start,length,array2); 从数组中移除选定的元素,并用新元素取代它 。函数返回被移除元素的数组 , 如果函数没有移除任何元素(length=0),则替代数组将从start参数的位置插入 。不保留替代数组的键名 。
2. 数组的分割
array_chunk(array,size,preserve_keys); 把一个数组分割为新的数组块 。
3. 数组的填充
array_pad(array,size,value); 将指定数量的带有指定值的元素插入到数组 。如果将size参数设置为负数 , 该函数会在原始数组之前插入新的元素 。如果size参数小于原始数组的长度,该函数不会删除任何元素 。
三,数组与栈
array_push(array,value1,value2...); 向数组尾部插入一个或多个元素 。即使数组有字符串键名,添加的元素将是数字键名 。
array_pop(array); 删除数组的最后一个元素 。返回值是数组的最后一个值 , 即 , 被删除的元素值 。如果数组为空 , 或者不是一个数组,将返回NULL 。
四,数组和队列
array_shift(array); 用于删除数组中的第一个元素,并返回被删除的元素 。如果键名是数字,所有的元素都将获得新的键名,从0开始 , 并以1递增 。
array_unshift(array,value1,value2,value3...); 用于向数组插入新元素,新数组的值将被插入到数组的开头 。数值键名将从0开始 , 以1递增 。字符串键名将保持不变 。
五 , 回调函数
array_walk(array,myfunction,parameter...); 将数组中的每个元素应用到 用户自定义函数 。在函数中,数组的键名和键值是参数 。可以通过把用户自定义函数的第一个参数指定为引用:$value,来改变数组元素的值 。
array_map(myfunction,array1,array2,array3...); 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新的值的数组 。myfunction可以为null
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ); 用回调函数过滤数组中的元素 。该函数把输入数组中的每个键值传给回调函数 。如果回调函数返回true,则把输入数组中的当前键值返回给结果数组,数组键名保持不变 。
array_reduce(array,myfunction,initial); 函数发送数组中的值到用户自定义函数,并返回一个字符串 。如果数组是空的或者初始值未传递,该函数返回null 。initial为可?。?规定发送到函数处理的第一个值 。
六,数组的计算
1. 数组元素的求和
array_sum(array); 返回数组中的所有值的和
2. 数组的合并
array_merge(array1,array2,array3...); 用于把一个或多个数组合并成一个数组 。如果两个或更多个数组有相同的键名 。则最后的数组会覆盖其他数组 。如果向函数输入了一个数组 , 且键名是整数,则该函数会返回带有整数键名的新数组,其键名以0开始进行重新索引 。
array_merge_recursive(array1,array2,array3...); 用于把一个或多个数组合并为一个数组,该函数与array_merge()函数之间的不同是在处理两个或多个数组元素有相同的键名的情况下 , array_merge_recursive()不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组 。如果您仅仅向 array_merge_recursive() 函数输入一个数组 , 结果与 array_merge() 相同 。
3. 数组的差集
array_diff(array1,array2,array3...); 函数用于比较两个(或更多个)数组的值,并返回差集 。该函数比较两个(或更多个)数组的值(key=value中的value),并返回一个差集数组 , 该数组包括了所有在被比较的数组(array1)中,但是不在任何其他参数数组(array2或array3等等)中的值 。
array_diff_assoc(array1,array2,array3...); 函数用于比较两个(或更多个)数组的键名和键值,并返回差集 。该函数比较两个(或更多个)数组的键名和键值 , 并返回一个差集数组,该数组包括了所有在被比较的数组(array1)中 , 但是不在任何其他参数数组(array2 或 array3 等等)中的键名和键值 。
4. 数组的并集
array_intersect(array1,array2,array3...); 函数用于比较两个(或更多个)数组的键值,并返回交集 。该函数比较两个(或更多个)数组的键值,返回一个交集数组,该数组包括了所有在被比较的数组(array1)中,同时也在任何其他参数数组(array2 或 array3 等等)中的键值 。
array_intersect_assoc(array1,array2,array3...); 函数用于比较两个(或更多个)数组的键名和键值,并返回交集 。该函数比较两个(或更多个)数组的键名和键值,并返回一个交集数组,该数组包括了所有在被比较的数组(array1)中,同时也在任何其他参数数组(array2 或 array3 等等)中的键名和键值 。
七,数值的排序
array_multisort():对多个数组或多维数组进行排序
sort(): 以升序对数组排序
rsort(): 以降序对数组排序
asort(): 根据值,以升序对关联数组进行排序
ksort(): 根据键,以升序对关联数组进行排序
arsort(): 根据值,以降序对关联数组进行排序
krsort(): 根据键,以降序对关联数组进行排序
资料参考:
php处理大数据量的时候,如图片 有什么致命的缺陷?面试问题效率问题 。因为php是脚本解释语言,其特点在于易上手和部署,但在处理需要大量cpu的操作时(图片就是)就力不从心了,如果写成php扩展的话效率会提升,但还是没直接执行C/C的程序快
不好实现多线程 。这个就不用多说了,和语言定位有关,虽然可以异步调用,但毕竟不是强项 。
谁有面试phper的经验这方面网上有比较多php大数据处理面试题的,针对3-5年的PHPer常见的面试题 , 参考如下:
1、平时喜欢哪些php书籍及博客?CSDN、虎嗅、猎云
2、js闭包是什么?
3、for与foreach哪个更快?
4、php鸟哥是谁?能不能讲一下php执行原理?
5、php加速器有哪些?apc、zend、xcache.....能不能讲一下它的加速原理?
6、Node.js能彻底代替php apache是扯淡 。
7、怎样判断一个值是否存在于数组中?in_array(),array_key_exists,......
8、怎样判断select语句中是否使用php大数据处理面试题了索引?explain
9、sphinx的中文分词词库使用第三方库还是自己建库?
10、如果一个被面试者经验少、基础差,此时却问些高深的知识 。要怀疑它的稳定性 , 可以提问加班对他会不会有抵触 。
11、mysql与mysqli的区别有哪些?
12、将来的发展方向?安全、还是数据挖掘、大数据处理?
13、php的面向对象:类的修饰符、封装、继承、多态体现方面
14、php 多态是什么?
15、Type Hinting:
16、php的设计模式:单例模式、工厂模式、生产者模式......等23种
17、服务器状态码:200、202、301、404、500......
18、i与i的区别?
19、项目开发:电商项目中的购物车数据持久化、考试系统的安全性考虑、
20、mysql设计基?。喝蠓妒健⒐δ?思维导图、创建表的第一字段是什么?
21、mysql字段char、varchar、int、smallint、tinyint、mediumint、bigint、decimal、double、float字节数及应用场景 。
22、memcache与mongoDB、Redis各自的使用场景是什么?
23、为什么mongoDB与Redis非但没有形成竞争反而是互补关系?
24、Redis数据类型有哪些?int、string、hash、set、list ?
25、安装linux软件时使用make方式还使用yum方式?
26、linux网络优化:查看进程ps -aux|grep mysqld、怎样查看最大文件打开数?
27、C语言中的虚函数是什么?
28、1条微薄要推送给100万个粉丝该怎么处理?
29、知道哪些算法?冒泡排序?快速排序?二分查找法?
30、yii thinkphp ci 各自优点
31、php 设计模式有哪些?
32、c 排序算法有哪些?
33、php 基本结构是什么?
34、memcache magent 分布式设计?
35、redis 分布式设计,如何设计?
36、mongo 集群架构是怎样的?
37、mysql 索引原理及sql性能优化
38、tcp/ip 网络协议,osi7层指是什么?
39、php 处理大数据业务
40、linux 应用 负载性能查看 ?
41、nginx 实战优化业务功能 ?
42、谈一下近三年来你的得意之作?
43、看看简历,会问一些过去做的项目的用户量、pv、吞吐量、相关难点和解决方法等
44、数据库设计经验,为什么进行分表? 分库?
45、一般多少数据量开始分表? 分库? 分库分表的目的? 什么是数据库垂直拆分? 水平拆分? 分区等等?可以举例说明
46、数据库优化有哪些? 分别需要注意什么?
47、web开发方面会遇到哪些缓存? 分别如何优化?
48、给你256M的内存,对10G的文件进行排序(文件每行1个数字),如何实现?
49、对10G的文件进行查找如何实现?
50、统计10G文件每个关键字出现的次数如何实现?
51、假如你现在是12306火车订票的设计师,你该如何设计满足全国人民订票?
52、假如有1亿用户的访问量,你的服务器架构是怎样的? 用户信息的存储方案如何设计?
53、如果你是技术组长,所带团队任务进度无法完成你该如何解决?
54、如果在进度排满的前提下插入任务,你该如何保证总进度不延期?
55、如果有的工程师今天预定任务没有完成,你该如何解决?
56、从你的经验方面谈一下如何构建高性能web站点? 需要哪些环节? 步骤? 每个步骤需要注意什么如何优化等?
57、为什么要对数据库进行主从分离?
58、如何处理多服务器共享session?
59、一个10G的表,你用php程序统计某个字段出现的次数,思路是?
60、会告诉你一个nginx日志例子,用你认为最佳的编程语言统计一下http响应时间超过1秒的前10个url?
61、给你一个mysql配置文件,用你认为最佳的编程语言解析该文件?
62、给你两个路径a和b,写一个算法或思路计算a和b差距几层并显示a和b的交集?
63、给你一个url,在nginx配置一下rewrite指定到某个具体路径?
64、一个php文件的解释过程是? 一般加速php有哪些? 提高php整体性能会用到哪些技术?
65、session和cookie生存周期区别? 存储位置区别?
66、require、include、require_once、include_once区别? 加载区别? 如果程序按需加载某个php文件你如何实现?
67、chrome号称为多线程的,所以多线程和多进程的区别为?
68、php在2011年底出现hash碰撞,hash碰撞原理为? 如何进行修复?
69、web不安全因素有哪些? 分别如何防范?
70、假如两个单链表相交,写一个最优算法计算交点位置,说思路也可以?
71、假如你是技术组长? 如何提高团队效率?
72、nginx负载均衡有哪些? 如果其中一台服务器挂掉,报警机制如何实现?
73、不优化前提下,apache一般最大连接数为? nginx一般最大连接数为? mysql 每秒insert ? select ? update ? delete?
74、mysql 数据类型有哪些 ? 分别占用多少存储空间 ?
75、nginx设置缓存js、css、图片等信息,缓存的实现原理是?
76、如何提高缓存命中率? 如何对缓存进行颗粒化?
77、php的内存回收机制是?
78、我的所有问题都问完了(当然没有这么多),你有什么问题问我没有?
【php大数据处理面试题 php 大数据框架】php大数据处理面试题的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于php 大数据框架、php大数据处理面试题的信息别忘了在本站进行查找喔 。
推荐阅读
- 非鸿蒙手机智慧生活怎么用,非华为手机智慧生活
- 电视卫视为什么不好看了,电视怎么看不了卫视台
- 关于益智棋牌游戏的信息
- ppt怎么调时间显示不出来的,PPT怎么不显示时间
- mysql怎么对表插入列 mysql在表里添加一列
- 关于chatgpt英文新闻稿,全英文新闻稿
- idcsync如何获取mysql增量数据,mysql 获取自增长的值
- 关于棋牌游戏导演的信息
- c语言比较字符大小的函数 c语言中如何比较字符大小