- 浏览: 219326 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yugouai:
下载不了啊。。。
如何获取hive建表语句 -
help:
[root@hadoop-namenode 1 5 /usr/ ...
Sqoop -
085567:
lvshuding 写道请问,sqoop 安装时不用配置什么吗 ...
Sqoop -
085567:
lvshuding 写道请问,导入数据时,kv1.txt的文件 ...
hive与hbase整合 -
lvshuding:
请问,sqoop 安装时不用配置什么吗?
Sqoop
转自 http://thethethethethethe.spaces.live.com/blog/cns!A001241972EA08EA!232.entry
自V001以来, 收到不少朋友的阅读, 与大家交流.
现在有V002的初稿, 只是在V001的基础上改版, 并增加少量内容.
个人总结了10个可以考虑优化的点, 供大家参考, 也想抛砖引玉, 要是最后能形成一个 "优化大全" 就非常nb了.
欢迎拍砖.
***某些方法, 会导致程序可维护性会降低***
从三个方面着手优化 :
1. hadoop配置
2. 设计mapred/job
3. 代码级别.
一. 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 和 1的关联性, 减少内存使用量.
十五. 对于方方正正的多位数组Arr[d0][d1][d2]..[dn], 且di >> d(i+1)时, 可以考虑使用一维数组替代.
这是因为java中多位数组实际上使用 "数组的数组" 实现的.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/damnhe/archive/2009/05/06/4153886.aspx
自V001以来, 收到不少朋友的阅读, 与大家交流.
现在有V002的初稿, 只是在V001的基础上改版, 并增加少量内容.
个人总结了10个可以考虑优化的点, 供大家参考, 也想抛砖引玉, 要是最后能形成一个 "优化大全" 就非常nb了.
欢迎拍砖.
***某些方法, 会导致程序可维护性会降低***
从三个方面着手优化 :
1. hadoop配置
2. 设计mapred/job
3. 代码级别.
一. 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 和 1的关联性, 减少内存使用量.
十五. 对于方方正正的多位数组Arr[d0][d1][d2]..[dn], 且di >> d(i+1)时, 可以考虑使用一维数组替代.
这是因为java中多位数组实际上使用 "数组的数组" 实现的.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/damnhe/archive/2009/05/06/4153886.aspx
发表评论
-
hadoop状态分析系统chukwa(转)
2012-03-21 15:23 1070Apache 的开源项目 hadoop ... -
sqoop could not find any valid local directory 异常解决
2011-09-07 15:10 2544在没有更改任何配置的情况下sqoop突然报警:org.apac ... -
Hadoop 数据类型与文件结构剖析 Sequence, Map, Set, Array, BloomMap Files
2011-04-24 15:06 1055今天要推荐的一篇文章 ... -
百度Hadoop分布式系统揭秘:4000节点集群
2011-04-24 14:54 1138在 NoSQL 方面,之前了解到百度对 Hadoop 和 ... -
ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.lang.NumberFormatExc
2011-04-19 19:20 2206namenode莫名奇妙的启动不了,看log: 2011-0 ... -
zookeeper安装
2011-04-01 16:27 1062前提是已经安装好HADOOP ... -
sqoop应用错误记录
2011-04-01 16:26 860Connection refused 解决 ... -
Hadoop常见问题及解决办法(2)
2011-03-16 15:23 14231:Shuffle Error: Exceeded MA ... -
Hadoop集群优化手记
2011-03-16 15:21 1258<property> <name> ... -
Sqoop
2011-03-16 15:16 4338Sqoop是什么? 它是一个工具,一个在Hadoop和关 ... -
海量数据处理相关资料
2011-03-01 18:16 895逖靖寒的世界 :http://gpcuster.cn ... -
Hadoop中常出现的错误以及解决方法
2011-01-10 16:25 9511:Shuffle Error: Exceeded MAX_F ... -
直接使用HADOOP-RPC的编码实例
2010-09-06 17:13 13541、创建接口,该接口类在服务端和客户端都必须有。 publi ... -
mapreduce技术的开源c语言实现
2010-09-03 13:37 1238一、Stanford大学的Phoen ... -
hadoop c++ 扩展
2010-09-03 13:22 1581百度hadoop c++扩展介绍: http://zhaol ... -
hadoop安全
2010-09-03 10:23 926up and running with secure hado ... -
RedHat上安装hadoop+hbase问题记录
2010-08-27 14:16 1272安装在vshpere 虚拟机上,虚拟两台RedHat系统。 ... -
redhat 5.4部署单机伪分布Hadoop集群
2010-08-23 10:53 2440一、所需相关软件版本RedHat enterprise 5.4 ... -
Interpreting the Data:Parallel Analysis with Sawzall(3)
2010-07-12 15:56 110312 性能 虽然Sawzall是解释执行的,但是这不是影响性能 ... -
Interpreting the Data:Parallel Analysis with Sawzall(2)
2010-07-12 15:55 8587.Sawzall语言概览 作为一种查询语言,Sawzall是 ...
相关推荐
hadoop版本3.2.1 hadoop自带的Container-executor在配置yarn-kerberos时存在问题,...使用方法: 1 替换/$HADOOP_HOME/bin/下的container-executor 2 创建/etc/hadoop目录,并将container-executor.cfg放在该目录下即可
以上只是一部分属性的简要介绍,实际上,mapred-default.xml文件中包含了更多的配置项,这些配置项可以根据实际需求进行调整以优化MapReduce作业的性能。在使用Hadoop进行大数据处理时,合理配置这些参数是十分关键...
7. **优化与调优**:为了提高Hadoop集群的性能,需要考虑节点配置、网络拓扑、数据分布策略等因素,并可能需要调整MapReduce和HDFS的配置参数。 8. **安全性**:Hadoop 2.7.1支持Kerberos认证,增强了集群的安全性...
hadoop支持LZO压缩配置 将...org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.BZip2Codec, org.apache.hadoop.io.compress.SnappyCodec, ...
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据...
1. 修改配置文件:主要修改`etc/hadoop/core-site.xml`、`etc/hadoop/hdfs-site.xml`、`etc/hadoop/mapred-site.xml`和`etc/hadoop/yarn-site.xml`。这些文件中需要设置包括HDFS、MapReduce和YARN的相关参数,如...
hadoop3.3.0源码 # 科学上网下载比较快,可以自己电脑下好了在上传到服务器 wget https://downloads.apache.org/hadoop/common/hadoop-3.3.0/hadoop-3.3.0-src.tar.gz # 解压文件 tar -zxvf hadoop-3.3.0-src.tar.gz...
<name>hadoop.tmp.dir</name> <value>file:/root/soft/hadoop/tmp</value> <description>A base for other temporary directories.</description> </property> <name>fs.defaultFS</name> <value>hdfs://...
在Windows环境下搭建Hadoop生态系统时,常常会遇到一个关键组件——`winutils.exe`。这个文件是Apache Hadoop为Windows操作系统特别设计的一个实用工具,它在Hadoop的可执行文件目录`bin`下,用于模拟Linux环境中的...
org.apache.hadoop.mapred.gridmix.emulators.resourceusage org.apache.hadoop.mapred.jobcontrol org.apache.hadoop.mapred.join org.apache.hadoop.mapred.lib org.apache.hadoop.mapred.lib.aggregate org....
ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task tracker because java.io.IOException: Failed to set permissions of path: \tmp\hadoop-admin \mapred\local\ttprivate to 0700 at org.apache...
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory). log4j:WARN Please initialize the log4j system properly. log4j:WARN See ...
Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它允许在大规模集群中高效处理和存储海量数据。Hadoop-3.3.1是Hadoop的最新稳定版本,提供...了解其核心组件、新特性以及安装和使用方法,是掌握Hadoop的关键。
《Hadoop 2.9.1在Linux平台上的安装与实践》 Hadoop是一个开源的分布式计算框架,它由Apache基金会开发,旨在处理和存储大量数据。本文将围绕Hadoop 2.9.1版本在Linux环境下的安装、配置及使用进行详细阐述。 一、...
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator...688-692行注释,然后重新编译源代码,重新打一个hadoop.jar的包。
hadoop安装与配置 hadoop安装与配置 Hadoop的安装与配置可以分成几个主要步骤: 1. 安装Java 2. 下载Hadoop 3. 配置Hadoop 4. 格式化Hadoop文件系统 5. 启动Hadoop 以下是基于Linux系统的简化安装与配置步骤: 1. ...
本人经过4个小时顺利将hadoop官方的32位编译为64位,通过测试可用,方便在64位linux安装hadoop的用户使用,编译时间很长,也很苦啊,解决了很多报错的问题,所以分多要一点,还望理解! 注:*****因为本人CSDN等级...
在Hadoop-2.7.3的版本中,HDFS已经经过了多次优化,增强了数据的可靠性和系统的整体性能。 MapReduce是Hadoop的另一个关键组件,它是一种编程模型,用于处理和生成大规模数据集。Map阶段将数据分解成较小的数据块,...