大数据基础面试题四:Sqoop& Azkaban& HBase & Phoenix & Scala

大数据基础面试题四:Sqoop& Azkaban& HBase & phoenix & Scala

七、Sqoop

7.1 Sqoop参数

/opt/module/sqoop/bin/sqoop import \
--connect \
--username \
--password \
--target-dir \
--delete-target-dir \
--num-mappers \
--fields-terminated-by   \
--query   "$2" ' and $CONDITIONS;'

7.2 Sqoop导入导出Null存储一致性问题

Hive中的Null在底层是以“\N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。在导出数据时采用--input-null-string和--input-null-non-string两个参数。导入数据时采用--null-string和--null-non-string

7.3 Sqoop数据导出一致性问题

场景1:如Sqoop在导出到Mysql时,使用4个Map任务,过程中有2个任务失败,那此时MySQL中存储了另外两个Map任务导入的数据,此时老板正好看到了这个报表数据。而开发工程师发现任务失败后,会调试问题并最终将全部数据正确的导入MySQL,那后面老板再次看报表数据,发现本次看到的数据与之前的不一致,这在生产环境是不允许的。

官网:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html

Since Sqoop breaks down export process into multiple transactions, it is possible that a failed export
 job may result in partial data being committed to the database. This can further lead to subsequent 
 jobs failing due to insert collisions in some cases, or lead to duplicated data in others. You can
  overcome this problem by specifying a staging table via the --staging-table option which acts as an 
  auxiliary table that is used to stage exported data. The staged data is finally moved to the
   destination table in a single transaction.

–staging-table方式

sqoop export --connect jdbc:mysql://192.168.137.10:3306/user_behavior --username root --password 123456
--table app_cource_study_report --columns watch_video_cnt,complete_video_cnt,dt --fields-terminated-by "\t" 
--export-dir "/user/hive/warehouse/tmp.db/app_cource_study_analysis_${day}" --staging-table 
app_cource_study_report_tmp --clear-staging-table --input-null-string '\N'

7.4 Sqoop底层运行的任务是什么

只有Map阶段,没有Reduce阶段的任务。默认是4个MapTask。

7.5 Sqoop一天导入多少数据

100万日活=》10万订单,1人10条,每天1g左右业务数据
Sqoop每天将1G的数据量导入到数仓。

7.6 Sqoop数据导出的时候一次执行多长时间

每天晚上00:10开始执行,Sqoop任务一般情况20-30分钟的都有。取决于数据量(11:11,6:18等活动在1个小时左右)。

7.7 Sqoop在导入数据的时候数据倾斜

Sqoop 参数撇嘴: split-by:按照自增主键来切分表的工作单元。
num-mappers:启动N个map来并行导入数据,默认4个;

7.8 Sqoop数据导出Parquet(项目中遇到的问题)

Ads层数据用Sqoop往MySql中导入数据的时候,如果用了orc(Parquet)不能导入,需转化成text格式
(1)创建临时表,把Parquet中表数据导入到临时表,把临时表导出到目标表用于可视化
(2)ads层建表的时候就不要建Parquet表

八、 Azkaban

8.1 每天集群运行多少指标?

每天跑100多个指标,有活动时跑200个左右。

8.2 任务挂了怎么办?

1)运行成功或者失败都会发邮件、发钉钉、集成自动打电话(项目中遇到的问题)
2)最主要的解决方案就是重新跑。
3)报警网站http://www.onealert.com/

九、HBase

9.1 HBase存储结构

在这里插入图片描述

9.2 RowKey设计原则

1)rowkey长度原则
2)rowkey散列原则
3)rowkey唯一原则

9.3 RowKey如何设计

1)生成随机数、hash、散列值
2)字符串反转

9.4 Phoenix索引与安装

对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询。如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄。对于较大的表,全表扫瞄的代价是不可接受的。

但是,很多情况下,需要从多个角度查询数据。例如,在定位某个人的时候,可以通过姓名、身份证号、学籍号等不同的角度来查询,要想把这么多角度的数据都放到rowkey中几乎不可能(业务的灵活性不允许,对rowkey长度的要求也不允许)。

