正确答案: B
DB包括DBMS和DBS
DBS包括DB和DBMS
DBMS包括DB和DBS
不能相互包括
DBS(Database System) 包含DB(Database) 和DBMS(Database Management System)
正确答案: A
>=30
=30
<=30
=50
左边1条数据,右边与之对应的可能有多条数据
正确答案: C
支持多用户对同一文件的写操作
用户可以在文件任意位置进行修改
默认将文件块复制成三份存放
复制的文件块默认都存在同一机架上
HDFS(Hadoop File System):
Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File System)。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。
体系结构
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。
特点和目标
硬件故障
硬件故障是常态,而不是异常。整个HDFS系统将由数百或数千个存储着文件数据片段的服务器组成。实际上它里面有非常巨大的组成部分,每一个组成部分都很可能出现故障,这就意味着HDFS里的总是有一些部件是失效的,因此,故障的检测和自动快速恢复是HDFS一个很核心的设计目标。
数据访问
运行在HDFS之上的应用程序必须流式地访问它们的数据集,它不是运行在普通文件系统之上的普通程序。HDFS被设计成适合批量处理的,而不是用户交互式的。重点是在数据吞吐量,而不是数据访问的反应时间,POSIX的很多硬性需求对于HDFS应用都是非必须的,去掉POSIX一小部分关键语义可以获得更好的数据吞吐率。
大数据集
运行在HDFS之上的程序有很大量的数据集。典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
简单一致性模型
大部分的HDFS程序对文件操作需要的是一次写多次读取的操作模式。一个文件一旦创建、写入、关闭之后就不需要修改了。这个假定简单化了数据一致的问题,并使高吞吐量的数据访问变得可能。一个Map-Reduce程序或者网络爬虫程序都可以完美地适合这个模型。
移动计算比移动数据更经济
在靠近计算数据所存储的位置来进行计算是最理想的状态,尤其是在数据集特别巨大的时候。这样消除了网络的拥堵,提高了系统的整体吞吐量。一个假定就是迁移计算到离数据更近的位置比将数据移动到程序运行更近的位置要更好。HDFS提供了接口,来让程序将自己移动到离数据存储更近的位置。
异构软硬件平台间的可移植性
HDFS被设计成可以简便地实现平台间的迁移,这将推动需要大数据集的应用更广泛地采用HDFS作为平台。
名字节点和数据节点
HDFS是一个主从结构,一个HDFS集群是由一个名字节点,它是一个管理文件命名空间和调节客户端访问文件的主服务器,当然还有一些数据节点,通常是一个节点一个机器,它来管理对应节点的存储。HDFS对外开放文件命名空间并允许用户数据以文件形式存储。
内部机制是将一个文件分割成一个或多个块,这些块被存储在一组数据节点中。名字节点用来操作文件命名空间的文件或目录操作,如打开,关闭,重命名等等。它同时确定块与数据节点的映射。数据节点负责来自文件系统客户的读写请求。数据节点同时还要执行块的创建,删除,和来自名字节点的块复制指令。
名字节点和数据节点都是运行在普通的机器之上的软件,机器典型的都是GNU/Linux,HDFS是用java编写的,任何支持java的机器都可以运行名字节点或数据节点,利用java语言的超轻便性,很容易将HDFS部署到大范围的机器上。典型的部署是由一个专门的机器来运行名字节点软件,集群中的其他每台机器运行一个数据节点实例。体系结构不排斥在一个机器上运行多个数据节点的实例,但是实际的部署不会有这种情况。
集群中只有一个名字节点极大地简单化了系统的体系结构。名字节点是仲裁者和所有HDFS元数据的仓库,用户的实际数据不经过名字节点。
文件命名空间
HDFS支持传统的继承式的文件组织结构。一个用户或一个程序可以创建目录,存储文件到很多目录之中。文件系统的名字空间层次和其他的文件系统相似。可以创建、移动文件,将文件从一个目录移动到另外一个,或重命名。HDFS还没有实现用户的配额和访问控制。HDFS还不支持硬链接和软链接。然而,HDFS结构不排斥在将来实现这些功能。
名字节点维护文件系统的命名空间,任何文件命名空间的改变和或属性都被名字节点记录。应用程序可以指定文件的副本数,文件的副本数被称作文件的复制因子,这些信息由命名空间来负责存储。
数据复制
HDFS设计成能可靠地在集群中大量机器之间存储大量的文件,它以块序列的形式存储文件。文件中除了最后一个块,其他块都有相同的大小。属于文件的块为了故障容错而被复制。块的大小和复制数是以文件为单位进行配置的,应用可以在文件创建时或者之后修改复制因子。HDFS中的文件是一次写的,并且任何时候都只有一个写操作。
名字节点负责处理所有的块复制相关的决策。它周期性地接受集群中数据节点的心跳和块报告。一个心跳的到达表示这个数据节点是正常的。一个块报告包括该数据节点上所有块的列表。
副本位置:第一小步
块副本存放位置的选择严重影响HDFS的可靠性和性能。副本存放位置的优化是HDFS区分于其他分布式文件系统的的特征,这需要精心的调节和大量的经验。机架敏感的副本存放策略是为了提高数据的可靠性,可用性和网络带宽的利用率。副本存放策略的实现是这个方向上比较原始的方式。短期的实现目标是要把这个策略放在生产环境下验证,了解更多它的行为,为以后测试研究更精致的策略打好基础。
HDFS运行在跨越大量机架的集群之上。两个不同机架上的节点是通过交换机实现通信的,在大多数情况下,相同机架上机器间的网络带宽优于在不同机架上的机器。
在开始的时候,每一个数据节点自检它所属的机架id,然后在向名字节点注册的时候告知它的机架id。HDFS提供接口以便很容易地挂载检测机架标示的模块。一个简单但不是最优的方式就是将副本放置在不同的机架上,这就防止了机架故障时数据的丢失,并且在读数据的时候可以充分利用不同机架的带宽。这个方式均匀地将复制分散在集群中,这就简单地实现了组建故障时的负载均衡。然而这种方式增加了写的成本,因为写的时候需要跨越多个机架传输文件块。
默认的HDFS block放置策略在最小化写开销和最大化数据可靠性、可用性以及总体读取带宽之间进行了一些折中。一般情况下复制因子为3,HDFS的副本放置策略是将第一个副本放在本地节点,将第二个副本放到本地机架上的另外一个节点而将第三个副本放到不同机架上的节点。这种方式减少了机架间的写流量,从而提高了写的性能。机架故障的几率远小于节点故障。这种方式并不影响数据可靠性和可用性的限制,并且它确实减少了读操作的网络聚合带宽,因为文件块仅存在两个不同的机架, 而不是三个。文件的副本不是均匀地分布在机架当中,1/3在同一个节点上,1/3副本在同一个机架上,另外1/3均匀地分布在其他机架上。这种方式提高了写的性能,并且不影响数据的可靠性和读性能。
Ref
block是最大的单位,它值最终存储于DataNode上的数据块,由dfs.block.size参数决定,默认是128M
packet是一个在block之下的存储单位,他是数据由DFSClient流向DataNode的一个包,以dfs.write.packet.size参数为参考值。默认为64k
3,chunk是最小的一个单位,他是最小的一个单位,他是DFSClient到DataNode数据传输中进行数据校验的一个小块,由io.bytes.per.checksum参数决定,默认是512字节,事实上一个chunk还包含一个4byte的校验和,因此写入packet中为512数据与校验值得比值为128:1,所以对于一个128M的block会有一个1m的校验文件与之对应
写入过程:
写入过程
1.在写入的过程中DFSOutputStream中有一个缓冲区,他默认是4608也就是4.5k相当于9个chunk(之前的好像是一个chunk)如果超出这个缓冲区,他会计算校验和值,然后然后填进packet里
2.当一个chunk填塞进入packet后,仍然不会立即发送,而是积累到一个packet填满后,将这个packet放入dataqueue队列
3.进入dataqueue队列的packet会被另一个线程按序取出发送到datanode;
首先客户端通过DistributedFileSystem对象调用create()函数来新建文件(步骤一)。DistributedFIleSystem对NameNode创建一个RPC调用,在文件系统的命名空间创建一个文件,此时该文件中还没有相应的数据块(步骤二)。namenode执行各种不同的检查一确保这个文件不存在以及客户端有新建该文件的权限。如果这些检查均通过,namenode就会为创建新文件记录一条记录;否则,文件创建失败并向客户端抛出一个IOException异常。DistributedFileSystem向客户端返回一个FSDataOutputStream对象,由此客户端可以开始写入数据。就像读取事件一样,FSDataOutputStream封装一个DFSoutputstream对象,该对象负责处理datanode和namenode之间的通信。
在客户端写入数据时(步骤三),DFSOutputStream将他分成一个个的数据包,并写入内部队列,成为"数据队列”(data queue)。DataStreamer处理数据队列,他的负责是根据datanode列表来要求namenode分配适合的新块来存储数据的副本。这一组datanode构成存储数据包并将他发送给管线中的第二个datanode。同样,第二个datanode存储该数据包并且发送给管线中的第三个(也就是最后一个)datanode(步骤四)
DFSOutputStream也维护着一个内部数据包队列来等待datanode的收到确认回执,成为“确认队列”(ack queue).收到管道中所有datanode确认信息后,该数据包才会确认队列删除(步骤五)
如果在数据写入期间datanode发生故障,则执行以下操作(对写入的数据的客户端是透明的)。首先关闭管道,确认包队列中的数据包都添加回数据队列的最前端,以确保故障节点下游的datanode不会漏掉任何一个数据包。为存储在另一个正常的datanode的数据块指定一个新的标识,并将该标识传递给namenode,以便故障datanode在恢复后可以删除存储的部分数据块。从管线中删除故障数据节点并把余下的数据块写入管线中另外两个正常的datanode。namenode注意到块副本量不足时,会在另一个节点上创建一个新的复本,后续的数据块继续正常接受处理。
在一个块被写入期间可能会有多个datanode同时发生故障,但非常少见。只要写入了dfs.replication.min的副本书(默认为一),写入操作就会成功,并且这个块可以在集群中异步复制,直到达到其目标复本数(默认三个复本)
客户端完成数据的写入后,对数据流调用close()方法(步骤六),该操作将剩余的所有数据包写入datanode管线,并在联系到namenode已经知道文件后那些块组成(通过datastreamer请求分配数据块),所以他在返回成功前只需要等待数据块进行最小量的复制(步骤7)
正确答案: B
cat “乐信” filename | wc -l
grep “乐信” filename | wc -l
cat “乐信” filename | wc -w
grep “乐信” filename | wc -w
语法:wc [选项] 文件
该命令各选项含义如下:
cat:合并文件或者查看文件内容
grep:文本过滤工具
正确答案: D
不能有两个
不能成为另一个关系的外部键
可以重复
不允许空值
正确答案: A
Rank()
DENSE_RANK()
ROW_NUMBER()
全部错误
rank():跳跃排序,相同数据排名相同,存在重复值。eg:1,1,3
dense_rank():连续排序。eg:1,1, 2
row_number():先查出的排序在前,没有重复值
正确答案: B
Delete from table1 where status=2
Delete from table1 a where a.status=2
Delete a from table1 a where a.status=2
truncate table table1
delete使用别名的时候,要在delete和from间加上删除表的别名,参考C选项。
正确答案: C
树
图
关系
索引
正确答案: A B D
a
(a,b)
(b,c)
(a,c)
根据查询字段的位置不同来决定,如查询a, a,b a,b,c a,c 都可以走索引的,其他条件的查询不能走索引。
组合索引 有“最左前缀”原则。就是只从最左面的开始组合,并不是所有只要含有这三列存在的字段的查询都会用到该组合索引。
索引相关问题总结Ref
创建索引
在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
PRIMARY KEY索引和UNIQUE索引非常类似。
事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。
下面的SQL语句对students表在sid上添加PRIMARY KEY索引。
ALTER TABLE students ADD PRIMARY KEY (sid)
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
其中,前两条语句是等价的,删除掉table_name中的索引index_name。
第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。
MySql在建立索引优化时需要注意的问题
设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率。设计MySql索引的时候有一下几点注意:
创建索引
对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。
但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。
复合索引
比如有一条语句是这样的:select * from users where area=’beijing’ and age=22;
如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。
因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减(像字典一样)。
索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
排序的索引问题
mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
不要在列上进行运算
select * from users where
YEAR(adddate)
不使用NOT IN
NOT IN都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替
以下有关SQL性能优化正确的是
正确答案: A B C D
sql需要避免在索引字段上使用函数
避免在WHERE子句中使用in,not in , 可以使用exist和not exist代替
将对于同一个表格的多个字段的操作写到同一个sql中, 而不是分开成两个sql语句实现
避免建立索引的列中使用空值
正确答案: A B D
Storm
Flink
Hive
Spark Streaming
正确答案: A C D
堆排序
冒泡排序
快速排序
归并排序
(1) HDFS
(2) MapReduce
(3) Yarn
用于存储HDFS,用于计算的MR,用于任务调度的yarn
(1) 动态规划
(2) 回溯法
(3) 分支限界法
Ref1:动态规划、回溯法
Ref2:分支界限法
(1) 上钻
(2) 下钻
(3) 切片
(4)旋转等操作
联机分析处理OLAP是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。OLAP 让用户能够从不同的角度感知数据否情况。
1)上钻下钻主要是让用户能够从不同的粒度感知数据,比如时间上的年,月,日
2)切片和切块是指固定某些维度后,在剩余的维度看数据,若剩下二维则是切片,若剩下三维则为切块。比如从城市,产品,销量三个维度来看数据
3)旋转是指改变维的方向,即在表格中重新安排维的位置(如行列互换)
----------《系统分析师考试辅导》(清华大学出版社)
首字符d表示文件夹,-表示文件
rwx — 3位二进制
rw — 110 —6
r-- —100 4
r-- —100 4
表示为644
【文件或文件夹】【owner权限】【group权限】【others权限】
此文件夹的所有者可以读写,用户组和其他用户只读
1.说出具体聚类算法并叙述具体处理过程可以给10分
2.说出地址分词和聚类算法并叙述具体处理过程可以给15分
3.如符合以下描述可以给20分
首先收货地址可以解析出对应的经纬度,按照经纬度可以划分出1200m600m的很多网格,取出来最近半年的该网格的所有的地址,首先利用dbscan剔除噪声点,然后对地址分词,利用tfidf把地址转化为向量,再利用Kmeans聚类。 输入:簇的数目k和包含n个对象的数据集。 输出:k个簇,使平方误差准则最小*。 步骤: i.任意选择k个对象作为初始的簇中心; ii.计算其它对象与这k个中心的距离,然后把每个对象归入离它“最近”的簇; iii.计算各簇中对象的平均值,然后重新选择簇中心(离平均值“最近”的对象值); 重复第2第3步直到簇中心不再变化为止。
Note: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。
DBSCAN中的几个定义:
Ε邻域:给定对象半径为Ε内的区域称为该对象的Ε邻域;
核心对象:如果给定对象Ε邻域内的样本点数大于等于MinPts,则称该对象为核心对象;
直接密度可达:对于样本集合D,如果样本点q在p的Ε邻域内,并且p为核心对象,那么对象q从对象p直接密度可达。
密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p= p1,q= pn,假如对象pi从pi-1直接密度可达,那么对象q从对象p密度可达。
密度相连:存在样本集合D中的一点o,如果对象o到对象p和对象q都是密度可达的,那么p和q密度相联。
可以发现,密度可达是直接密度可达的传递闭包,并且这种关系是非对称的。密度相连是对称关系。DBSCAN目的是找到密度相连对象的最大集合。
Eg: 假设半径Ε=3,MinPts=3,点p的E邻域中有点{m,p,p1,p2,o}, 点m的E邻域中有点{m,q,p,m1,m2},点q的E邻域中有点{q,m},点o的E邻域中有点{o,p,s},点s的E邻域中有点{o,s,s1}.
那么核心对象有p,m,o,s(q不是核心对象,因为它对应的E邻域中点数量等于2,小于MinPts=3);
点m从点p直接密度可达,因为m在p的E邻域内,并且p为核心对象;
点q从点p密度可达,因为点q从点m直接密度可达,并且点m从点p直接密度可达;
点q到点s密度相连,因为点q从点p密度可达,并且s从点p密度可达。
DBSCAN算法描述:
输入: 包含n个对象的数据库,半径e,最少数目MinPts;
输出:所有生成的簇,达到密度要求。
(1)Repeat
(2)从数据库中抽出一个未处理的点;
(3)IF抽出的点是核心点 THEN 找出所有从该点密度可达的对象,形成一个簇;
(4)ELSE 抽出的点是边缘点(非核心对象),跳出本次循环,寻找下一个点;
(5)UNTIL 所有的点都被处理。
DBSCAN对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数的选择无规律可循,只能靠经验确定。
好处
缺点
1.直接对整个文件使用脚本排序得5分
2.使用快速排序等高效率算法排序得10分
3.分割文件排序再合并排序得15分
4.考虑cpu,内存等额外加5分 其他思考得档酌情给分