hadoop机架感知

背景

    分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群。机架内的机器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。

    具体到Hadoop集群,由于hadoop的HDFS对数据文件的分布式存放是按照分块block存储,每个block会有多个副本(默认为3),并且为了数据的安全和高效,所以hadoop默认对3个副本的存放策略为:

第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的)。

第二个副本放置在与第一个节点不同的机架中的node中(随机选择)。 

第三个副本似乎放置在与第一个副本所在节点同一机架的另一个节点上

如果还有更多的副本就随机放在集群的node里。

这样的策略可以保证对该block所属文件的访问能够优先在本rack下找到,如果整个rack发生了异常,也可以在另外的rack上找到该block的副本。这样足够的高效,并且同时做到了数据的容错。

但是,hadoop对机架的感知并非是自适应的,亦即,hadoop集群分辨某台slave机器是属于哪个rack并非是只能的感知的,而是需要hadoop的管理者人为的告知hadoop哪台机器属于哪个rack,这样在hadoop的namenode启动初始化时,会将这些机器与rack的对应信息保存在内存中,用来作为对接下来所有的HDFS的写块操作分配datanode列表时(比如3个block对应三台datanode)的选择datanode策略,做到hadoop allocate block的策略:尽量将三个副本分布到不同的rack。
    接下来的问题就是:通过什么方式能够告知hadoop namenode哪些slaves机器属于哪个rack?以下是配置步骤。


配置

    默认情况下,hadoop的机架感知是没有被启用的。所以,在通常情况下,hadoop集群的HDFS在选机器的时候,是随机选择的,也就是说,很有可能在写数据时,hadoop将第一块数据block1写到了rack1上,然后随机的选择下将block2写入到了rack2下,此时两个rack之间产生了数据传输的流量,再接下来,在随机的情况下,又将block3重新又写回了rack1,此时,两个rack之间又产生了一次数据流量。在job处理的数据量非常的大,或者往hadoop推送的数据量非常大的时候,这种情况会造成rack之间的网络流量成倍的上升,成为性能的瓶颈,进而影响作业的性能以至于整个集群的服务。
    要将hadoop机架感知的功能启用,配置非常简单,在namenode所在机器的hadoop-site.xml配置文件中配置一个选项:

<property>
  <name>topology.script.file.name</name>
  <value>/path/to/RackAware.py</value>
</property

这个配置选项的value指定为一个可执行程序,通常为一个脚本,该脚本接受一个参数,输出一个值。接受的参数通常为某台datanode机器的ip地址,而输出的值通常为该ip地址对应的datanode所在的rack,例如”/rack1”。Namenode启动时,会判断该配置选项是否为空,如果非空,则表示已经用机架感知的配置,此时namenode会根据配置寻找该脚本,并在接收到每一个datanode的heartbeat时,将该datanode的ip地址作为参数传给该脚本运行,并将得到的输出作为该datanode所属的机架,保存到内存的一个map中。

    至于脚本的编写,就需要将真实的网络拓朴和机架信息了解清楚后,通过该脚本能够将机器的ip地址正确的映射到相应的机架上去。一个简单的实现如下:

复制代码
#!/usr/bin/python  
#-*-coding:UTF-8 -*-  
import sys  
  
rack = {"hadoopnode-176.tj":"rack1",  
        "hadoopnode-178.tj":"rack1",  
        "hadoopnode-179.tj":"rack1",  
        "hadoopnode-180.tj":"rack1",  
        "hadoopnode-186.tj":"rack2",  
        "hadoopnode-187.tj":"rack2",  
        "hadoopnode-188.tj":"rack2",  
        "hadoopnode-190.tj":"rack2",  
        "192.168.1.15":"rack1",  
        "192.168.1.17":"rack1",  
        "192.168.1.18":"rack1",  
        "192.168.1.19":"rack1",  
        "192.168.1.25":"rack2",  
        "192.168.1.26":"rack2",  
        "192.168.1.27":"rack2",  
        "192.168.1.29":"rack2",  
        }  
  
  
if __name__=="__main__":  
    print "/" + rack.get(sys.argv[1],"rack0")  
复制代码

由于没有找到确切的文档说明 到底是主机名还是ip地址会被传入到脚本,所以在脚本中最好兼容主机名和ip地址,如果机房架构比较复杂的话,脚本可以返回如:/dc1/rack1 类似的字符串。

执行命令:chmod +x RackAware.py

重启namenode,如果配置成功,namenode启动日志中会输出:

2011-12-21 14:28:44,495 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack1/192.168.1.15:50010  

网络拓扑机器之间的距离

这里基于一个网络拓扑案例,介绍在复杂的网络拓扑中hadoop集群每台机器之间的距离

  

有了机架感知,NameNode就可以画出上图所示的datanode网络拓扑图。D1,R1都是交换机,最底层是datanode。则H1的rackid=/D1/R1/H1,H1的parent是R1,R1的是D1。这些rackid信息可以通过topology.script.file.name配置。有了这些rackid信息就可以计算出任意两台datanode之间的距离。

