- 浏览: 151050 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (113)
- Java工具类 (3)
- Hibernate (1)
- Struts>1&2 (0)
- Spring (0)
- Web前端 (1)
- 数据库 (2)
- 中间件 (3)
- 搜索引擎 (11)
- EJB (1)
- Log日志 (1)
- OS操作系统 (7)
- Java文档 (4)
- Security (1)
- Exception&Error (7)
- 日志&心情 (7)
- 开心一下 (3)
- 云计算 (41)
- Cache缓存 (4)
- MongoDB (1)
- OS操作系统 Linux (7)
- jquery (1)
- 机器学习 (2)
- Plugins (2)
- AJAX (1)
- Java工具 (1)
- WebService (1)
最新评论
-
a420144030:
你好,我想计算n篇文章的相似度,用mahout能处理吗,如何做 ...
mahout使用 -
di1984HIT:
OK,真的很牛啊
hadoop常见错误 -
xwl1991:
还真是这个问题 !
quartz报错java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.ord
hadoop/mapred 优化方法
- 博客分类:
- 云计算
从三个方面着手优化 :
1. hadoop配置
2. 设计mapred/job
3. 代码级别.
4.
改造hadoop
一. conf/hadoop-site.xml配置.
经验要求高,
特别需要结合实际情况.
典型参数如
复制因子,
mapred.child.java.opts,
mapred.tasktracker.map.tasks.maximum,
mapred.tasktracker.reduce.tasks.maximum,
mapred.map.tasks,
mapred.reduce.tasks,
fs.inmemory.size.mb,
dfs.block.size
等等
二.
在同一个job内完成尽可能多的计算任务, 主要是设计key和自定义OutputFormat, 将能合并的计算任务合并.
举例 :
用户访问行为(userid, ip, cookie), 分别统计每个用户的ip数和cookie数.
最简单的设计, 是使用量个job,
分别计算ip数和cookie数.但是我们可以按照下面的思路, 在一个job中完成这两项计算 :
(a).
把userid和字段存储到key中
public class UserKey implements
WritableComparable<UserKey>{
int userId;//userid
byte
field;//0 代表ip, 1代表cookie
@Override
public int compareTo(UserKey
o) {
if(userId > o.userId)return 1;
if(userId <
o.userId)return -1;
if(field > o.field)return 1;
if(field < o.field)return -1;
return 0;
}
@Override
public void readFields(DataInput in) throws IOException
{
// TODO Auto-generated method stub
}
@Override
public void write(DataOutput out) throws IOException {
// TODO
Auto-generated method stub
}
}
(b). 实现自定义的OutputFormat,
下面是两处关键代码如下 :
(x).
SequenceFile.Writer[] writers = new
SequenceFile.Writer[2];
writers[0] =
SequenceFile.createWriter(FileSystem.get(conf), conf, "ip", IntWritable.class,
IntWritable.class, CompressionType.BLOCK, new DefaultCodec());
writers[1] =
SequenceFile.createWriter(FileSystem.get(conf), conf, "field",
IntWritable.class, IntWritable.class, CompressionType.BLOCK, new
DefaultCodec());
(xx).
writers[key.field].append(key.userId,
value.get());
三. 避免不必要的reduce任务.
(1). 假定要处理的数据是排序且已经分区的. 或者对于一份数据,
需要多次处理, 可以先排序分区.
(2). 自定义InputSplit, 将单个分区作为单个mapred的输入.
(3). 在map中处理数据,
Reducer设置为空.
这样, 既重用了已有的 "排序", 也避免了多余的reduce任务.
四.
使用自定义的MapRunnable.
hadoop自带了两个MapRunnable,
(1). 一个是默认的单线程MapRunnable,
org.apache.hadoop.mapred.MapRunner
(2).另一个是多线程的,
org.apache.hadoop.mapred.lib.MultithreadedMapRunner.
根据特定情况,
可以自定义MapRunnable,
(1). 启用多线程, 比如web爬行时, 可启用多线程抓取网页.
(2). 避免map时,
单台tasktracker上辅助数据冗余, 比如在多模匹配时, 避免生成多份DFA.
五. 在某些情况下,
利用数据分布特性设计PARTITIONER的分区算法,
避免单个mapred消耗时间过长.
这跟木桶原理有些神似.
比如处理大量字符串时,
(1).
已知首字不同的字符串之间不存在任何关联关系
(2). 原始数据在某些 "首字" 上分布密集, 另一些 "首字" 上分布稀疏.
例如, 原始数据中,
1亿个以3开头, 1亿个以7开头, 3个以6开头.
那么,
(1). 如果以首字对4求余分区, 则 "1亿个以3开头" 和
"1亿个以7开头"将落在同一分区.若hadoop群集只支持同时2个map任务, 则...
(2). 如果以首字对3求余分区, 则 "1亿个以3开头" 和
"1亿个以7开头"将落在不同分区.
六. 最大限度地重用对象, 避免对象的生成/销毁开销.
该点在hadoop自带的
org.apache.hadoop.mapred.MapRunner中尤为突出,
它使用同一个key对象和同一个value对象不停读取原始数据,
再将自身交给mapper处理.
(此处注意, 若要保留该对象的即时状态, 需要clone, 深克隆或浅克隆.)
七. 在逻辑意义上,
合并同一对象. 如dotnet和java中的字符串INTERN技术.
八. 根据已有条件, 简化循环判定.
比如, for(int i =
0; i < end && i < size; i++);
可以改成 :
end = end < size ?
end : size;
for(int i = 0; i < end; i++);
九. 降低多线程数目,
而让固定数目的线程循环处理.
比如, 一台机器8个CPU, 现在需要处理80亿个数据,
那么下面两个方案 :
(1). 启动800个线程,
每个线程处理80亿/800个数据.
(2). 启动8个线程(注意, 此处是8个), 每个线程循环处理,
每次循环处理100万个.
通常我个人选择方案(2).因为 :
(1). 最大限度利用了CPU.
(2). 避免了线程调度.
(3).
在java中, 可以使用AtomicInteger控制线程循环, AtomicInteger的效率很高.
(4). 有时,
还可以避免单个线程消耗时间过长.
十. 使用位移替代浮点数计算. 比如用 100 >> 3替代100 * 0.125.
(另外,
我们会需要将某个中间值乘以一个调节因子(经验值), 比如乘以0.12,
如果乘以0.12和0.124 "差不多" 时,
可以考虑直接使用位移).
十一. 避免循环体内不必要的判断逻辑, 与第八条不同.
比如, 处理10亿个数据, 每遇到一个有效数据时,
需要同前一个有效数据进行关联处理(或与前一个中间值进行关联处理),
for(int i = 0; i < size;
i++)
{
//1. 判定是否存在前一个有效数据
//2. 如果不存在前一个有效数据, 则continue;
//3.
如果存在前一个有效数据, 则进行关联处理, 再continue.
}
通常在此种需求下, 一旦遇到一个有效数据,
必定会产生一个可供后续紧邻数据关联的值,
那么 :
int i = 0;
for(int i = 0; i < size;
i++)
{
//1. data[i]是否有效?
//2. data[i]无效, continue;
//3. data[i]有效,
break;
}
for(; i < size; i++)
{
//与前一个有效数据进行关联处理,
再continue.
}
十二. 方法调用过程, 辅助数据尽量放在方法体内, 避免使用全局辅助数据, 一来节省内存,
二来提高对象可重用性.
十三. 尽量不要生成转瞬即逝的对象, 或者专门构建专属对像来完成这一任务.
比如 :
1).
提供直接使用构造函数参数进行序列化的静态方法, 避免先使用参数构造对象再进行序列化.
2). 参考上述第六点.
十四. 利用-1 和
1的关联性, 减少内存使用量, 或携带更多的信息.
比如java.util.Arrays.binarySearch方法的返回值.
十五.
对于方方正正的多位数组Arr[d0][d1][d2]..[dn], 且di >> d(i+1)时, 可以考虑使用一维数组替代,
减少对象.
这是因为java中多位数组实际上使用 "数组的数组" 实现的.
十六.
尽量使key的WritableComparable性能最佳, 尽量使value的Writable性能最佳.
比如使用掩码操作.
十七.
尽早丢弃无关对象.
见 "使用hadoop/mapred的典型计数问题".
十八. 改造hadoop, 使merge过程更具弹性,
或更符合实际需求.
比如 :
1). 使reduce的<key, values>中的values按照顺序迭代.
2). 见
"使用hadoop/mapred的典型计数问题".
十九. 有效设计mapred中的combiner, 尽早降低I/O等操作.
此过程中,
可以结合自定义OutputFormat, 使得同一个Recuder类可同时充当map->merge->reduce中的后两个过程.
见
"使用hadoop/mapred的典型计数问题".
转自:http://thethethethethethe.spaces.live.com/default.aspx
发表评论
-
用Sqoop把数据从HDFS导入到MYSQL
2012-10-27 23:30 2315转自:http://www.kaifajie.cn/mySQL ... -
大数据的储存:百度HDFS集群的数据压缩
2012-08-30 17:48 11512012年4月13日,由IT168(ITP ... -
用sqoop进行mysql和hdfs系统间的数据互导
2012-07-31 16:32 1878转自:http://abloz.com/2012/07/19/ ... -
从hive将数据导出到mysql
2012-07-31 16:31 1783转自:http://abloz.com/2012/07/20/ ... -
Hive SQL
2012-07-19 13:49 1399转自:http://www.tbdata.org/ ... -
Hive优化总结
2012-07-09 15:18 4265优化时,把hive sql当做ma ... -
hadoop集群dfs.data.dir目录权限问题导致节点无法启动
2012-06-11 18:32 6186安装使用Hive的时候发现文件无法从本地拷贝到hadoo ... -
hadoop中的balancer
2012-06-11 15:49 1103对于HDFS集群,经常长时间的运行,尤其是大量的delete操 ... -
Hadoop集群上使用Lzo压缩
2012-05-28 11:03 900转自:http://www.tech126.com/hadoo ... -
使用Hive读取Hbase中的数据
2012-05-23 13:12 2239转自:http://www.4ucode.com/Study/ ... -
在XP系统下配置eclipse集成hadoop开发
2012-05-05 11:09 1009一、目的:由于hadoop只能在Linux环境下运行,所以对于 ... -
使用Hive读取Hbase中的数据
2012-04-18 14:24 1053转自:http://www.4ucode.com/Study/ ... -
Web日志分析方法概述 让复杂的数据挖掘变得简单可行
2012-04-13 16:31 834志在计算机系统中是一个非常广泛的概念,任何程序都有可能输出日志 ... -
应用sqoop将MySQL数据库中的数据导入Hbase
2012-04-12 11:31 2033转自:http://www.bwxxkj.com/a/jish ... -
hadoop中的trash机制,恢复删除的文件
2012-03-31 13:46 2153Hadoop回收站trash,默认是关闭的。 1.修改con ... -
Hadoop 和DBMS 的互补性
2012-03-29 12:22 643随着Microsoft 也加入Hadoop 阵营,Hadoop ... -
Hadoop 中的两表join
2012-03-29 12:20 823转自:http://www.gemini52013 ... -
各版本编译hadoop eclipse plugin
2012-03-29 12:19 1350转自:http://www.gemini52013 ... -
hadoop常见错误
2012-03-24 13:04 1619错误1:bin/hadoop dfs 不能正常启动,持续提 ... -
hbase运维
2012-03-23 17:33 1281转自:http://blog.bluedavy.c ...
相关推荐
hadoop/etc/hadoop/6个文件 core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml yarn-env.sh yarn-site.xml
所以需要重新编译Container-executor,这边提供重新编译好的,默认加载配置文件路径/etc/hadoop/container-executor.cfg 使用方法: 1 替换/$HADOOP_HOME/bin/下的container-executor 2 创建/etc/hadoop目录,并将...
数据算法Hadoop/Spark大数据处理技巧 源代码 内有部分数据集
在windows环境下安装hadoop环境的时候,会缺少该文件。
《数据算法:Hadoop/Spark算法》全书的PDF版,非影印非影印非影印!采用拍照的方式拍的,高清清晰
数据算法:Hadoop/Spark大数据处理技巧
Hadoop/etc/hadoop/slaves 的IP地址要变。 5个重要的配置文件逐个检查,IP地址需要变 2.配置文件确认无错误,看日志: 从logs日志中寻找slave的namenode为什么没有起来。 3.最后发现是hdfs中存在上次的数据,删掉...
hadoop 2.9.0 mapred-site.xml 全部属性集,默认值及属性描述,其中关键属性已使用pdf注释
大数据整理hadoop/hive
Hadoop源码 包含mapred
基于Hadoop/Hive的web日志分析系统的设计,为广大大数据爱好者提供更好的帮助,喜欢可以下载
spark 数据算法 Hadoop/Spark大数据处理技巧(Data Algorithms) ,算法详解电子书
export HADOOP_HOME="/usr/local/hadoop/" export JAVA_HOME="/usr/local/hadoop/jdk1.6.0_24" export CLASSPATH="$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:${HADOOP_HOME}/lib/commons-logging-1.0.4.jar...
对Hadoop中的HDFS、MapReduce、Hbase系列知识的介绍。如果想初略了解Hadoop 可下载观看
一种基于Kafka/Hadoop/Hive平台的大规模智慧路灯的数据采集与处理系统,何沙,肖波,随着信息科技的飞速发展,智慧路灯出现在了人们视野中。区别于普通路灯,智慧路灯集成了很多智能模块。这些模块实时地向服务器上
详细的hadoop单机配置步骤,非常好的一个文档。
用于win7开发、调试下读取HDFS文件(包括hive读取),hadoop2.6.3
hadoop 启动时 TaskTracker无法启动 ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task ...我采用修改FileUtil类 checkReturnValue方法代码 重新编译 替换原来的hadoop-core-1.0.0.jar文件 来解决
执行:hadoop jar matrix.jar com.baosight.mapred.test.MatrixMulti left:/tmp/a right:/tmp/b output:/tmp/c leftprefix:000000_ rightprefix:000000_ >参数1:left:左矩阵路径 >参数2:right:右矩阵路径 >...
中文版,一共3卷,第1卷。了解spark技术内幕 了解spark技术内幕