面试心经02--大数据开发工程师

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 面试心经02--大数据开发工程师

一,hive数据库

 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。Hive支持HSQL,是一种类SQL。

1,Hive在HDFS上的默认存储路径

 默认有一个根目录,在hive-site.xml中,由参数hive.metastore.warehouse.dir指定。默认值为/user/hive/warehouse.

2,显示当前数据库的名称

数据库很多的环境下工作,显示当前数据库的名称,方便操作。
设置参数:
    set hive.cli.print.current.db=true
查询语句:
    prompt     //显示当前数据库名称

3,hive的表操作

重命名:更改表名
    ALTER TABLE table_name RENAME TO new_table_name;
增加列:ADD 是代表新增一字段
    alter table table_name add columns(字段名 string);
更新列:更新字段类型
    alter table table_name change column 字段名 desc int;
替换列:表示替换表中所有字段
    alter table table_name replace columns(deptno string, dname  string, loc string); 

4,hive的删除操作

默认情况下,Hive不允许删除一个里面有表存在的数据库,如果想删除数据库,要么先将数据库中的表全部删除,要么可以使用CASCADE关键字,使用该关键字后,Hive会自己将数据库下的表全部删除。RESTRICT关键字就是默认情况,即如果有表存在,则不允许删除数据库。
(1)先把表删干净,再删库
(2)删库时在后面加上cascade,表示级联删除此数据库下的所有表:drop database if exists foo cascade; 

5,内部表和外部表

Hive中的表分为内部表(MANAGED_TABLE)和外部表(EXTERNAL_TABLE)。
区别:
    (1)Hive中的表分为内部表(MANAGED_TABLE)和外部表(EXTERNAL_TABLE)。
    (2)外部表DROP时候不会删除HDFS上的数据;
应用场景:
    (1)内部表:Hive中间表、结果表、一般不需要从外部(如本地文件、HDFS上load数据)的情况。
    (2)外部表:源表,需要定期将外部数据映射到表中。

二,Impala

Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中。并且impala兼容Hive的sql解析,实现了Hive的SQL语义的子集,功能还在不断的完善中。Impala不需要把中间结果写入磁盘,省掉了大量的I/O开销。
impala的查询方式有:通过impala-shell脚本窗口执行查询命令,通过hue的可视化界面查询,通过jdbc或者odbc查询。jdbc的使用,由于Impala并没有把相关的驱动包发布到maven,因此如果想要使用,就需要手动下载jar包,上传到私库中。

1,Impala的三个进程

(1)Impalad:impalad是impala主要的工作计算进程,负责接收client的请求,变成协调者角色,然后解析查询请求,拆分成不同的任务分发给其他的Impalad节点进程。每个Impalad工作节点进程接收到请求后,开始执行本地查询(比如查询hdfs的datanode或者hbase的region server),查询结果返回给协调者。协调者搜集到请求数据合并返回给client。每个Impalad又包含三种角色,当接收到client的请求时,由planner解析查询sql,拆分成一个个可以并行的小任务;然后通过coordinator发送给其他的节点;其他的节点接收请求后,由excutor执行本地查询。
(2)StatStore:状态管理进程,负责搜集各个节点的健康状况,当某个节点挂掉时,负责通知其他的节点不要往这个节点发送任务。statestore由于只负责状态通知,因此当这个进程挂掉并不影响impalad查询,只是可能会发送任务到挂掉的节点,集群的鲁棒性差一些而已。
(3)Catalog:元数据变化同步进程,由于每个impalad都可以作为coordinator角色,那么当一个节点接收到数据变更,比如alter指令,其他的节点如何知晓呢?就可以通过catalog来同步,每个节点的变化都通知给catlog进程,它再同步给其他的节点,每个节点都维护一份最新的元数据信息,这样就不怕查询的数据不一致了。

2,Impala相对于Hive所使用的优化技术

(1)没有使用 MapReduce进行并行计算,虽然MapReduce是非常好的并行计算框架,但它更多的面向批处理模式,而不是面向交互式的SQL执行。与 MapReduce相比:Impala把整个查询分成一执行计划树,而不是一连串的MapReduce任务,在分发执行计划后,Impala使用拉式获取 数据的方式获取结果,把结果数据组成按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。Impala使用服务的方式避免 每次执行查询都需要启动的开销,即相比Hive没了MapReduce启动时间。
(2)使用LLVM产生运行代码,针对特定查询生成特定代码,同时使用Inline的方式减少函数调用的开销,加快执行效率。
(3)充分利用可用的硬件指令(SSE4.2)。
(4)更好的IO调度,Impala知道数据块所在的磁盘位置能够更好的利用多磁盘的优势,同时Impala支持直接数据块读取和本地代码计算checksum。
(5)通过选择合适的数据存储格式可以得到最好的性能(Impala支持多种存储格式)。
(6)最大使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。

3,hive与Impala的相同点