distance(/D1/R1/H1,/D1/R1/H1)=0  相同的datanode
distance(/D1/R1/H1,/D1/R1/H2)=2  同一rack下的不同datanode
distance(/D1/R1/H1,/D1/R1/H4)=4  同一IDC下的不同datanode
distance(/D1/R1/H1,/D2/R3/H7)=6  不同IDC下的datanode

参考 https://issues.apache.org/jira/secure/attachment/12345251/Rack_aware_HDFS_proposal.pdf 

       http://blog.csdn.net/hjwang1/article/details/6592714

       http://blog.csdn.net/azhao_dn/article/details/7091258

       

 
 
分类: hadoop

hadoop

 
摘要: 翻译自https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types列类型Hive支持的数据类型如下:原生类型:TINYINTSMALLINTINTBIGINTBOOLEANFLOATDOUBLESTRINGBINARY(Note: Only available starting with Hive0.8.0)TIMESTAMP(Note: Only available starting with Hive0.8.0)复合类型:arrays:ARRAY<data_type>maps:MAP<primi阅读全文
posted @ 2013-01-03 22:42 ggjucheng 阅读(6) | 评论 (0) 编辑

摘要: 参考https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterTable%2FPartitionStatements这里主要列一些常用操作。添加分区ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1'; //示例ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (dt='20130101&阅读全文
posted @ 2013-01-03 21:45 ggjucheng 阅读(5) | 评论 (0) 编辑

摘要: hive文件存储格式包括以下几类:TEXTFILESEQUENCEFILERCFILE自定义格式其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。SequenceFile,RCFile格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中,然后再从textfile表中用insert导入到SequenceFile,RCFile表中。TEXTFIEL默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从阅读全文
posted @ 2013-01-03 20:29 ggjucheng 阅读(3) | 评论 (0) 编辑

摘要: Hadoop MapReduce程序中,reducer个数的设定极大影响执行效率,这使得Hive怎样决定reducer个数成为一个关键问题。遗憾的是Hive的估计机制很弱,不指定reducer个数的情况下,Hive会猜测确定一个reducer个数,基于以下两个设定:1. hive.exec.reducers.bytes.per.reducer(默认为1000^3)2. hive.exec.reducers.max(默认为999)计算reducer数的公式很简单:N=min(参数2,总输入数据量/参数1)通常情况下,有必要手动指定reducer个数。考虑到map阶段的输出数据量通常会比输入有大幅阅读全文
posted @ 2013-01-03 19:20 ggjucheng 阅读(5) | 评论 (0) 编辑

摘要: order byorder by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。set hive.mapred.mode=nonstrict; (default value / 默认值)set hive.mapred.mode=strict;order by 和数据库中的Order by 功能一致,按照某一项 & 几项 排序输出。与数据库中 order by 的区别在于在hive.mapred.mode = strict 模式下 必须指定 limit 否则执行会报错。hive>阅读全文
posted @ 2013-01-03 19:15 ggjucheng 阅读(3) | 评论 (0) 编辑

摘要: hive.exec.parallel参数控制在同一个sql中的不同的job是否可以同时运行,默认为false.下面是对于该参数的测试过程:测试sql:select r1.afrom ( select t.a from sunwg_10 t join sunwg_10000000 s on t.a=s.b) r1 join (select s.b from sunwg_100000 t join sunwg_10 s on t.a=s.b) r2 on (r1.a=r2.b);1当参数为false的时候,三个job是顺序的执行 set hive.exec.parallel=...阅读全文
posted @ 2013-01-03 18:59 ggjucheng 阅读(3) | 评论 (0) 编辑

摘要: 在hive0.7的版本中增加了local hadoop的功能,就是在处理数据量比较小的情况在本地执行,而不走分布的mapred。这样一来,那些比较小的任务的执行速度就会大大提高。那到底什么样的任务会采用local hadoop呢,是由hive的一个参数控制的。hive.exec.mode.local.auto.inputbytes.max当处理的数据量比这个参数值小的情况下就会采用local hadoop的方式来执行。如果想要屏蔽掉local hadoop的功能,只需要把这个参数设置为-1即可。<property> <name>hive.exec.mode.local.阅读全文
posted @ 2013-01-03 18:45 ggjucheng 阅读(3) | 评论 (0) 编辑

摘要: Is the cluster set up correctly? The best way to answer this question is empirically: run some jobs and confirm that you get the expected results. Benchmarks make good tests, as you also get numbers that you can compare with other clusters as a sanity check on whether your new cluster is performing 阅读全文
posted @ 2013-01-03 15:48 ggjucheng 阅读(11) | 评论 (0) 编辑

摘要: 背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群。机架内的机器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。 具体到Hadoop集群,由于hadoop的HDFS对数据文件的分布式存放是按照分块block存储,每个block会有多个副本(默认为3),并且为了数据的安全和高效,所以hadoop默认对3个副本的存放策略为:第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个nod..阅读全文
posted @ 2013-01-03 15:26 ggjucheng 阅读(487) | 评论 (0) 编辑