所以,需要secondary index来完成这件事。secondary index的原理很简单,但是如果自己维护的话则会麻烦一些。现在,Phoenix已经提供了对HBase secondary index的支持,下面将说明这样用Phoenix来在HBase中创建二级索引。

  1. 下载地址http://www.apache.org/dyn/closer.lua/phoenix/apache-phoenix-4.14.1-HBase-1.3/bin/apache-phoenix-4.14.1-HBase-1.3-bin.tar.gz
  2. 上传到/opt/software/ 解压tar -zxvf apache-phoenix-4.14.1-HBase-1.3-bin.tar.gz -C /opt/module 并改名为phoenix
  3. 在/opt/module/phoenix/下将core和client这俩个包拷贝到各个节点的hbase的lib下面
    scp ./phoenix-core-4.14.1-HBase-1.3.jar slave02:/opt/module/hbase-1.3.1/lib/
    scp ./phoenix-core-4.14.1-HBase-1.3.jar slave03:/opt/module/hbase-1.3.1/lib/
    scp ./phoenix-4.14.1-HBase-1.3-client.jar slave03:/opt/module/hbase-1.3.1/lib/
    scp ./phoenix-4.14.1-HBase-1.3-client.jar slave02:/opt/module/hbase-1.3.1/lib/
  4. 将hbase的conf下的hbase-site.xml,和hadoop下面的core-site.xml和hdfs-site.xml拷贝到phoenix的bin/下面
  5. 在root权限下配置phoenix的环境变量 在/etc/profile 下添加如下内容
    #phoenix
    export PHOENIX_HOME=/opt/module/phoenix
    export PHOENIX_CLASSPATH= P H O E N I X H O M E e x p o r t P A T H = PHOENIX_HOME export PATH= PHOENIXHOMEexportPATH=PATH:$PHOENIX_HOME/bin
  6. 启动zookeeper,hadoop,hbase
  7. 启动phoenix,bin/sqlline.py master01,slave02,slave03:2181

9.5 Phoenix表操作

  1. 创建表
CREATE TABLE IF NOT EXISTS us_population (
stateCHAR(2) NOT NULL,
cityVARCHAR NOT NULL,
populationBIGINT
CONSTRAINTmy_pk PRIMARY KEY (state, city));
  在phoenix中,默认情况下,表名等会自动转换为大写,若要小写,使用双引号,如"us_population"。
  1. 显示所有表
table或
   !tables
  1. 插入记录
 upsert into us_population values('NY','NewYork',8143197);
  1. 查询记录
   select * from us_population ;
   select * from us_population wherestate='NY';
  1. 删除记录
  delete from us_population wherestate='NY';
  1. 删除表
  drop table us_population;
  1. 退出命令行
   !quit
  具体语法参照官网  https://phoenix.apache.org/language/index.html#upsert_select
  1. phoenix表映射
    默认情况下,直接在hbase中创建的表,通过phoenix是查看不到的,如图1和图2,US_POPULATION是在phoenix中直接创建的,而test是在hbase中直接创建的,默认情况下,在phoenix中是查看不到test的。
    在这里插入图片描述

图1 phoenix命令行中查看所有表
在这里插入图片描述

图2 hbase命令行中查看所有表

  如果需要在phoenix中操作直接在hbase中创建的表,则需要在phoenix中进行表的映射。映射方式有两种:视图映射和表映射。
  hbase 中test的表结构如下,两个列簇name、company.

在这里插入图片描述

9.5.1 hbase命令行中创建表

   $ cd /home/hadoop/hbase/bin
   $ ./hbase shell 进入hbase命令行

create ‘test’,‘name’,‘company’ 创建表,如下图
在这里插入图片描述

下面的视图映射和表映射均基于该表。

9.5.2 视图映射

Phoenix创建的视图是只读的,所以只能用来做查询,无法通过视图对源数据进行修改等操作。而且相比于直接创建映射表,视图的查询效率会低,原因是:创建映射表的时候,Phoenix会在表中创建一些空的键值对,这些空键值对的存在可以用来提高查询效率。

1)创建视图

create view"test"(empid varchar primarykey,"name"."firstname" 
varchar,"name"."lastname"varchar,"company"."name"     varchar,"company"."address"varchar);

2)删除视图

 drop view "test";
9.5.3 表映射

使用Apache Phoenix创建对HBase的表映射,有两种方法:

1) 当HBase中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view改为create table即可。

2)当HBase中不存在表时,可以直接使用create table指令创建需要的表,并且在创建指令中可以根据需要对HBase表结构进行显示的说明。
第1)种情况下,如在之前的基础上已经存在了test表,则表映射的语句如下:

create table "test"(empid varchar 
primarykey,"name"."firstname"varchar,"name"."lastname"varchar,"company"."name" 
varchar,"company"."address"varchar);

第2)种情况下,直接使用与第1)种情况一样的create table语句进行创建即可,这样系统将会自动在Phoenix和HBase中创建person_infomation的表,并会根据指令内的参数对表结构进行初始化。

使用create table创建的关联表,如果对表进行了修改,源数据也会改变,同时如果关联表被删除,源表也会被删除。但是视图就不会,如果删除视图,源数据不会发生改变。

9.5.4 使用spark对phoenix的读写

请参考http://phoenix.apache.org/phoenix_spark.html
在这里插入图片描述