(1)元数据:两者使用相同的元数据。
(2)数据存储:使用相同的存储数据池都支持把数据存储于HDFS, HBase。
(3)SQL解释处理:比较相似都是通过词法分析生成执行计划。

4,hive与Impala的不同点

(1)执行计划:
    hive:依赖于MapReduce执行框架,执行计划分成map->shuffle->reduce->map->shuffle->reduce…的模型。如果一个Query会被编译成多轮MapReduce,则会有更多的写中间结果。由于MapReduce执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。
    Impala: 把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询,而不用像Hive那样把它组合成管道型的map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。
(2)内存使用:
    Hive: 在执行过程中如果内存放不下所有数据,则会使用外存,以保证Query能顺序执行完。每一轮MapReduce结束,中间结果也会写入HDFS中,同样由于MapReduce执行架构的特性,shuffle过程也会有写本地磁盘的操作。
    Impala: 在遇到内存放不下数据时,当前版本0.1是直接返回错误,而不会利用外存,以后版本应该会进行改进。这使用得Impala目前处理Query会受到一定的限制,最好还是与Hive配合使用。Impala在多个阶段之间利用网络传输数据,在执行过程不会有写磁盘的操作(insert除外)。
(3)调度:
    Hive: 任务调度依赖于Hadoop的调度策略。
    Impala: 调度由自己完成,目前只有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。调度器目前还比较简单,在SimpleScheduler::GetBackend中可以看到,现在还没有考虑负载,网络IO状况等因素进行调度。但目前Impala已经有对执行过程的性能统计分析,应该以后版本会利用这些统计信息进行调度吧。
(4)数据流:
    Hive: 采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。
    Impala: 采用拉的方式,后续节点通过getNext主动向前面节点要数据,以此方式数据可以流式的返回给客户端,且只要有1条数据被处理完,就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。
(5)容错:
    Hive: 依赖于Hadoop的容错能力。
    Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与Impala的设计有关,因为Impala定位于实时查询,一次查询失败,再查一次就好了,再查一次的成本很低)。但从整体来看,Impala是能很好的容错,所有的Impalad是对等的结构,用户可以向任何一个Impalad提交查询,如果一个Impalad失效,其上正在运行的所有Query都将失败,但用户可以重新提交查询由其它Impalad代替执行,不会影响服务。对于State Store目前只有一个,但当State Store失效,也不会影响服务,每个Impalad都缓存了State Store的信息,只是不能再更新集群状态,有可能会把执行任务分配给已经失效的Impalad执行,导致本次Query失败。
(6)适用面:
    Hive: 复杂的批处理查询任务,数据转换任务。
    Impala实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析。

5,Impala的优缺点

优点:
    (1)支持SQL查询,快速查询大数据。
    (2)可以对已有数据进行查询,减少数据的加载,转换。
    (3)多种存储格式可以选择(Parquet, Text, Avro, RCFile, SequeenceFile)。
    (4)可以与Hive配合使用。
缺点:
    (1)不支持用户定义函数UDF。
    (2)不支持text域的全文搜索。
    (3)不支持Transforms。
    (4)不支持查询期的容错。
    (5)对内存要求高。

三,sqoop数据传输

Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
sqoop架构非常简单,其整合了Hive、Hbase和Oozie, 通过map-reduce任务来传输数据,从而提供并发特性和容错。

1,sqoop数据导入原理

2,sqoop数据导入

场景一:mysql中导入按条件查询后的表到HDFS

sqoop import \
--connect jdbc:mysql://localhost:3306/数据库名 \
--driver com.mysql.jdbc.Driver \
--query ''select * from userinfos where username='zs'  and \$CONDITIONS" \
--username root \
--password root \
--split-by userid \
--delete-target-dir \
--target-dir /tmp/customs \
--as-textfile
--m 3

释义:
(1)connect:指定JDBC连接数据库所在的地址、端口、数据库名称、字符编码格式等信息
(2)username:数据库连接用户名
(3)password:数据库连接密码
(4)query:获取导入数据的查询语句
(5)$CONDITIONS:query查询语句必须有的字段,\ $转义符
(6)split-by:指定分片字段,后续会使用改字段对数据进行换分,放到不同的map中执行,一般使用主键或者有索引的字段,可提高执行效率
(7)delete-target-dir:如果目标文件存在就先删除在导入
(8)target-dir:指定HDFS上的目标路径,即导入数据的存储路径
(9)as-textfile:指定导入数据到HDFS后的数据存储格式。
(10)m:导入的数据分成多少个文件存放

场景二:mysql中导入表的指定列到HDFS

sqoop import \
--connect jdbc:mysql://localhost:3306/数据库名 \
--driver com.mysql.jdbc.Driver \
--table test \
--username root \
--password root \
--delete-target-dir \
--target-dir /tmp/customs \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \ 
--as-textfile
--m 3