摘要: 通过dfs.umask可以控制在hdfs上创建的文件夹和文件的属性,该值的默认值为0022。在hadoop中通过dfs.umask参数可以控制默认的文件的权限。dfs.umask的设置<property> <name>dfs.umask</name> <value>0002</value></property>这个参数和linux中的umask不大一样。比如我想让文件的属性为-rw-r–r–,那么在linux中应该设置umask为022,而设置dfs.mask的值为0022的时候,结果并不是我希望的。后来发现在dfs.um阅读全文
posted @ 2013-01-03 14:52 ggjucheng 阅读(8) | 评论 (0) 编辑

摘要: 最近要对hdfs上空间使用和文件结点使用增加报警,当超过一定的限额的时候就要发报警好通知提前准备。[sunwg]$ hadoop fs -count /sunwg 2 1 108 hdfs://sunwg:9000/sunwg第一个数值2表示/sunwg下的文件夹的个数,第二个数值1表是当前文件夹下文件的个数,第三个数值108表示该文件夹下文件所占的空间大小,这个大小是不计算副本的个数的[sunwg]$ hadoop fs -count -q /sunwg 1024 1021 10240 10132 2 1 108 ...阅读全文
posted @ 2013-01-03 14:46 ggjucheng 阅读(5) | 评论 (0) 编辑

摘要: lateral view用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。一个简单的例子,假设我们有一张表pageAds,它有两列数据,第一列是pageid string,第二列是adid_list,即用逗号分隔的广告ID集合:string pageidArray<int> adid_list"front_page"[1, 2, 3]"contact_page"[3, 4, 5]要统计所有广告ID在所有页面中出现的次数。首先分拆广告ID:SELECT pageid, ad阅读全文
posted @ 2013-01-03 14:39 ggjucheng 阅读(4) | 评论 (0) 编辑

摘要: 在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显。主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平均值,而由于数据倾斜的原因造成map处理数据量的差异过大,使得这些平均值能代表的价值降低。Hive的执行是分阶段的,map处理数据量的差异取决于上一个stage的reduce输出,所以如何将数据均匀的分配到各个reduce中,就是解决数据倾斜的根本所在。规避错误来更好的运行比解决错误更高效。在查看了一些资料后,总结如下。1数据倾斜的原因1.1操作:关键词情形后果Join其中一个表较小,但是key集阅读全文
posted @ 2013-01-03 13:12 ggjucheng 阅读(5) | 评论 (0) 编辑

摘要: 目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过leftjoin实现。假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注册用户,字段只有一个uid),这两个表都包含一个字段,uid。in查询如果要查询当天登陆的注册用户,需要用in查询,hive sql如下:select login.uid from login left outer join regusers on login.uid=regusers.uid where regusers.uid is not null如果login表和regusers表按天分区,字阅读全文
posted @ 2013-01-03 13:05 ggjucheng 阅读(4) | 评论 (0) 编辑

摘要: 表或者字段有中文的时候需要修改hive的元数据库的设置。以mysql为例子,当mysql的字符集设置成utf8的时候使用hive会有问题,详细见hive的wiki。所以当hive使用mysql作为元数据库的时候mysql的字符集要设置成latin1。为了保存那些utf8的中文,要将mysql中存储注释的那几个字段的字符集单独修改为utf8。修改字段注释字符集alter table COLUMNS modify column COMMENT varchar(256) character set utf8;修改表注释字符集alter table TABL_PARAMS modify column 阅读全文
posted @ 2013-01-03 12:23 ggjucheng 阅读(3) | 评论 (0) 编辑

摘要: CommonJoin最为普通的join策略,不受数据量的大小影响,也可以叫做reduce side join ,最没效率的一种join方式. 它由一个mapreduce job 完成.首先将大表和小表分别进行map 操作, 在map shuffle 的阶段每一个mapoutput key 变成了table_name_tag_prefix + join_column_value , 但是在进行partition 的时候它仍然只使用join_column_value 进行hash.每一个reduce 接受所有的map 传过来的split , 在reducce 的shuffle 阶段,它将mapou阅读全文
posted @ 2013-01-03 12:20 ggjucheng 阅读(7) | 评论 (0) 编辑

摘要: 由于手上负责的hadoop集群需要对公司外部提供服务,所有会有多个部门访问我们的hadoop集群,这个就涉及到了hadoop的安全性。而hadoop的安全性是很弱的,只提供类似linux文件系统的帐户权限验证,而且可以通过简单的手段冒充用户名,如果有恶意用户,直接冒充为hadoop的super用户,那整个集群是很危险的。hadoop支持kerberos,希望可以通过kerberos,限制恶意用户伪造用户。预研过程中,发现kerberos生成证书和配置的步骤相当繁琐,首次配置也可以接受,但是对于用户权限的修改,机器的减容扩容,感觉会造成证书要重新生成,再分发证书,重启hadoop。而且还要考虑k阅读全文
posted @ 2012-12-10 13:24 ggjucheng 阅读(65) | 评论 (0) 编辑

摘要: 背景在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用哈希表(hash table)来存储的。它的好处是快速准确,缺点是费存储空间。当集合比较小时,这个问题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来了。比如说,一个象 Yahoo,Hotmail 和 阅读全文
posted @ 2012-10-09 22:25 ggjucheng 阅读(62) | 评论 (0) 编辑

