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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 面试心经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

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
4月前
|
存储 安全 Java
每日大厂面试题大汇总 —— 今日的是“美团-后端开发-一面”
文章汇总了美团后端开发一面的面试题目,内容涉及哈希表、HashMap、二叉树遍历、数据库索引、死锁、事务隔离级别、Java对象相等性、多态、线程池拒绝策略、CAS、设计模式、Spring事务传播机制及RPC序列化工具等。
92 0
|
6月前
|
JavaScript 前端开发 应用服务中间件
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
这篇文章分析了Vue项目在服务器部署后出现404错误的原因,主要是由于history路由模式下服务器缺少对单页应用的支持,并提供了通过修改nginx配置使用`try_files`指令重定向所有请求到`index.html`的解决方案。
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
|
4月前
|
存储 消息中间件 NoSQL
每日大厂面试题大汇总 —— 今日的是“京东-后端开发-一面”
文章汇总了京东后端开发一面的面试题目,包括ArrayList与LinkedList的区别、HashMap的数据结构和操作、线程安全问题、线程池参数、MySQL存储引擎、Redis性能和线程模型、分布式锁处理、HTTP与HTTPS、Kafka等方面的问题。
178 0
|
1月前
|
数据采集 机器学习/深度学习 DataWorks
DataWorks产品评测:大数据开发治理的深度体验
DataWorks产品评测:大数据开发治理的深度体验
113 1
|
6月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何开发ODPS Spark任务
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
133 2
|
3月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
206 2
|
4月前
|
SQL 安全 关系型数据库
第三次面试总结 - 吉云集团 - 全栈开发
本文是作者对吉云集团全栈开发岗位的第三次面试总结,面试结果非常好,内容全面覆盖了Java基础、MySQL和项目经验,作者认为自己的MySQL基础知识稍弱,需要加强。
50 0
第三次面试总结 - 吉云集团 - 全栈开发
|
4月前
|
消息中间件 存储 前端开发
资深Android开发的5个经典面试题
本文首发于公众号“AntDream”,欢迎关注。文章详细解答了五个常见的Android面试题,涵盖内存泄漏与溢出、Binder机制、MVC/MVP/MVVM架构、Handler机制及Context对象等内容,帮助读者深入了解Android开发的核心概念。
75 0
|
4月前
|
NoSQL 前端开发 关系型数据库
第四次面试总结 — 嘉和智能 - 全栈开发
本文是作者对嘉和智能全栈开发岗位的第四次面试总结,主要围绕对各种技术栈的了解程度进行提问,包括数据库的使用经验、对Redis和nginx的理解以及前端技能水平。
33 0
|
4月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
55 0