程序员的自我修养

Hive关于Full Join的疑问

1条评论2,811次浏览

Join与filter的顺序

根据官方文档的说法,join发生在前,filter发生在后。所以如果这样写join sql则会先将整个表join然后在按照where条件过滤:

显然这样背离了初衷。正确的写法应该是:

两种写法虽然感觉是一样的意思,理论上计算出来的结果应该也是一样。但通过实际应用,发现结果居然是不一样的,两者的结果数量可能会相差一个数量级以上,而输出正确的是第二种写法。至于为何第一种写法会出现不一样的结果,等有时间了在研究下。感觉应该是数据的问题,而不是hive有bug。

从日志也可以看到两种语句的map数量不一样,第一种会扫描全表,而第二种只扫描where条件中的特定的partition。

然而以上都不是重点

(更多…)

分类:Apache Hive
标签:

CDH集群调优:内存、Vcores和DRF

1条评论7,617次浏览

吐槽

最近“闲”来无事,通过CM把vcores使用情况调出来看了一眼,发现不论集群中有多少个任务在跑,已分配的VCores始终不会超过120。而集群的可用Vcores是360(15台机器×24虚拟核)。这就相当于CPU资源只用到了1/3,作为一个半强迫症患者绝对不能容忍这样的事情发生。

分析的过程不表,其实很简单就是几个参数的问题。本以为CM能智能的将这些东西配好,现在看来好像不行。以下记录结论。

DRF和相关参数

DRF: Dominant Resource Fairness,根据CPU和内存公平调度资源。CDH动态资源池默认采用的DRF计划策略。简单的理解就是内存不够的时候,多余的CPU就不会分配任务了,就让他空着;CPU不够的时候,多出来的内存也不会再启动任务了。

理解这个计划策略后,再查看Yarn启动任务时资源相关的参数,发现有以下几个参数可能会产生影响:

  • mapreduce.map.memory.mb,map任务内存,cdh默认1G
  • mapreduce.map.cpu.vcores,map任务虚拟CPU核数,cdh默认1
  • mapreduce.reduce.memory.mb,reduce任务内存,cdh默认1G
  • mapreduce.reduce.cpu.vcores,reduce任务虚拟CPU核数,cdh默认1
  • yarn.nodemanager.resource.memory-mb,容器内存,cdh默认8G
  • yarn.nodemanager.resource.cpu-vcores,容器虚拟CPU核数,cdh默认8,但CM会自动检测内核数并修改,我这里被自动改成了24。

可以看到默认配置下,CPU核数和内存是1:1G的比例来启动任务的。
(更多…)

分类:Apache Hadoop, CDH
标签:,

战5渣系列——Spark Streaming启动问题

0条评论4,813次浏览

测试集群上Flume监控本地文件夹+Spark Streaming跑的没问题,但放到生产环境上来测试却一直报错,启动命令如下:

报错信息如下:

(更多…)

分类:Apache Spark, 战5渣
标签:,

Flume+Spark Steaming初探

2条评论10,254次浏览

公司业务准备上流数据处理了。由于之前基础平台选用了CDH,而CDH自带Spark,且由于数据源是每隔几分钟发一组数据文件的形式来传送数据,所以最终选取用Spark Steaming来做流数据处理。

下面记录初步使用Spark Steaming和Flume的一些过程。

第一个测试:Flume(spooldir to hdfs)

原始数据通过ftp每隔几分钟拉取一批数据到本地某文件夹。于是测试了下flume监控文件夹并将新加入的文件写入hdfs的功能。

配置文件如下:

根据官方文档hdfs.fileType默认是SequenceFile,这里选用DataStream将不压缩输出文件。

若不设置hdfs.useLocalTimeStamptrue则会报下面的错误,暂时不知为何。
(更多…)

标签:,

Hive窗口和分析函数(上)

0条评论4,348次浏览

之前记录row_number()的使用方法,最近终于有空将窗口函数这一块完整的看一遍,在此记录。

Analytics functions

RANK()、DENSE_RANK()、ROW_NUMBER()

使用示例:

其中PARTITION by calling_nbr可选,若加上则是窗口内统计,否则则是全局统计。

部分结果如下:

(更多…)

分类:Apache Hive
标签:,

Hive常用操作记录

1条评论3,425次浏览

记录日常工作中Hive相关的常用语句。之前总是东一个文件西一个文件的丢这些语句,导致需要用的时候总是找不到,要去网上重新查。

创建外部表

添加分区

设置NULL值的替代字符

OR
(更多…)

分类:Apache Hive
标签:

Hive Custom UDF

1条评论5,736次浏览

需求

最近有这么一个需求要实现,由于话单中的区号不准确,需要根据区号-号段对应表来刷新话单中的区号信息。业务逻辑类似如下:

就是将号码与区号-号段对应表中的记录来对比,返回该号码所属于的号码段的区号。在oracle中测试了下,不加limit 1是好使的。但是放到Hive中却一直报错,不认这样的语法。尝试其它方法无果,最后决定用UDF实现。

定制UDF

最大的问题

如何在UDF中读入区号-号段对应表的数据?

Hive的UDF类没有类似setup()这样的在开头调用一次的方法,只是单纯写evaluate()方法来实现逻辑,显然不能在evaluate()方法中读入区号-号段对应表的数据,否则每一次调用该方法都会重新读一次数据,开销太大,方法也太挫。GenericUDF当中有initialize()方法,但太过复杂,没法应付这次紧急需求。
(更多…)

分类:Apache Hive
标签:

CDH集群常用管理操作

3条评论4,871次浏览

调整replication