select * from STOCK_SYMBOL

在这里插入图片描述

scan "STOCK_SYMBOL"

在这里插入图片描述

9.6 利用Phoenix为Hbase表创建二级索引

9.6.1配置Hbase支持Phoenix创建二级索引

https://blog.csdn.net/u011491148/article/details/45749807

对于Hbase,如果想精确定位到某行记录,唯一的办法就是通过rowkey查询。如果不通过rowkey查找数据,就必须逐行比较每一行的值,对于较大的表,全表扫描的代价是不可接受的。

修改Hbase的regionserver节点的hbase-site.xml配置文件

<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<property>
 <name>hbase.region.server.rpc.scheduler.factory.class</name>
<value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>
<property>
<name>hbase.rpc.controllerfactory.class</name>
<value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>

注意:网上配置文档里有这一条,但在实际测试中(测试环境hbase-1.3.1,网上0.98.6),加入该条的regionserver会在hbase启动时失败,对应节点上没有HregionServer进程,去掉该配置后正常启动,且能正常创建local index。

<property>
<name>hbase.coprocessor.regionserver.classes</name>
<value>org.apache.hadoop.hbase.regionserver.LocalIndexMerger</value>
</property>

还有一点,hbase-site.xml的zookeeeper的配置信息不能加2181,否则在创建local index的时候会报以下异常:
在这里插入图片描述

正常配置
在这里插入图片描述

修改Hbase的master节点的hbase-site.xml配置文件
注意,如果master节点上也有regionserver,那么master节点配置如下,否则不需要regionserver的配置参数。

<!-- phoenix master 配置参数 -->
        <property>
                <name>hbase.master.loadbalancer.class</name>
                <value>org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer</value>
        </property>
        <property>
                <name>hbase.coprocessor.master.classes</name>
                <value>org.apache.phoenix.hbase.index.master.IndexMasterObserver</value>
        </property>
        <!-- phoenix regionserver 配置参数 -->
        <property>
                <name>hbase.regionserver.wal.codec</name>
                <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
        </property>
9.6.2 创建索引

配置好以上配置信息之后,重启Hbase,以下测试环境通过Phoenix映射Hbase中已有的表,数据量743569行,202M,当然也可以通过Bulkload直接在Phoenix创建表并插入数据影响Hbase。

未创建索引信息时,用时6.08s

select "uploader" from "hive_hbase_youtube" where "uploader"='karianahhk';

在这里插入图片描述

创建索引,用时0.014s

create index "youtube_index2" on "hive_hbase_youtube" ("info"."uploader")

在这里插入图片描述
在这里插入图片描述

9.6.3 关于Phoenix创建的HBase二级索引的更新问题

在使用Phoenix创建Hbase的二级索引表之后,在Phoenix中看不到新建的索引表,但是
在Hbase表中可以看到索引表。
在这里插入图片描述

现在,有一个问题,可以看到同一个表中查询的数据却不同,原因是Jarry是直接向Hbase表插入的数据,而Phoenix已经为name字段创建索引,这时就查询不到Jarry,但是通过Phoenix的映射表向Hbase插入的数据数据查询索引字段可以查询到。
在这里插入图片描述

问题是,如果绕开Phoenix向Hbase表插入数据,那么索引表就不会动态更新。
解决方案:
现有的解决方案是,在通过Hbase向表中插入数据时,我们要向索引表中也插入一条索引数据。那么查看以下索引表数据:
在这里插入图片描述

其实索引的rowkey就是索引字段+rowkey,那么我们插入一条:

put ‘name’,“Jarry\x001003”,‘0:_0’,‘x’
在这里插入图片描述

再次查询Phoenix中的索引字段,可以显示索引字段了。
在这里插入图片描述

有关索引的扩展请访问
https://blog.csdn.net/qq_41665356/article/details/80278125

十、Scala

10.1 开发环境

要求掌握必要的Scala开发环境搭建技能。

10.2 变量和数据类型

掌握var和val的区别
掌握数值类型(Byte、Short、Int、Long、Float、Double、Char)之间的转换关系

10.3 流程控制

掌握if-else、for、while等必要的流程控制结构,掌握如何实现break、continue的功能。

10.4 函数式编程

掌握高阶函数、匿名函数、函数柯里化、函数参数以及函数至简原则。

10.5 面向对象

掌握Scala与Java继承方面的区别、单例对象(伴生对象)、特质的用法及功能。

10.6 集合

掌握常用集合的使用、集合常用的计算函数。

10.7 模式匹配

掌握模式匹配的用法

10.8 异常

掌握异常常用操作即可

10.9 隐式转换

掌握隐式方法、隐式参数、隐式类,以及隐式解析机制

10.10 泛型

掌握泛型语法

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值