摘要: 在分布式算法领域,有个非常重要的算法叫Paxos, 它的重要性有多高呢,Google的Chubby [1]中提到all working protocols for asynchronous consensus we have so far encountered have Paxos at their core.关于Paxos算法的详述在维基百科中有更多介绍,中文版介绍的是choose value的规则[2],英文版介绍的是Paxos 3 phase commit的流程[3],中文版不是从英文版翻译而是独立写的,所以非常具有互补性。Paxos算法是由Leslie Lamport提出的,他在Pa阅读全文
posted @ 2012-10-09 21:57 ggjucheng 阅读(55) | 评论 (0) 编辑

摘要: 大部分是小作业,大多数运行几分钟或十几分钟.绝大多数在半小时之内。占用的slot数一般为几十到几百。集群同时在运行的作业数比较多。繁忙的时候同时运行的作业有六百多个, 每天完成的作业数万个。有些作业被分析多个要求顺序执行的小作业。各作业的依赖性比较大, 后面一组作业的开始时间受限前一组作业的结束时间Map slots与Reduce slots使用率不高,特别是Reduce Slots。作业周期性比较明显,每个晚上1点到5点左右,集群处于相对忙的状态,白天很空闲。作业时效性要求较强。大部分作业要求在上午8点前执行结束,特别是涉及前端产品,如量子统计、数据魔方等业务的作业。如果上班前作业没有执行完阅读全文
posted @ 2012-10-09 21:43 ggjucheng 阅读(58) | 评论 (0) 编辑

摘要: 国内外使用Hadoop的公司比较多,全球最大的Hadoop集群在雅虎,有大约25,000个节点,主要用于支持广告系统与网页搜索。国内用Hadoop的主要有百度、淘宝、网易、华为、中国移动等,其中淘宝的Hadoop集群属于较大的(如果不是最大)。淘宝Hadoop集群现在超过1700个节点,服务于用于整个阿里巴巴集团各部门,数据来源于各部门产品的线上数据库(Oracle, MySQL)备份,系统日志以及爬虫数据,截止2011年9月,数量总量已经超过17个PB,每天净增长20T左右。每天在Hadoop集群运行的MapReduce任务有超过4万(有时会超过6万),其中大部分任务是每天定期执行的统计任务阅读全文
posted @ 2012-10-09 21:41 ggjucheng 阅读(191) | 评论 (0) 编辑

摘要: 你能想象一个企业的数据仓库究竟有多大吗?虽然下面的数据来自于两年前,但是还是挺震撼的。相信目前,这些巨型的数据仓库“怪物”的体积又增大了几倍。行业分析师Curt Monash曾经见过许多非常大型的数据仓库,并进行了总结,其中用到的数据管理软件工具更是多种多样,有传统的Teradata数据仓库,也有Greenplum这样的MPP数据库,还有许多开源的技术,比如Hadoop/Hive等。 1、ebay:公司有超过6.5 PB的数据库运行在Greenplum上,另外2.5 PB的企业数据仓库运行在Teradata上。 2、Facebook:脸书公司刚刚完成IPO,它们是著名的互联网数据巨鳄,也...阅读全文
posted @ 2012-10-09 21:36 ggjucheng 阅读(70) | 评论 (0) 编辑

摘要: 大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到。下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论。1.Bloom filter适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集基本原理及要点:对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数阅读全文
posted @ 2012-10-09 21:34 ggjucheng 阅读(166) | 评论 (0) 编辑

摘要: 前言hadoop比较适合做离线处理,这个是众所周知的,而且hdfs为了保证数据的一致性,每次写文件时,针对数据的io.bytes.per.checksum字节,都会创建一个单独的校验和。默认值为512字节,因为crc-32校验是4字节,存储开销小于1%。而客户端读取数据时,默认会验证数据的crc校验和。除此之外,每个数据节点还会在后台线程运行一个数据块检测程序,定期检查存储在数据节点上的所有块。当块和对应的crc校验匹配不上,由于hdfs存储着块的副本,它可以复制正确的副本替换出错的副本。crc校验的性能损耗可以想到,hdfs都是存储大文件的,每512字节就做一个crc校验,客户端在读写文件都阅读全文
posted @ 2012-08-17 22:23 ggjucheng 阅读(351) | 评论 (0) 编辑

摘要: 需求公司里有两个部门,一个叫hive,一个叫pig,这两个部门都需要使用公司里的hadoop集群。于是问题来了,因为hadoop默认是FIFO调度的,谁先提交任务,谁先被处理,于是hive部门很担心pig这个部门提交一个耗时的任务,影响了hive的业务,hive希望可以和pig在高峰期时,平均使用整个集群的计算容量,互不影响。思路hadoop的默认调度器是FIFO,但是也有计算容量调度器,这个调度器可以解决上述问题。可以在hadoop里配置三个队列,一个是default,一个是hive,一个是pig。他们的计算容量分别是30%,40%,30%.这样hive和pig这两个部门,分为使用hive和阅读全文
posted @ 2012-07-25 18:41 ggjucheng 阅读(308) | 评论 (1) 编辑

