00:00
同样的还是把前一天的东西做一个复习,然后我们前一天啊,主要全都是在敲代码是吧,就是h base,关于h base一个API的一个练习,就是它的一个关于表层面的创建表,删除表啊,判断表是否存在对吧,那这三个,然后还有一个就是表。的内容啊,一个作用啊,内容一个作用就是增删改查,基本的增删改查,但它这个增删检查呢,UB存一个大批量数据,所以我们发现它的一个增删改造方面,你可以单独的去操作一条数据也可以干什么。批量的操作对不对。你让增加你那个铺的方法。它除了能放一个库对象之外,它是不还可以放一个。List的一个集合对吧,哎,一个delete,比如说放了一个put的一个集合,也可以像那个删除delete对吧,它是delete对象,哎,它也可以。
01:01
放一个集合,还有或者说你一个一个R去获取的时候,你是不是要用get呀。对吧,那get的对象它同样的在get的方法里边,照样能放什么,放一个集合啊,就是说它是因为语文大数据这块啊,数据量比较大,所以说它有单独的你去获取一个值,也可以去获取批量获取相应的一个值,应的一个值,OK,那我们一个一个过一遍嘛,判断表是否存在啊,这里边呢,我们主要讲了两套API是吧,新旧的啊,新旧的大家都要会,因为我已经讲了,为什么我们还会提一下这个老的API,老的API就是大家做项目过程当中呢。用的还是老的啊,就是为了给大家写简历的时候啊,两年前三年前用的是什么框架,然后我们所以当时就项目当中设计的就是什么样子的,是这个这个基于这个考虑,在讲课过程当中呢,新的ipi都会都会讲,然后你出去工作以后,那以新ipi为主是吧,所以我们讲课当中呢,还是以新API为主啊,捎带的提下的一个老的APIAPI,老的APIOK。
02:05
然后呢,这块主要是获取一个关于任何关于就是。表的层面的一个结构。用的是ain对象对不对,这个h base的一个管理员啊,操作直接操作表的,直接操作表的,而我们所讲的之后呢,这个它的表存不存在呢,它有自己的一个方法,但是新API跟老API的一个不同,就是传输参数的一个不同嘛。老的API它有三种参数,传传输方式是吧,Bad数组,Table name方式,或者说传思也可以对吧,但新API当中你要记得它只有一种的,哎,只有传的一个对象,他那一个对象对它相应的也有什么删除表的一个操作,还有创建表,但是你要注意的是。删除表的时候,它其实分为了两步,是不是。对吧,哎,他先把它干什么,Disable,然后再delete,然后再delete是这样的,其实还有还有一点就是那个窗开。
03:05
窗开了,大家也看到了它是什么。清空数据对吧,清空数据它是干什么?先引过来一下,然后清空数据吧。但你要注意他实际的操作是这样的,他先把它下线,就是disable,然后他把这张表删除了,然后重新创建的这张表,重新创建了这张表,哎,当我们讲这个,到时候看这样。我们会有一个预分区啊,到那块能清楚的看到这一点,就是开始我们创建的是一个余分区的表,但是我们把数据窗开了以后呢,我们发现那个预分区啊没了。因为他给我们把那张表删了,重新按照表名加in for,就是列足这种东西啊,给我们重新创建的表啊,这是你要注意的点,就窗开,他不是说真的他把数据给删了,而是他把直接把整张表给删,重新创建的表啊,稍微记一下,下午我们会就是等会啊,就上午的时候会演示到这个问题啊,现在稍微记一下就创cat这个问题。
04:00
啊,他跟delete呢,它比delete多做多做了一步操作,就是他最后把这个表啊重新创建一下。啊,其实它前面是d delete的操作啊,D列操作啊,啊然后这块要注意一下,就是要DC是表下线啊,是表下线,那是一个下线的表,通过那个命令行enable也可以使表上线,这样这你要知道的,假如说你下线了之后,你不想删了,你要想正常服务哎,你用enable它照样能恢复到,不是说你下线了之后,这个表就完全真的就死了,就不能用,必须把它删掉重新建,不是这样的,Enable照样可以让它恢复的啊,能恢复的OK,然后就是后面让那个向表里边做这个增删改查啊,做增删改查这块这个内容呢,它就不是拿到他的命对上了吧。这个类似于什么?在那个MY克当中,它是有DDL和DML,是不是这两种操作语句,操作语言嘛,他是不是就关于整个表的一个操作,或者数据库的一个操作,他拿的分享是数据定义语言嘛,就是表的一个增加干啥,对吧,然后对于数据的一个增加改啥,它就类似于DM。
05:09
数据的一个操作语言,管理语言吧,啊相当于两种语言,所以它的一用的一个对象也是不一样的啊,就相当于DDL,它的一个对象的操作是表,或者说是命名空间,命名空间那这一块呢,主要用的是命对象,然后后面这个是table对象啊,Table对象啊这块要注意一下象啊表的一个增加干什么,它所有的一个东西跟我们命令行里边看到的都一样。命令行里边用put来查入数据,那它就是调用put方法,就是说它命令行里边所有的命令都对应于API中的完全相同的一个方法,相同的方法put get get啊都是一个类吧,同样它还有这种方法是不是啊,整个的过程这吧,主要就是要了解一下,就是它的一个插入操作的一块啊,有两种批量插入的一个方式,第一个呢,就是同一个肉key下,你可以对不同的列。请插入数据对不对。
06:01
那就是用一个photo对象,直接往photo对象里面多个at,就是负点at,负点at多次at,然后at的东西呢,就是你里边的一个column不一样,然后值不一样啊,它可以一个批量操作。第二种就是公司当中常用的,你要用多个步骤对象放在一个历子的集合里边。绿色集合里边,因为你整个的数据流,你要想这V的写数据啊,你是跟前面那个什么服用卡普卡,那卡普卡之前讲的那个API的一个操作,当时我们只是把数据打印了一下,对吧,那你完全可以不打印干什么?封装,把那些一条一条数据封装成一个一个的负字架,可不可以啊,可以吧,然后封装成负的字架之后,你是不是可以把那个流市传过来的数据放到h base里边做存储啊。哎,这是可以的啊,这是可以的,那你想想看,它的一个大量的一个数据量啊,卡普卡一条一条数据来了,来一次就put一次,来一次put一次,它跟h base的一个交互是不是过于频繁了,类似于MYS一样嘛,所以说这块我们就要考虑它的一个批量操作的问题啊,我们会用一个类似的集合啊,来把它接收下来,然后呢,积攒到一定量,假如说500条数据,我们再put一次,500条数据或者1000条数据啊,Put一次啊,那它得跟H的一个交互就变少了,减少了H就是实际减少的是region so,它那个服务的一个什么。
07:17
压力吧,要不然下一条数据连接一次,一条数据连接一次,它连接太频繁了啊,无形当中就增大了一个服务器的一个压力啊,这块一个批量操作要注意一下,同样的。这个删除啊也是可以的,删除也是可以的,它同样的也是两种方式,你可以删除一个U下。多个列里边数据可以吧,也是通过那种艾特column这种方式,艾特这种方式,同时你也可以同时删除多个。R key的数据是不是啊,多个r key的数据这块要注意一下,给大家提的一个点就是什么。啊。删除里边有两两种API吧,一个是加S和一个不加的。
08:03
删除delete table,这是delete啊,实际的一个delete操作,删除的操作,然后大家一定要知道这个delete加S跟不加S的一个区别,对吧,一个是这个不加S的删除的是什么。它其实删除的是指定的一个版本嘛,当然你后面要如果传了时间戳的话,就是说传了版本号,因为时间戳就是它这个版本号对吧?哎,如果你传了这个东西的话,它就删除当前传入的这个版本了,如果你没传的话,它删除的是什么?最新的它就分为了两步,是不是他第一步呢,它就获取一下最新的那个版本,然后第二步呢,他去把这个最新的版本给添加一个什么迪delete的标签是吧?啊注释里边这样写的啊,就是说他打一个标记啊,标记标记他删除了。OK,这是这个删除指定版本,然后还有一个添加S的这种是什么意思啊。就是你指定列符,指定列下的所有版本的数据通通删除掉吧,啊,这两个东西通通全部删除掉,就是说工作当中,如果你不是说。
09:08
你的列不是多版本的,就是你设置的是一个版本的,那你就用这个API啊,更为保险一点,因为当时我们测了一下是不是啊。就当时我们哎铺的两条数据进去之后,我们用不加S这种方式筛,是不是它能把老的数据能获取到啊,哎,这是意味着h base在底层设计的时候,它为了增删改查的一个坏啊,所以说你在更新连续put的候,它并不是把老的数据给删掉了,而是说直接就放在那啊,放在那你要删了,你把所有的数据全删了。啊,全部删了,这样操作起来更保险一点啊,你要注意一下这块的一个内容,在公司当中应用的时候啊,切记,因为这块你要多单个版本的话,你用这块内容可能会给你的业务带来错误性,带来错误性,因为你连续碰到两次之后,你你认为你删了是吧,其实你数据没删干净啊,其实你数据没删干净,这块要注意这个点啊,这个地方要切记到后面一个get的话,或者说叫查吧,它有两种方式,一种是盖,一种是get,那盖是全秒扫描,那全秒扫描这块我们说了这块可以指定什么。
10:11
起始位置和终止位置。可以设置,你看它能设置什么,BA是它的一个缓存对吧,还有catch啊,设置它的一个缓存,这两个东西呢,主要就是你像你HP当中SC是扫描全表的。如果真的你在API当中用,他是不是扫描填表会把所有的数据加载到内存当中啊,对吧,它是这样的,但是你想想看,真的我之前提过在HP当中的数据。上亿啊,都是很正常的,十几亿的一个数据,你说把所有的十几亿的数据全部加载内存,任何一个内存都受不了了,这块设置到这个缓存啊,指的是一次会扫描多少过来,然后用完了之后,他再接着往这里头加载,而不是说一次性把所有的数据真的全部加载到内存了啊,全部加载到内存了,这你要注意的,然后这个地方还可以设置看一下。
11:03
嗯,三米。然后这个地方还有一个这个东西给大家提一下这个什么。对,过滤器。这这个不是不能过滤器啊,这个就是只在过滤器,好我们看一下这个。非,然后他要一个非对吧,那我们看一下这个非。你看它是一个,我们找应该找哈杜这个吧,H的下对吧?啊不可能说找其他的啊,GDK里边的这个filter走,你发现它是一个什么。抽象类啊,所以说我们要实际的看,只能看它那个什么。实现类。这个地方还有一个抽象类fair list,就说filter可以放在一个什么。多个过滤器搁一块联合使用,你放在一个标list里面去用,OK这个地方看一下。主要关注这几个点。
12:02
来。Single column value filter。这是什么呢?单列数据的一个过滤,对吧,就说我们当时不说了,整个HP存储存储空间当中,上面呢,是我们的一个什么。For family CF对吧,这边呢,是我们的一个RKRK,然后这个一行数据里边有很多什么CN,然后有Y6对吧,这个地方这个过滤器啊,就是对我们的一个VALUE6啊进行过滤。就是说你要找,假如说里边存了很多一个数据,我现在要查什么呢?你里边会存了很多员工信息吗?我要查所有的男性的一个数据,我要详细数据,那你要过滤,你要把它这个值放进去过滤吧,啊用了就要用这个过滤器,用过滤器你首先要进行全表扫描,对不对。因为你要找男性啊,全面扫描,但是你扫描的值,你指定了一个规则,就是说所有的一个男性啊,全部给它拿出来啊,这边一个过滤器,大家需要了解一下,需要了解一下,因为后面项目当中呢会用,后面项目当中呢会用这块。
13:12
啊,然后。这块主要就是设定它的一个范围了,第一个start roll stop roll,然后是你像那个filter是不是也是范围啊,对它进行一个范围进行一个限定,对吧?啊对它范围进行一个限定,但是这个filter放在这。就是说它也会同样的把所有的数据拿回来,然后再进行过滤。他必须要比对每一条数据,他才能知道满不满足你这个过滤条件吧,啊,它其实执行的也是一个全表扫描的一个过程,全表扫描的一个过程。然后我们关注的核心的一个点还是全部扫描,直接把那个SC呢放进去,当然你要知道的就是SC呢,它也设置很多很多的一个条件啊,什么过滤器啊,Start Rose stop roll啊等等啊这些条件,而且你要注意的就是这些条件,还有包括刚才的那个缓存这块,它这些东西都是可以结合在一块用的。
14:04
啊,结合在一块用的,那什么意思呢?假如说这个地方我们不是指定了start Rose吗。又指定了什么filter?又指定了过滤器,那这个过滤器起作用的范围就是在你start跟go肉之间,你本来全表的数据可能是这样的,你单独用filter,它是不是对你全表的数据进行过滤啊?当你设置了start跟stop以后呢,它是对你这个范围内进行过滤。啊,这些东西他就不看了啊,他就不用比对了,因为你的数据的过程当中,你肯定用不到这些数据了,因为你stop跟stop都限定了,也就是说刚才所看到的那些还有什么缓存啊,都是三者都可一块搁一块结合在一块用的。啊,这你要注意的啊,结合在一块用的,OK,这是这个盖前调扫描这块要注意的点,然后是这个get啊,它可以获取单列这个数据吧,哎,单列的一个数据。那get这块它也可以加加一些参数吧,它主要加的是什么?
15:02
跟他提过的。Get,可以这下的什么?你要看版本吧,你要看版本,你就像在命令行当中,你用SC扫描这个数据的时候,你无论你一个for这个列足啊,设置的三个版本还是五个版本,你SC的时候,它都返回的最高版本,有没有这个感觉是吧?当时我们设置了版本之后,SC一个表的时候,它照样还是返回一条数据,但是你可以在get的时候来指定获取多个版本吗?对吧,哎,这个是可以的,那也就是说在API当中呢,它其实有设置。有设置,你可以对它这个版本进行一个设置,这是可以的啊,这你要注意的一个点啊,然后这是get这一块,然后就是get,首先那如果说你直接放那个R的话,那他就将这个U所有的数据全部给拿过来,那同样它可以指定到CF,也可以再指定到CM嘛,三个级别的都能指定吧啊,因为API当中都提供了相应的方法啊,提供了一个相应的方法,那它这个返回值是result。
16:07
那指定到CN,它还是遇到一个情况,就是因为有多版本的一个情况存在吧,也就是说你指定到N,其实它还是不止一条数据出来的吧,啊,因为有多个版本啊,所以它是一个result的,它是一个sales,一个是集合啊self真正的才是单元格加上版本号才是唯一能确定的数据啊,唯一能确定数据你真的你不加这个版本号,你就不加,时间拖的时候,你数据都不能唯一确定,因为它都存在一个多版本的问题。啊,多版本的问题,所以这个返回值也能说明很多问题,也能说明很多问题,OK,然后这是整个的一个get get这个数据啊,有两种方式获取数据,一个盖一个get,然后里边相应的设置哪些参数呢,都提了一下,好多提了一下。这是整个我们那个API的一个操作,API的一个操作,应该昨天因为是一天自习是吧,这块相信大家都练了,都练了,然后稍微停一下之后呢,像这个ma,还有这个跟汉的一个集成啊,这块相对来说都重要一些。
17:09
因为真正存的话,这个API都操一操都差不多啊,都差不多啊,比就是比较死,因为API这个操作比较死,对吧,但是你涉及到跟ma或者跟hard结合的话,那就是跟业务相关的,你想一下对吧,因为它是实际的一个分析需求了吧,还跟业务相关的啊,业务相关的,所以说呢,我们这块因为之前所讲的一个分析框架了,只学了number和have啊,在h base当中呢,我们只能讲这两个,那Spark学完之后,你们可以拿smart从这个里边抽取数据来做分析,也是可以的,也是可以的啊,然后这块我们先执行的一个官方案例,这块主要主要注意的是这块,大家把这个配上啊,不要用那个临时方式。啊,不要用那种临时的,因为你后面的一个项目当中啊,也会涉及到跟h base当中啊,读取数据,然后去做分析,做分析,那到那时候如果说你当时做的是临时的,可能后面讲项目的老师呢,他配的是这种方式,然后他就直接就跑任务了,没提这个啊到时候你的一个环境说这个价格找不到,那个价格找不到。
18:13
所以说你在这块呢,你也把它配成永久的,配成永久生效的,那你直接配在这个环境。配置里边啊,配置文件里边,那你每次启动延安的时候,他都会把这个数据加载进去吗。啊,都会加载系统,OK,然后我们执行了两个官方案例啊,就测试了一下环境之后呢,我们做了这个需求。然后是从。这个需求当中是从什么h base读数据,然后写到。最终的落点还是h base吧,哎,通过这个呢,我们就知道,通过二完全跟h base可以打交道,就是我数据源可以是H,那我数据的落点同样的还可以是h base吧,啊这样就真正的跟h base它做一个结合,那这块能通了,那前面你的数据源说不是来自于h base,是来自于HDFS,这也可以吧。
19:03
啊,另外也可以的,还有这块要跟大家说一个点啊,就是只要涉及到这种一个操作,你都把这个什么。这个地方不是大家当时给让大家配了一个history so吗?把这些东西配上,因为你出问题了之后,你在当前这个页面看到一个错误啊。有时候很不明显,它只是一个错误的一个结果。啊,说什么连接不上啊等等这些操作,他不会说错误的原因,你真正要看错误原因去哪看啊。啊,他实际的有报错。或者说会指到你具体的什么。代码当中哪一行哪一行错了的时候,它在哪?哈,多的1038088在这吧,这你们执行一个任务,这是不是会多一个任务呢。对吧,哎,你具体的在这儿,它有详细的map端的一个任务,维六所端的一个任务,那前提是你的一个日志,具体要配吧,日志服务器要开放,哎这些东西都要有,所以说当时给大家对那个配置文件的时候,就要求大家按照我当时提供给大家那四个配置文件,让自己的那个哈集群给他改一改吧,把这个东西给配上,因为你后面所做的项目,或者说Spark这块的一个操作啊,打印日志的话。
20:20
啊,Spark也可以交给雅安来管理啊,交给雅安来管理,那这块所有的律日志,你你得要去那个8088档口去查看啊,因为你光靠控制卡这些的日志不足以解决问题,那有的同学说,那这个log斯不是有吗?每一个框架什么哈度吧,那个log斯里边文件,你想想看它它写的是什么。什么no no,它是关于这个机型的启动、关闭和正常运行的一个日志。它不会跟你这个任务实际的任务有任何的一个关系,懂这个意思吗?你实际的任务你还只能在这看啊,这块你点进去之后就会相对来说非常的一个详细啊,整个的麦克端啊,一个是那这样带大家看一下,你们是不是很少看,嗯,之前很少看是吧,那我们走一个这个任务是吧。
21:08
呃,Model,然后哈多宝雅安啊并。延这延上之后呢,我们这个下包。这个吧,啊,是我们之前导的一个加光,OK,这个加光呢,我们拿一下它的一个主力。在这DFS这个可以吧。Copy res。OK,主力,然后还有一个参数是吧,参数,那这个参数我们应该是输入点TSV是吧,我们机型上是叫这个名字吧。当然你可以用本地文件系统是吧?啊,那本地文件系统的话,你要保证你每一个note manager所在的机器都能访问到这个文件嘛,当时给大家演示了是吧,然后输入的点T没有问题走。
22:05
等这个任务执行完之后,这个地方肯定此时他如果提交上来,他就有了。就他还没有完成嘛,他这个进程,但是这个页面是静态页面是吧,他不会动态刷新,你要想看到这个进度条走的话,你要干什么。不断的自己手动刷新吧,因为它这个静态页面啊,他不是做的状态页面。你会发现整个大数据框架,它这种外部界面做的相对来说都不是特别的友好,是不是?因为它是提供给程序员用的啊,它不是提供给普通用户用的,所以说程序员呢,这些东西也无所谓了啊,无所谓了,特别后面你你学那个污的时候,你能感觉到那个更重,那个适配还要自己做呢。还有陈自己做呢啊。来看下这边执行完了对吧,执行完了之后看日是不是点那个黑色点进来。点进来之后,你看这。它有两个阶段嘛,啊卖阶段还分之六阶段,那你要看这块,你如果说是map说50%之后,它就把报异常了,就是说你卖好它就有问题了吧,那你就对应看卖过是不是,然后如果说卖了100%,然后re,或者说没跑,或者说跑了10%,百分之就是说没跑完,然后报错了啊就reduce中间报错了,那你就相应的看reduce的一个错误日志,那他在哪呢?点进来。
23:25
关于我的。在这他吧,它这边因为我们只有一个ma对吧?哎,数据量比较小,那要不然正常的你要有多个文件的话,它是不是会有很多很多的这个相应的他,然后这个他点进来。他有详细的在哪个上来执行的,对吧,这个任务在哪个上来执行的,然后你去看这个斯这个地方如果错了,它会有相应的报错信息。点到这来才是才能看到你卖我的真正的一个报告信息,如果说你代码当中错误,他这块肯定会有具体哪一行代码,说什么类型转换啊等等,或者说哪个控制帧啊等等详细的信息放在这,放在这同样的还有一个reduce吧。
24:11
同样你也点到reduce reduce,然后关于每一个reduce任务,你会发现到时候你执行任务的时候,你会发现有很多是跳的,然后有很多success,就是你任务执行成功了,但这里面还有很多票的,那大家想一下这是什么原因啊?推测执行吧,对,因为咱们这个虚拟机的一个环境啊。还是还那个。那个什么资源太低了,你会发现啊,103104很多任务就是你你们做到后面的时候,很多任务都被骗掉了,然后呢,他这个success呢,都指向了是102,因为我们一般要求是102这四个G是吧,然后103104呢,你们两个G啊,就是说103104的一个资源啊,相对来说少一点,然后呢,执行任务呢,它很多情况下都有可能被跳掉,最后他还只能把那个任务放到102去执行才能执行完。
25:02
啊,执行完,但是你的任务整个是执行完了啊,这你要注意的,你不要说看到P就认为你的代码方法有错了,就是因为咱们是虚拟机的一个环境啊,资源有限,没办法。好,然后同样的你也要点到这个task里边,然后具体的要看啊,就看这个log,这个log点进来,它也同样的,所有的一个过程,所有的一个过程都能看到,他这个如果说有错,哎,就能看到它的一个详细的一个错误信息啊,详细的一个错误信息,你这块可以去搜什么呢?如果说他一个日志比较多啊,你可以搜一下,你不是自己自定义了几个类是吧。你直接在这搜,你把你的类比输进去,可以快速的定位到一个错误。因为你在这块有错的话,肯定是你代码出了问题吧,啊,肯定是你的代码出了问题,你先找你代码啊,因为这一块如果说特别多的话,你不好不好看,你直接到C到F搜一下,搜你自己写的那几个类比,你把它加在这,你看这个报错的异常里面有没有你的类。那有你们自己写的类的话,那肯定是你代码写的有问题吧,啊,你就快速定位到,然后去排错啊,这样更快一点,更快一点,而不是说盯着这个地方的错误啊,看半天也看不出来什么情况啊,看不出来什么情况,这要注意的一个点。
我来说两句