这周是在PSBC实习的第三周。上一周因为周末与 @BoilerYao 强者去玩耍了,没有记下来。这一周打算连上一次一起补上。

第二周

周一

周一主要还是在继续第一周的配置环境。安装impala,感觉就是我本身对集群的配置就完全不清楚,让我在不清楚配置的集群上安装服务简直是有点强人所难。

安装impala我在当天中午就没有继续了。不过这是一个玄妙的大坑,在下面我会再提到它。

在下午章主管先是私下与我沟通,之后开会分配了任务。我将负责一个根据数据分析公司风险的项目。(当然我认为在我实习期间恐怕只能做出来开头)

周二至周四

这段时间去尝试做章主管分配的任务。说实话以我对PLSQL语法的程度,估计写一个基本的查询都费劲。这后面的时间我一直都可以被认为在熟悉PLSQL怎么写。主要是我对于如何存储中间的变量存在疑惑。

这是一个大问题。因为面对的是大量的数据,有可能内存也放不下中间的存储结果。潘哥给出的答案是使用中间数据表,这样用物理存储代替内存被消耗,只是效率会比较低,然而对于仅仅做数据分析来说,这样是完全足够的。其实还有一种解决方案是通过cursor和pipeline function来小部分地去取用数据,但是恐怕写起来就有点费劲了。

曾姐安排的任务就是熟悉数据,其实我是非常感激这样的用意的。因为我对公司整体的业务流程和现在表中数据的情况意义一无所知。有这么几天一脸懵逼的时间才知道遇到的难题是什么,除了数据量大之外,大概就是数据的质量问题了。比如数据文档中非空的字段会有空值,比如数据中会出现在规定值以外的值,比如完全意义不明的拼音缩写列。

PLSQL总结

怎么说,PLSQL算是学到了不少,发现PLSQL有些地方还是能说得过去的:

  • 能用RE
  • 完备的时间相关的类型和函数
  • 方便的rank() over()语法
  • 隐式游标的写法

周五

周五大概觉得自己恐怕毫无希望完全掌握PLSQL语句,于是开始打算走一点歪门邪道。

最初是打算直接自己写一个访问数据库的界面来作为最终的成品,从而能有一些处理语句可以不必在PLSQL中实现。但是被告知此阶段最终的成品应该是一个可供其他人使用的表,而且代码形式应该是以存储过程的方式出现之后打消了念头。

于是又打算通过ORM的库比如SQLAlchemy来输出SQL语句。因为我恐怕对这种形式的SQL可能更好理解,也能避免出现一些诡异的语法问题。不过最后还是没有完全实现。

第三周

周一

这一天开始写一个求平均值的PLSQL语句。数据的存储方式是记录变更点。

这对于使用其它语言来说,不算是艰巨的任务。但是对于我并不熟悉的PLSQL,大概就比较伤神了。前前后后各种修修补补,花了一天总算搓出来了。

嗯,然后第二天被告知这个平均值是有表的,直接从表中取就行了哦。(掀桌子)

周二至周五

之前部署的impala的同事再次让我帮忙,而我又基本没思路写PLSQL了,于是打算先开始帮着部署这个服务。怎么说呢,这是一个遗留的问题。

最初搭建这个集群的人据说是一位中科院的大佬。然而怎么说,有一些遗留的问题,而且最初也没找到留下的文档。总的来说都是一些版本相关的问题,最初我真的完全不知道原有的版本是什么,直到后来才慢慢意识到。

  1. 首先是yum源中没有impala包文件的问题。

    从外网中下载相应的impala包文件,然后回来用createrepo指令更新源信息,从网上下载的。这时还出现了由于zlib版本不一致导致的yum失去响应的问题,通过统一软连接解决。

  2. ssh免密登录的问题

    写了一个脚本来完成。其中利器是expect命令。

  3. ambari-impala-service 的 JAVA_HOME 问题

    我们在ambari中安装impala服务所使用的是中科院出品的这个服务,说实话是很好用,只是有几个小问题,然而就被几个小问题给卡住了。

    首先可能是因为写这个文件的时候设计是JDK配置在/usr/jdk64/这个文件夹下,但是在这个集群中并不是如此,所以每一次安装都需要在/etc/default/bigtop-utils中重写JAVA_HOME变量。

  4. 链接hbase相关的jar包的问题

    impala需要hbase的jar包作为支持,但是在上面提到的ambari-impala-service的安装脚本(package/template/init_lib.sh.j2)中链接了其它的jar包却没有链接HBase相关的jar包。所以还需要手动地链接HBase的库。(我想是因为在这种服务中没法确定HBase的jar包的位置)

  5. impala版本的问题

    最初下的是cdh-5.15.0的impala的rpm包。(因为上面ambari-impala-service没有指定cdh5的版本,所以下了最新的)

    然后impala莫名其妙崩溃了,报错显示 core dumped failed,要更改上面ambari-impala-servce中启动选项(package/template/impala.j2)中的ENABLE_CORE_DUMPS为true以显示报错信息。

    报错信息是某个impala-2.12-cdh5.15.0的issue(但是我没记住),总之在那之后就决定重新换到impala-2.6.0-cdh5.8.0。于是再次下载包文件,用createrepo更新不提。

  6. 删除ambari服务的问题

    要删除某一个ambari服务需要首先暂停所有服务,然后通过DELETE方式向某个API(/api/v1/clusters/<cluster-name>/services/<service-name>)发出请求。

    但是这样删除并非完整,只是在ambari中删除了这个服务,但是实际上rpm包仍旧没有被删除。在之后的两天一直被没有完全卸载的impala版本之间折磨着。直到发现,啊,原来还是需要手动删除rpm包的。方才完全用上了新的impala。

  7. jar包版本的问题。

    这是一个在文档中说明了的问题,需要下载特定版本(也即cdh-5.8.0的)Hbase的jar包,重新连接。

当然在这几天还是写了一些为了快速配置而使用的脚本的,不过用时实在说不上长,所以就不提了。

总结

主要是要了解一下业务流程,知道数据从何处去取。然后考虑的是一个数据清洗的问题。对于PLSQL,实在太不熟悉,还需要重新看看它的语法。