摘要: 1. 编写目的本文描述了hadoop中的计算能力调度器(Capacity Scheduler)的实现算法,计算能力调度器是由Yahoo贡献的,主要是解决HADOOP-3421中提出的,在调度器上完成HOD(Hadoop On Demand)功能,克服已有HOD的性能低效的缺点。它适合于多用户共享集群的环境的调度器。本文解析的计算能力调度器属于Hadoop 0.20.2。本文组织结构如 下:1)编写目的 2)计算能力调度器介绍 3)计算能力调度器算法分析 4)计算能力调度器源代码分析 5)计算能力调度器与公平调度器比较 6)参考资料。2. 计算能力调度器介绍Capacity Scheduler支阅读全文
posted @ 2012-07-25 18:11 ggjucheng 阅读(218) | 评论 (0) 编辑

摘要: 随着MapReduce的流行,其开源实现Hadoop也变得越来越受推崇。在Hadoop系统中,有一个组件非常重要,那就是调度器,它的作用是将系统中空闲的资源按一定策略分配给作业。在Hadoop中,调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计调度器。Hadoop中常见的调度器有三种,分别为:(1)默认的调度器FIFOHadoop中默认的调度器,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业。(2) 计算能力调度器Capacity Scheduler支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,为了防止同一个用户的作业独占队列中的资源,该调阅读全文
posted @ 2012-07-25 18:08 ggjucheng 阅读(199) | 评论 (0) 编辑

摘要: 淘宝总容量9.3PB, 利用率77.09%• 总共1100台机器• Master:8CPU(HT),48G内存,SAS Raid• Slave节点异构– 8CPU/8CPU(HT)– 16G/24G内存– 1T x 12 / 2T x 6 / 1T x 6 SATA JBOD– 12/20 slots• 约18000道作业/天, 扫描数据:约500TB/天• 用户数474人, 用户组38个基于0.19.1• 大量Patch– 主要来自官方社区0.19.2, 0.20, 0.21等, 少部分自己开发• Hadoop客户端和服务端代码开发分离, 云梯管理员只负责服务端升级, 并保持版本向下兼容以上阅读全文
posted @ 2012-07-25 18:00 ggjucheng 阅读(292) | 评论 (0) 编辑

摘要: 需求场景:统计每日用户登陆总数每分钟的原始日志内容如下:http://www.blue.com/uid=xxxxxx&ip=xxxxxx假设只有两个字段,uid和ip,其中uid是用户的uid,是用户的唯一标识,ip是用户的登陆ip,每日的记录行数是10亿,要统计出一天用户登陆的总数。处理流程建表那么我们首先要在hive里建表,建表语句如下:CREATE TABLE login ( uid STRING, ip STRING)PARTITIONED BY (dt STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY ','STO阅读全文
posted @ 2012-07-25 17:49 ggjucheng 阅读(1191) | 评论 (1) 编辑

摘要: namenode磁盘: sas带RAID,多磁盘存储文件系统元信息.datanode配置: 不带RAID, 双网卡: 一个用于内部数据传输,一个用于外部数据传输.hadoop各节点的分布:namenode和jobtracker部署:namenode与jobtracker分离.tasktracker与datanode配对.Trash: hadoop回收站功能默认是禁止的,删除文件,就是直接删除了,所以要记得配置好trash。trash功能还是不错的,当rm后,它会move到当前文件夹下的.Trash目录下,误删文件后,可以到对应的.Trash目录下恢复文件,参考配置属性fs.trash.inte阅读全文
posted @ 2012-07-25 17:37 ggjucheng 阅读(284) | 评论 (0) 编辑

摘要: Hadoop作为大数据存储及计算领域的一颗明星,目前已经得到越来越广泛的应用。下面PPT主要分析了Hadoop的一些典型应用场景,并对其进行了深入分析,主要包括下面几个方面:日志处理: Hadoop擅长这个抓住本拉登: 并行计算ETL: 每个人几乎都在做ETL(Extract-Transform-Load)工作 Netezza关于使用Hadoop做ETL任务的看法)使用HBase做数据分析: 用扩展性应对大量的写操作—Facebook构建了基于HBase的实时数据分析系统机器学习: 比如Apache Mahout项目更多参考ppt http://t.cn/SZT2fu阅读全文
posted @ 2012-07-25 17:16 ggjucheng 阅读(384) | 评论 (0) 编辑

摘要: 前言使用hive,我们很多情况下会并发调用hive程序,将sql任务转换成mapreuce提交到hadoop集群中,而在本人使用hive的过程中,发现并发调用hive有几个问题,在这个和大家分享下.正文默认安装hive,hive是使用derby内存数据库保存hive的元数据,这样是不可以并发调用hive的,需要配置为使用mysql保存hive的元数据。运行hive,可以有以下访问方式:1.hiveserver:hive以thrift服务的服务器形式运行,允许不同的语言编写客户端进行访问,通过thrift,jdbc,odbc连接器和hive服务器与hive通信,这种方式很适合java编程人员通过阅读全文
posted @ 2012-07-25 16:56 ggjucheng 阅读(839) | 评论 (0) 编辑