随着业务数据的不断增加,hdfs可用空间逐渐减少。经过再三考虑决定将集群的备份数量由2变为1,也就是不在备份,每个数据块只有唯一的一份存档。

当初备份数由3调成2时只是简单的将dfs.replication由3变成了2,然后分发配置重启集群。记得当时通过hdfs dfsadmin -report查看hdfs占用大小发现大小一直在减少。心想着hdfs还挺智能的,知道备份数减少了,自己去删除多余的副本了。

结果这次将dfs.replication由2变成了1后发现hdfs空间一直保持不变。难道上次的记忆出错了,hdfs其实并不会自己去调整备份数?

后来查了相关资料,证实hdfs确实不会根据dfs.replication参数来自动调整备份数。这个参数是给client端用的,当有新文件写入时,会根据该参数确定复制几份,但集群已有的文件备份数不受该参数的影响。

于是使用命令hadoop fs -setrep -R 1 /将集群全部文件的备份数变为1。再次查看集群空间大小,发现下降了一半。成功。
(更多…)

分类:CDH
标签:

Hive row_number()使用方法

0条评论7,427次浏览

需求

根据短信月详单实现Top 10短信联系人的功能。就是计算出每个号码发送短信最多的10个号码(由于电信业务规则,接收到的短信不会产生记录,所以只能计算发送短信最多的10个号码)。

数据全部通过datax从oracle导入到hdfs上,然后通过hive外部表的形式进行管理。

第一步

初步一看貌似用原生MapReduce比较好解决,毕竟以前用MR处理过类似的需求。但是最近刚刚建议老总将能转移到hive上用sql实现的业务全部转移过来,于是想想还是尝试用sql实现吧。

首先先试试根据发送短信号码、接收短信号码group来计算每个号码对的短信次数。

(更多…)

分类:Apache Hive
标签:

SSH隧道

1条评论2,600次浏览

最近跟同事学了一招SSH隧道,感觉十分牛掰。在此记录。

适用场景

生产环境中的集群往往在一个局域网中,而该局域网只能通过某台特定的堡垒机来访问。这样的网络环境下可以通过SSH隧道将一些端口隐射出来,比如CM的7180和HUE的8888端口,这样就可以在本机上通过浏览器来访问CM和HUE了。

命令示例与解释

上述命令意思是通过接口机(ssh端口为8282)将master-ip机器的7180端口隐射到本机的7180端口,这样可以通过访问http://localhost:7180来访问master-ip机器的7180端口。

参数详解

  • -C Enable compression. 压缩数据传输。
  • -f Fork into background after authentication. 后台认证用户/密码,通常和-N连用,不用登录到远程主机。
  • -N Do not execute a shell or command. 不执行脚本或命令,通常与-f连用。
  • -g Allow remote hosts to connect to forwarded ports. 在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。
  • -L port:host:hostport. 将本地机(客户机)的某个端口转发到远端指定机器的指定端口。
  • -p port. 指定跳转机器的ssh端口号。

其它

可通过ps -ef|grep ssh 来查看ssh隧道的的进程号,kill掉即可关闭该隧道。

隧道若长期闲置也会出现超时,此时kill掉再重新连接吧。

分类:杂七杂八
标签:
profile
  • 文章总数:79篇
  • 评论总数:254条
  • 分类总数:31个
  • 标签总数:44个
  • 运行时间:1192天

大家好,欢迎来到selfup.cn。

这不是一个只谈技术的博客,这里记录我成长的点点滴滴,coding、riding and everthing!

最新评论
  • Anonymous: :arrow: :neutral: :cry:
  • Anonymous: java.io.NotSerializableExcepti on: DStream checkpointing has been enabled but the DStreams with their...
  • wick: HI,请问一下,U,S,V得到后,怎么得到近似矩阵呢(用sp ark java),谢谢。
  • Michael Whitaker: Thank you for this blog, it was very helpful in troubleshooting my own issues. It seems that no...
  • Anonymous: :mad:
  • Anonymous: :???:
  • Anonymous: :mad: :mad: :mad:
  • 洋流: 哥们,我问个问题,你把testOnborrow去掉了。。如果 得到的jedis资源是个不可用的,服务从来都不出问题么?
  • 洋流: 哥们,我问个问题,你把testOnborrow去掉了。。如果 得到的jedis资源是个不可用的,服务从来都不出问题么?
  • Anonymous: :razz: :evil: :grin:
  • 张瑞昌: 有很多,比较常见的是Jacob迭代法,一次迭代O(n^3), 迭代次数不清楚。 如果是手动算的话按照定义求就可以了
  • Anonymous: :mrgreen:
  • lc277: 你好 我想问下一般删除节点要多久,要删除的datanode大概用了 1t,解除授权已经30多小时还没完成,请问是出现什么问题了吗 麻烦告诉下谢谢 qq1844554123
  • Anonymous: 你好 我想问下一般删除节点要多久,要删除的datanode大概用了 1t,解除授权已经30多小时还没完成,请问是出现什么问题了吗
  • Anonymous: :smile: :grin: :eek:
  • 李雪璇: 想要完整代码,可以帮忙发给我吗
  • Anonymous: 请问一下,那个 user的推荐结果楼主查看了么? 为什么输入数据 最高是五分,输出结果都是7分8分啥的?怎么设置输出的分数的最 大值?
  • Anonymous: 那个 user的推荐结果楼主查看了么? 为什么输入数据 最高是五分,输出结果都是7分8分啥的?
  • Anonymous: stopGracefullyOnShutdown在yarn- client模式下我测试的无效,你的呢
  • Anonymous: 另外,import的lib包能否发个列表.