释义:
(1)table: 指定数据库的表名
(2)columns:指定mysql数据库中的具体列导入到HDFS

场景三:导入数据到Hive中

sqoop import \
--connect jdbc:mysql://localhost:3306/数据库名 \
--driver com.mysql.jdbc.Driver \
--table test \
--username root \
--password root \
--hive-import \
--create-hive-table \
--hive-database test \
--hive-table orders \
--m 3

释义:
(1)导入数据到hive中,需要现在hive上面建表
(2)支持hive table的创建与覆盖:create-hive-table, hive-overwritess
(3)create-hive-table: 自动创建表,如果表已经存在则报错,生产中一般不使用
(4)hive-overwrite:覆盖原有表数据
(5)hive-import: 通过hive-import指定导入到Hive
(6)hive-database: 指定导入的hive的数据库名
(7)hive-table: 指定导入的hive的表名

场景四:导入数据到Hive分区中

sqoop import \
--connect jdbc:mysql://localhost:3306/数据库名 \
--driver com.mysql.jdbc.Driver \
--query "select order_id,order_status from orders where order_date>='2013-11-03' and order_date <'2013-11-04' and \$CONDITIONS" \
--username root \
--password root \
--hive-import \
--delete-target-dir \
--target-dir /data/test/orders \
--split-by order_id \
--hive-import \
--hive-database test \
--hive-table orders \
--hive-partition-key "order_date" \
--hive-partition-value "2013-11-03" \
--m 3

释义:
(1)query:指定查询语句,解决多表关联插入
(2)hive-partition-key: 指定分区的某一列作为键
(3)hive-partition-value指定分区的某一列的某个值为value

3,sqoop数据导出原理

4,数据导出

场景一:HDFS向mysql中导出数据

sqoop export \
--connect jdbc:mysql://localhost:3306/数据库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password root \
--table customers_demo \
--export-dir /customerinput \
--m 1

释义:
(1)table: 指定mysql数据库表名
(2)export-dir: 表示待导出数据在HDFS上的路径。

场景二:导入数据到job

sqoop job --create mysql2hdfs \
--connect jdbc:mysql://localhost:3306/数据库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password root \
--table orders \
--incremental append \
--check-column order_date \
--last-value '0' \
--target-dir /data/test/orders \
--m 3

释义:
(1)table:指定mysql数据看的表名
(2)check-column:指定递增的列
(3)每次job执行成功之后都会修改 --last-value 值,将最后一次的最大值填充进去
(4)查看job sqoop job --list
(5)执行job sqoop job --exec mysql2hdfs

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
1月前
|
存储 算法 C++
C/C++工程师面试题(STL篇)
C/C++工程师面试题(STL篇)
48 6
|
1月前
|
存储 缓存 数据库
C/C++工程师面试题(数据库篇)
C/C++工程师面试题(数据库篇)
47 9
|
5天前
|
分布式计算 监控 大数据
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
19 1
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
|
13天前
|
存储 网络协议 安全
【专栏】30 道初级网络工程师面试题为广大网络工程师提供参考。
【4月更文挑战第28天】本文为初级网络工程师提供了30道面试题,涵盖OSI七层模型、TCP/IP协议栈、IP地址分类、ARP、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN、网络拓扑、广域网、以太网、网络存储、网络拥塞、流量监控、延迟、网络安全、网络攻击防范、协议分析、性能优化、故障排查、网络虚拟化和云计算等基础知识。这些问题旨在帮助面试者准备并提升网络工程领域的知识和技能。
|
28天前
|
缓存 运维 NoSQL
面试分享:Redis在大数据环境下的缓存策略与实践
【4月更文挑战第10天】探索Redis在大数据缓存的关键作用,本文分享面试经验及必备知识点。聚焦Redis数据结构(String、List、Set、Hash、Sorted Set)及其适用场景,缓存策略(LRU、LFU、TTL)与过期机制,集群和数据分片,以及性能优化和运维技巧。通过代码示例深入理解,助你面试成功,构建高效缓存服务。
49 4
|
29天前
|
SQL 安全 NoSQL
渗透工程师面试
信息收集 1. 服务器的相关信息(真实 ip,系统类型,版本,开放端口,WAF 等) 2. 网站指纹识别(包括,cms,cdn,证书等),dns 记录 3. whois 信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等) 4.
|
1月前
|
安全 应用服务中间件 网络安全
渗透测试工程师面试题大全
渗透测试工程师面试题大全
|
2月前
|
敏捷开发 安全 API
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
79 0
|
2月前
|
敏捷开发 算法 安全
如何精准展现C/C++项目亮点:高级工程师面试指南
如何精准展现C/C++项目亮点:高级工程师面试指南
43 1
|
12天前
|
分布式计算 大数据 BI
MaxCompute产品使用合集之MaxCompute项目的数据是否可以被接入到阿里云的Quick BI中
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。