摘要: 捣鼓hadoop有一段时间了,由于工作的内容就是hadoop平台,但是由于开始对hadoop一无所知,必须在网上寻找各种信息学习hadoop,学习的过程中,发现hadoop管理运维的文章,网上还是挺丰富的,但是对于hadoop实现细节这块,很多是源码分析,这对于初学者来讲很是痛苦,包括本人,要了解hadoop实现细节,也必须看源码,实际上,我最开始不是为了读源码,我只是感兴趣hadoop的实现细节,详细运作流程,代码因为是我对某个细节感兴趣,再去仔细阅读了。例如我负责hadoop平台,里面就有重要数据,HDFS与传统的存储不同,一旦namenode丢失数据,会造成不会恢复的灾难,保护这个数据,阅读全文
posted @ 2012-06-09 21:47 ggjucheng 阅读(221) | 评论 (0) 编辑

摘要: 环境: 操作系统:ubuntu 12.10 64bit jdk:sun jdk 1.6 64bit hadoop:apache hadoop 1.02 hbase:apache hbase 0.92 先决条件:配置apache hadoop append,默认这个属性是false,需要设置为true1)下载hbase 解压到每台服务器的/data/soft 解压root@master:/data/soft# tar zxvf hbase-0.92.0.tar.gz建立软连root@master:/data/soft# ln -s hbase-0.92.0 hbase2)配置...阅读全文
posted @ 2012-05-04 22:19 ggjucheng 阅读(925) | 评论 (0) 编辑

摘要: failed task可理解为自杀,也就是task本身出了问题而自杀;killed task可理解为是他杀,也就是jobtracker认为这个任务的执行是多余的,所以把任务直接杀掉。起初用hadoop的时候经常在一个complete的job中看到几个failed 或者是 killed task,还经常好奇为什么有的时候task的失败不会影响到整个job的失败,而有的时候就会使整个job的失败,到底failed和killed task对整个job的影响是什么?failed task failed task出现的原因可分为以下几种情况: 1 child task失败,比如map/reduce任务中阅读全文
posted @ 2012-04-26 23:59 ggjucheng 阅读(269) | 评论 (0) 编辑

摘要: 安装环境: 机器 只有一台机器 操作系统:Ubuntu 11.04 64操作系统 hadoop:版本是1.0.2,安装在/usr/local/hadoop sun jdk:版本是1.6.0_31 64bit,安装在/usr/local/jdk pig:版本是0.9.2,安装在/usr/local/pig安装步骤:1.下载(1)下载pig:http://www.fightrice.com/mirrors/apache/pig/stable/pig-0.9.2.tar.gz2.安装(1)上传pig安装包到机器上,使用root用户登陆: tar -xvf pig-0.9.2.tar...阅读全文
posted @ 2012-04-26 14:15 ggjucheng 阅读(129) | 评论 (0) 编辑

摘要: 安装环境: 机器 只需要安装一台机器 操作系统:Ubuntu 11.04 64操作系统 hadoop:版本是1.0.2,安装在/usr/local/hadoop sun jdk:版本是1.6.0_31 64bit,安装在/usr/local/jdk hive:版本是0.8.1,安装在/usr/local/hive安装步骤:1.下载 下载hive:http://labs.mop.com/apache-mirror/hive/hive-0.8.1/hive-0.8.1.tar.gz2.安装(1)上传hive安装包到机器上,使用root用户登陆: tar -xvf hive-0.8...阅读全文
posted @ 2012-04-26 14:10 ggjucheng 阅读(2431) | 评论 (2) 编辑

摘要: 在用hadoop的streaming读数据时,如果输入是sequence file,如果用“-inputformatorg.apache.hadoop.mapred.SequenceFileInputFormat”配置读的话,读入的数据显示的话为乱码,其实是因为读入的还是sequence file格式的,包括sequencefile的头信息在内.改为“inputformatorg.apache.hadoop.mapred.SequenceFileAsTextInputFormat”即可正常读取。以下内容摘自其他地方,对inputformat和outputformat的一个粗略的介绍:Hadoo阅读全文
posted @ 2012-04-23 00:47 ggjucheng 阅读(197) | 评论 (0) 编辑

摘要: 一、从Map到ReduceMapReduce其实是分治算法的一种实现,其处理过程亦和用管道命令来处理十分相似,一些简单的文本字符的处理甚至也可以使用Unix的管道命令来替代,从处理流程的角度来看大概如下:cat input | grep | sort | uniq -c | cat > output# Input -> Map -> Shuffle & Sort -> Reduce -> Output简单的流程图如下:对于Shuffle,简单地说就是将Map的输出通过一定的算法划分到合适的Reducer中进行处理。Sort当然就是对中间的结果进行按key排阅读全文
posted @ 2012-04-23 00:26 ggjucheng 阅读(242) | 评论 (0) 编辑

