mac下编译Hadoop
以前都是win下装个centos虚拟机编译hadoop,最近换了Mac,不用再装虚拟机了,直接编译Hadoop,很爽。但需要配置下hadoop的编译环境。在此记录下。
findbugs安装
下载findbugs-3.0.1.tar.gz,解压tar -zvxf findbugs-3.0.1.tar.gz,配置环境变量。在.bash_profile中添加FINDBUGS_HOME,并export
123FINDBUGS_HOME=/Users/hadoop/soft/findbugs-3.0.1PATH=$FINDBUGS_HOME/binexport FINDBUGS_HOME
protobuf安装
安装protobuf之前验证下是否有gcc,命令gcc --version进入protobuf-2.5.0目录执行./configure --prefix=/Users/hadoop/soft/protobuf-2.5.0然后安装就可以了,命令make && make install为了使用protoc命令方便,将bin目录添加到.bash_porfile中P ...
ganglia部署监控flume
debian环境下编译部署ganglia,用于监控flume。
ganglia编译部署ganglia主要包括gmond和gmeta,
gmond用于收集监测数据,可以发送也可以接收在同一个组播或单播通道上的统计信息。gmond有两个角色,一个是发送者,另一个是接收者。当mute=no时,gmond是发送者,会收集本节点上的基本指标,比如系统负载(load_one)、cpu和memory利用率等,也可以发送用户通过添加C/Python模块来自定义的指标。当deaf=no是接收者,主要用来聚合所有从别的节点上发来的指标(如flume agent发来的metrics信息),并把他们都保存在内存缓冲区中。gmond节点之间通过UDP收集数据,gmetad通过TCP从gmond节点获取数据
gmeta定期检查gmond,拉取gmond上的数据,并将他们的指标存储在RRD存储引擎中。
除此之外还有个web组件用于显示监控图,ganglia-web(或者ganglia-webfrontend)
下面开始编译ganglia,官网上gmond、gmeta和ganglia-web是分开的两个安装包。g ...
单例模式引发的思考
单例是个老生常谈的话题,有很多种写法,每一种写起来代码都比较简单,但是每一种背后蕴含的知识可谓是一层套一层,套路很深呀。。。
本篇主要是记录下我对单例的理解。
熟悉单例的人都知道单例一般会有五种写法,分别为懒汉法(线程非安全)、线程安全的懒汉法、饿汉法、内部类法和枚举法。
饿汉法先说个intellij idea中单例模板代码(饿汉法):
1234567891011public class SingletonStatic { private static SingletonStatic singletonStatic = new SingletonStatic(); public static SingletonStatic getSingletonThink(){ return singletonStatic; } private SingletonStatic(){ System.out.println("construct function"); }& ...
MapReduce应用实例--二次排序之全局有序
上篇介绍了二次排序的场景和解决方案,但是无法做到全局有序,本篇就介绍下如何进行全局二次排序。
全局排序让整个MR结果做到全局有序,其难点在partition上,也就是要保证分配给reducei的key一定比分配给reducej的key小(i小于j)。那么难点就在partition边界的设定上,边界值设置的不恰当,可能会导致每个reduce上分配的记录数不均匀,发生数据倾斜会导致整个job会被个别task拖慢。
那么最理想的方式是每个reduce上得到的record尽可能的均匀,并且在决定某个record被分配到哪个reduce的时间应尽可能的快,也就是partition方法需要尽可能的满足使record平均分配和分配算法高效。
Hadoop本身提供了TotalOrderPartitioner类,此分区方法保证了相同key分配到同一个reduce的前提下更保证了key的全局有序。只是此方法依赖一个partition file,该file是一个sequence file,里面存放这每个reduce中key的分界点,如果我们设置的reducer个数是N,那么这个文件包含(N-1)个key ...
数据结构算法之leetcode Reverse Integer
将一个int数翻转数字,只翻转数字,符号不做处理。
example:x = 123, return 321x = -123, return -321
数据越界则返回0
这个比较简单,就是将int的最高位和最低位依次进行调换,如果int中的每个字符都能拿到其索引值,那么就可以根据索引值进行依次对调。但在求每位上的数字时发现得到个位、十位、百位等上的数字的顺序其实就是在给int进行反转,那我只需要将每次得到的值进行依次记录,然后顺序输出就ok了。
按照这个思路,代码如下:
12345678910111213141516171819202122public static int reverse(int x) { // 其实这个思路还有一种更简单的,直接将int转为string, // 然后利用string中字符的索引进行交换得到反转字符串,然后再判断是否越界 if (x == 0 || x == Integer.MIN_VALUE){ return 0; } StringBuffer stringBuffer = new ...
数据结构算法之leetcode ZigZag Conversion
ZigZag转换就是将字符串按之字排列,然后按行输出。如字符串”PAYPALISHIRING”,ZigZag转换之后是
123P A H NA P L S I I GY I R
按行输出之后的字符串是”PAHNAPLSIIGYIR”。
用算法实现,参数为字符串和行数,返回按行输出的字符串。
题中给出了行数是奇数的排列方式,那么其对立面就是偶数,写出偶数的排列方式
1234P I IA L S R NY A H IP I
然后结合奇数和偶数的排列方式并未每个字符按照在原字符串中的顺序标上号之后,(其实使用数字作为字符串进行ZigZag转换看的更清晰)发现其有一个数学规律,每两个主列上字符索引的差值为2*row-2,而斜线上字符的索引不难看出是下一个字符的索引减去两个当前字符所在行索引的值。
发现这个普遍规律之后就万事大吉,可以写代码了吗?
我们发现了普遍的规律还应该去关注下特殊情况,也就是常说的边界值。
边界值考虑:
第一行和最后一行不存在斜线上的数据
最后的一个之字可能不完整,如只有斜线上的数据
代码如下:
123456 ...
实时抓取MySQL的更新数据到Hadoop
关系型数据库和Hadoop生态的沟通越来越密集,时效要求也越来越高。本篇就来调研下实时抓取MySQL更新数据到HDFS。
本篇仅作为调研报告。
初步调研了canal(Ali)+kafka connect+kafka、maxwell(Zendesk)+kafka和mysql_streamer(Yelp)+kafka。这几个工具抓取MySQL的方式都是通过扫描binlog,模拟MySQL master和slave(Mysql Replication架构–解决了:数据多点备份,提高数据可用性;读写分流,提高集群的并发能力。(并非是负载均衡);让一些非实时的数据操作,转移到slaves上进行。)之间的协议来实现实时更新的。
先科普下Canal
Canal简介原理原理相对比较简单:
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
mysql master收到dump请求,开始推送(slave拉取,不是master主动push给slaves)binary log给slave(也就是canal)
canal解析b ...
HUE编译与部署
Hue是一个开源的Apache Hadoop UI系统,是基于Python Web框架Django实现的。Hue可以使开发者在浏览器端的Web控制台上与Hadoop集群进行交互来分析处理数据,例如操作HDFS上的数据,运行MapReduce Job等等。
本篇中使用的HUE版本是3.9.0。(在实际生产中最好别使用3.9这个版本,因为这个版本的代码结构和3.7和3.10的代码都不一样)
HUE build
HUE在使用之前要先对其进行编译,编译时需要安装一些依赖包,我的环境是centos,安装的依赖包如下:
1sudo yum install gcc gcc-c++ libffi-devel libxml2-devel libxslt-devel openldap-devel python-devel sqlite-devel openssl-devel gmp-devel cyrus-sasl-devel cyrus-sasl-gssapi cyrus-sasl-plain krb5-devel
mvn mysql mysql-devel JDK make 之前已离线安装查看 ...
HUE开发环境部署及app二次开发
最近组里有个小需求要管理数字字典,数仓的字典在HUE中能够查看,但Mysql的字典呢?于是就想对HUE进行二次开发,增加一个App使其对Mysql的数字字典进行管理,也就是一个类似METASTORE TABLE的功能。
准备开发环境
导入IDE的HUE工程不是源代码,而是已经build成功的HUE工程。
eclipse pydev插件安装本来想用Intellij idea的,由于Intellij是在物理机(windows)上安装的,但HUE在windows下编译比较费劲,而之前HUE已在虚拟机中编译成功,虚机中又刚好有个eclipse,就选择用eclipse进行开发了。
IDE选好,就是为eclipse安装插件使其能够进行python开发,安装的插件是pydev,安装方法分为在线和离线两种,在线在虚机中的eclipse总是有点问题,显示插件安装成功可是总是找不到,换了n个版本的eclipse依然不行。就只好离线安装了,在http://sourceforge.net/projects/pydev/files/pydev/下载安装包,解压之后将features和plugins复制到e ...
HDFS租约解析
租约(Lease)是一种广泛应用与分布式系统领域的协议,主要用来维护分布式系统的一致性。
租约是在解决缓存一致性时被提出的。所谓租约,其实就是一个_合同_,即服务器给予_客户端_在_一定期限_内可以_控制修改操作_的权力。_如果服务器要修改数据,首先要征求拥有这块数据的租约的客户端的同意,之后才可以修改。_客户端从服务器读取数据时往往就同时获取租约,在租约期限内,如果没有收到服务器的修改请求,就可以保证当前缓存中的内容就是最新的。如果在租约期限内收到了修改数据的请求并且同意了,就需要清空缓存。在租约过 期以后,客户端如果还要从缓存读取数据,就必须重新获取租约,我们称这个操作为续约。
租约特性租约的一个重要的属性就是期限,一般情况下,应当选择较短的租约期限。与长租约相比,短租约有三个优点。首先,在失效情况下修改操作往往需要等待租约过期,因此短租约就意味着更短的失效延迟 。其次,就算一个客户端已经不再需要读取数据,但在其租约过期前,任何的修改操作仍然需要征求它的同意,这种情况叫做“假共享”,显然租约期限越长,这个问题就越严重。最后,短租约也使得服务器要维护的客户端信息更少。然而短租约也 ...