博客搬家
不好用;准备搬到这里:http://boylook.blog.51cto.com/[@more@]
Hive 调整inputsplit size来增加MAP数
线上一个Hive(CDH4.2.0)的清洗Job出错,查看日志发现其中一个MAP OOME: 查看了日志这个HQL是2个表进行Join,splits=2即开了2个MAP进行分别处理,其中一个大表123MB(<dfs.block.size=128MB),500W行左右,应该是数据量超过了MAP的内存了,通过对比前一天的日志可以确认: 由于是临时表,设置了mapred.reduce.tasks=20重跑新生成临时表,Join清洗成功: 由于MR的inputsplit size=min{minsplitsize,max{maxsplitsize,blocksize}},因此想是否可以通过设置mapred.max.split.size=32MB来起多个MAP这种方式解决
Sqoop splitkey支持的类型
前阶段一个Sqoop抽取Job指定了一个xxx_id作为splitkey,后来抽取失败;想当然以为PK就是int,发现其实是varchar(https://issues.apache.org/jira/browse/SQOOP-653还不被支持),后来换了一列抽取成功; Sqoop的splitkey在文档里只是简单的介绍了算法,但是没有介绍具体支持的splitkey column type, 查看源码支持的类型如下:BigDecimal,Boolean,Date,Float,Integer BigDecimalSplitter.java BooleanSplitter.java DBSplitter.java DateSplitter.java FloatSplitter.java IntegerSplitter.java
Sqoop fetchsize失效
前几天线上Sqoop的一个Job(从MySQL抽取数据到Hadoop)突然报了OOME,后重跑并做java trace发现内存占用都是byte[],同时cpu top 3的方法都是com.mysql.jdbc.ByteArraryBuffer.getBytes即内存都是被数据消耗掉了;很奇怪,为什么在option里指定了fetch-size=100怎么会OOME呢(平均记录长度不到1kb); 再看昨天成功的发现100W条记录,发现占用了860MB内存,明显是fetch-size没有生效 +---------+---------+------------+----------+-------------+--------------+ | type | status | host | cpusec
动态Zookeeper节点变更
最近做一次zk的线上迁移,由于线上使用的集群版本是CDH4.2,zk的版本是3.4.5,还不支持动态变更节点(在https://issues.apache.org/jira/browse/ZOOKEEPER-107才支持),只能通过关闭一个节点,起一个新的节点的方式: 现在有集群Z1,Z2,Z3;想把Z3迁移到Z4 1. 关闭Z3 2. 启动Z4,配置节点Z1,Z2,Z4 3. 重启Z2,修改配置;重启Z1,修改配置 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE
Cobar 源码分析(一)
TBD[@more@]
Flume-ng HDFS sink原理解析
HDFS sink主要处理过程在process方法: //循环batchSize次或者Channel为空 for (txnEventCount = 0; txnEventCount < batchSize; txnEventCount++) { //该方法会调用BasicTransactionSemantics的具体实现 Event event = channel.take(); if (event == null) { break; } ...... //sfWriter是一个LRU缓存,缓存对文件Handler,最大打开文件由参数maxopenfiles控制 BucketWriter bucketWriter = sfWriters.get(
Flume-ng FileChannel原理解析
v:* {behavior:url(#default#VML);} o:* {behavior:url(#default#VML);} w:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} 对于Flume来说主要有两个Channel:Memory,File;对于线上环境主要以FileChannel为主,因此这里主要讨论它的实现: 在FileChannel里主要由一个WAL的log和一个内存队列组成: FileChannel的Queue主要又以下几个部分组成: private final EventQueueBackingStore backingStore; private final InflightEventWrapper inflightTakes; private final Infli
关于共享SQL——窥视解析
parse[@more@]演员表:A——————boylookB——————hrC——————davidSQL> show userUSER is "BOYLOOK"SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------USERENV VIEWTEST_REFED TABLETO_TABLE TABLEFROM_TABLE TABLETEST TABLESQL> create table t(x int);Table created.SQL> select * from t;no rows sel
利用Oracle VPD实现行级安全保护(二)
VPD[@more@]通过VPD策略的设置,David只能够查看部门60和80的记录。SQL> conn davidEnter password: Connected.SQL> select employee_id,salary,first_name from hr.employees;EMPLOYEE_ID SALARY FIRST_NAME----------- ---------- -------------------- 103 9000 Alexander 104 6000 Bruce 105 4800 David 106 4800 Valli 107 4200 Diana 145 14000 John 146 13500 Karen 147 12000 Alberto 148 11000 Ge
利用Oracle VPD实现行级安全保护(一)
VPD[@more@]大家都知道,Oracle的锁机制是行级别的,下面来看看Oracle的安全访问机制: 安全的数据过滤,必须在基础数据表的一层就完成,这样用户无论是通过视图还是基础表都无法绕过安全控制。而VPD(virtual private database)最根本的能力就是“会透明的过滤数据”,提供行级安全保护。 Oracle8i以后的版本都提供了VPD这样一个强大的功能来实现呼声日益增高的系统安全性要求。通过设置基于VPD的细粒度访问策略,我们可以只通过DBA的工作(不需要修改应用,也就是应用透明化)就可以实现用户只能访问自己有权限访问的数据,当然如
模拟利用MV进行数据迁移
物化视图[@more@]利用MV的数据迁移最大的特点是比较灵活,可以实现跨平台,跨数据库版本迁移,而且能够实现数据的重组优化。该方式的实现原理要求在源表对象有一个主键,用于MV刷新。在源表上创建MV日志,再在目标数据库创建结构一样的表,然后在目标数据库上采用prebuilt方式创建MV,第一次采用完全刷新,然后一直采用增量刷新,等到要切换的时候,只要刷新增量的日志,删除MV,保留目标表即可。--创建源表SQL> create table from_table(id number,num number);Table created.--添加主键SQL> alter table from_table add constrain
Oracle在线重定义
在线重定义[@more@]Oracle9i之前,表数据的整理是通过 alter table XXX move [tablespace XX]进行的。如果表非常大,IO又不快的时候,move的过程可能相当漫长,不能算是HA特性。因此在HA的在线维护中,基本不会利用move来重组大型表,而且move后的表需要重建索引。而在9i引入的dbms_redefinition。该过程的内部原理其实就是采用了MV的机制,类似在原表建立一个prebuilt的MV然后一直增量刷新到数据差别最小。Oracle在很小的停顿中,完成最后一点的增量同步,达到完全同步后,把原表与新表换个名字,由于换名操作仅仅是数据字典,所以最终切
谁动了我的索引(三)
oracle索引学习[@more@]环境介绍:SQL> desc t1;Name Null? Type----------------------------------------- -------- ----------------------------NN NOT NULL NUMBERCNN NUMBERR ROWIDSQL> select count(distinct nn) a,count(distinct cnn) b,count(*) c from t1; A B C---------- ---------- ----------
谁动了我的索引(二)
oracle索引学习[@more@]接上文http://boylook.itpub.net/post/43144/520539;嗯,自从有了上次的经验,实验时建表都要把rowid拉进来,排除干扰:SQL> create table t2(ctn varchar2(10),num number,r rowid);Table created.SQL> insert into t2 select rownum,rownum,r from t1 where rownum <10001;10000 rows created.SQL> commit;Commit complete.SQL> create index idx_t2_ctn on t2(ctn);Index created.SQL> exec dbms_stats.gather_table_stats(user,'T2',cascade=>true);PL/SQL procedure successfully compl
谁动了我的索引(一)
Oracle索引学习[@more@]接上文http://boylook.itpub.net/post/43144/520538,谈谈在做演示实验的时候出现了一点小状况。对于演示实验,为了能够走索引,其实我做了三点准备:1.not null约束;2.在表t1基础上添加一列r而建立表t2;3.对表进行分析。本文其实也是针对这三点展开。 到底谁动了我的索引呢?跟我一起踏上找出“真凶”的旅程吧!case 1:关键字:B树索引;null;聚合函数SQL> select constraint_name,constraint_type from user_constraints where table_name = 'T1';CONSTRAINT_NAME C--------------------
not null与check is not null
not null与check is not null区别[@more@]在OCP SQL部分有这样一道题:You need to add a NOT NULL constraint to the QUANTITY column in the PO_DETAIL table. Which statement should you use to complete this task?正确 A. ALTER TABLE po_detail MODIFY (quantity NOT NULL) D. ALTER TABLE po_detail ADD CONSTRAINT quantity_nn NOT NULL(quantity);NOT NULL ConstraintsA NOT NULL constraint prohibits a column from containing nulls. The NULL keywordby itself does not actually define an integrity constraint, but you