摘要: Datanode在把数据实际存储之前会验证数据的校验和.client通过pipeline把数据写入datanode. 最后一个datanode会负责检查校验和.当client从datanode读取数据时,也会检查校验和: 把真实数据的校和合同datanode上的校验和进行比较.每个datanode都保存有一个checksum验证的持久化日志,日志中有当前datanode每个block最后的更新时间.当client成功验证了一个block, 它会告诉datanode, 之后datanode会更新它的日志.保存这些信息有助于检测坏磁盘.除了会在client读取数据时验证block, 每个datan阅读全文
posted @ 2012-04-23 00:21 ggjucheng 阅读(113) | 评论 (0) 编辑

摘要: HDFS简介HDFS全称是Hadoop Distributed System。HDFS是为以流的方式存取大文件而设计的。适用于几百MB,GB以及TB,并写一次读多次的场合。而对于低延时数据访问、大量小文件、同时写和任意的文件修改,则并不是十分适合。目前HDFS支持的使用接口除了Java的还有,Thrift、C、FUSE、WebDAV、HTTP等。HDFS是以block-sized chunk组织其文件内容的,默认的block大小为64MB,对于不足64MB的文件,其会占用一个block,但实际上不用占用实际硬盘上的64MB,这可以说是HDFS是在文件系统之上架设的一个中间层。之所以将默认的bl阅读全文
posted @ 2012-04-23 00:06 ggjucheng 阅读(315) | 评论 (0) 编辑

摘要: mapreduce的一个完整作业流程是怎么样的呢,相信刚接触hadoop,刚写mapreduce的初学者都有很大的困扰,下面的图来自http://horicky.blogspot.com/2008/11/hadoop-mapreduce-implementation.html,是我看到的讲MapReduce最好的图。以Hadoop带的wordcount为例子(下面是启动行):hadoop jar hadoop-0.19.0-examples.jar wordcount /usr/input /usr/output用户提交一个任务以后,该任务由JobTracker协调,先执行Map阶段(图中M1阅读全文
posted @ 2012-04-22 23:58 ggjucheng 阅读(516) | 评论 (0) 编辑

摘要: 1.运行dfsadmin -upgradeProgress status 检查是否存在备份 如果是第一次升级 就不存在备份(在升级Hadoop前,如果已经存在备份,需要先结束 finalize 它。)2.备份dfs.namenode.dir下文件,同时要备份下hdfs的文件目录的元数据信息:bin/hadoop fsck / -files -blocks -locations > dfs-v-old-fsck-1.log bin/hadoop dfs -lsr / > dfs-v-old-lsr-1.log bin/hadoop dfsadmin -report > dfs-阅读全文
posted @ 2012-04-22 23:06 ggjucheng 阅读(380) | 评论 (0) 编辑

摘要: hadoop对于压缩文件的支持hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心。如果我们压缩的文件有相应压缩格式的扩展名(比如lzo,gz,bzip2等),hadoop就会根据扩展名去选择解码器解压。hadoop对每个压缩格式的支持,详细见下表:压缩格式工具算法文件扩展名多文件可分割性DEFLATE无DEFLATE.deflate不不gzipgzipDEFLATE.gz不不ZIPzipDEFLATE.zip是是,在文件范围内bzip2bzip2bzip2.bz2不是LZOlzopLZO.lzo不是如阅读全文
posted @ 2012-04-22 22:28 ggjucheng 阅读(2016) | 评论 (0) 编辑

摘要: 首先 dfs.replication这个参数是个client参数,即node level参数。需要在每台datanode上设置。其实默认为3个副本已经够用了,设置太多也没什么用。一个文件,上传到hdfs上时指定的是几个副本就是几个。以后你修改了副本数,对已经上传了的文件也不会起作用。可以再上传文件的同时指定创建的副本数hadoop dfs -D dfs.replication=1 -put 70M logs/2可以通过命令来更改已经上传的文件的副本数:hadoop fs -setrep -R 3 /查看当前hdfs的副本数hadoop fsck -locationsFSCK started b阅读全文
posted @ 2012-04-18 01:57 ggjucheng 阅读(596) | 评论 (0) 编辑

摘要: 1.修改conf/core-site.xml增加<property> <name>fs.checkpoint.period</name> <value>3600</value> <description>The number of seconds between two periodic checkpoints. </description> </property> <property> <name>fs.checkpoint.size</name> <va阅读全文
posted @ 2012-04-18 01:43 ggjucheng 阅读(615) | 评论 (0) 编辑

摘要: 1.概述光从字面上来理解,很容易让一些初学者先入为主的认为:SecondaryNameNode(snn)就是NameNode(nn)的热备进程。其实不是。snn是HDFS架构中的一个组成部分,但是经常由于名字而被人误解它真正的用途,其实它真正的用途,是用来保存namenode中对HDFS metadata的信息的备份,并减少namenode重启的时间。对于hadoop进程中 ,要配置好并正确的使用 snn,还是需要做一些工作的。hadoop的默认配置中让snn进程默认运行在了namenode的那台机器上,但是这样的话,如果这台机器出错,宕机,对恢复HDFS文件系统是很大的灾难,更好的方式是:将阅读全文
posted @ 2012-04-18 01:39 ggjucheng 阅读(372) | 评论 (0) 编辑

摘要: NameNode在启动的时候首先进入安全模式,如果 datanode 丢失的block达到一定的比例(1-dfs.safemode.threshold.pct),则系统会一直处于安全模式状态即只读状态。dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了元 数据 记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于SafeMode。下面这行摘录自NameNode启动时的日志(block上报比例1达到了阀值0.9990)The ratio of re阅读全文
posted @ 2012-04-18 01:28 ggjucheng 阅读(125) | 评论 (0) 编辑

摘要: 1.集群配置 修改conf/hdfs-site.xml文件 <property> <name>dfs.hosts.exclude</name> <value>/data/soft/hadoop/conf/excludes</value> <description>Names a file that contains a list of hosts that are not permitted to connect to the namenode. The full pathname of the file must be 阅读全文
posted @ 2012-04-18 01:14 ggjucheng 阅读(123) | 评论 (0) 编辑

摘要: 1.部署hadoop和普通的datanode一样。安装jdk,ssh2.修改host和普通的datanode一样。添加namenode的ip3.修改namenode的配置文件conf/slaves添加新增节点的ip或host4.在新节点的机器上,启动服务[root@slave-004 hadoop]# ./bin/hadoop-daemon.sh start datanode [root@slave-004 hadoop]# ./bin/hadoop-daemon.sh start tasktracker5.均衡block[root@slave-004 hadoop]# ./bin/start阅读全文
posted @ 2012-04-18 01:11 ggjucheng 阅读(230) | 评论 (0) 编辑

摘要: Hadoop回收站trash,默认是关闭的。 习惯了window的同学,建议最好还是把它提前开开,否则误操作的时候,就欲哭无泪了1.修改conf/core-site.xml,增加<property> <name>fs.trash.interval</name> <value>1440</value> <description>Number of minutes between trash checkpoints. If zero, the trash feature is disabled. </descriptio阅读全文
posted @ 2012-04-18 00:59 ggjucheng 阅读(300) | 评论 (0) 编辑

摘要: 概述所有的hadoop命令均由bin/hadoop脚本引发。不指定参数运行hadoop脚本会打印所有命令的描述。用法:hadoop [--config confdir] [COMMAND] [GENERIC_OPTIONS] [COMMAND_OPTIONS] Hadoop有一个选项解析框架用于解析一般的选项和运行类。命令选项--config confdir 覆盖缺省配置目录。缺省是${HADOOP_HOME}/conf。GENERIC_OPTIONS 多个命令都支持的通用选项。COMMAND命令选项 各种各样的命令和它们的选项会在下面提到。这些命令被分为 用户命令 管理命令两组。常规选项下面阅读全文
posted @ 2012-04-18 00:50 ggjucheng 阅读(630) | 评论 (0) 编辑

摘要: FS Shell调用文件系统(FS)Shell命令应使用 bin/hadoop fs <args>的形式。 所有的的FS shell命令使用URI路径作为参数。URI格式是scheme://authority/path。对HDFS文件系统,scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。一个HDFS文件或目录比如/parent/child可以表示成hdfs://namenode:namenodeport/parent/child,或者更简单的/parent/chi阅读全文
posted @ 2012-04-18 00:30 ggjucheng 阅读(248) | 评论 (0) 编辑

摘要: 获取默认配置配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知道这些配置文件有哪些配置可以生效,上网找的配置可能因为各个hadoop版本不同,导致无法生效。浏览更多的配置,有两个方法:1.选择相应版本的hadoop,下载解压后,搜索*.xml,找到core-default.xml,hdfs-default.xml,mapred-default.xml,这些就是默认配置,可以参考这些配置的说明和key,配置hadoop集群。2.浏览apache官网,三个配置文件链接如下: ht阅读全文
posted @ 2012-04-17 23:12 ggjucheng 阅读(4101) | 评论 (0) 编辑

摘要: 1、dfs.hosts 记录即将作为datanode加入集群的机器列表2、mapred.hosts 记录即将作为tasktracker加入集群的机器列表3、dfs.hosts.exclude mapred.hosts.exclude 分别包含待移除的机器列表4、master 记录运行辅助namenode的机器列表5、slave 记录运行datanode和tasktracker的机器列表6、hadoop-env.sh 记录脚本要用的环境变量,以运行hadoop7、core-site.xml hadoop core的配置项,例如hdfs和mapreduce常用的i/o设置等8、hdfs-site.阅读全文
posted @ 2012-04-17 22:39 ggjucheng 阅读(599) | 评论 (0) 编辑

摘要: 1) 安装jdk下载jdk-6u21-linux-i586.bin然后修改/etc/profile:export JAVA_HOME=/usr/local/jdk export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$PATH:$JAVA_HOME/bin 保存,并执行source /etc/profile2) 配置hostNamenode的机器,需要配置集群中所有机器的ip修改/etc/hosts10.10.236.190 master 10.10.236.191 slave-A 10...阅读全文
posted @ 2012-04-17 22:32 ggjucheng 阅读(1213) | 评论 (0) 编辑
原文地址:https://www.cnblogs.com/Leo_wl/p/2843759.html