Hadoop
Hadoop为何物
Hadoop是一个分布式系统基础架构,由Apache基金会所开发。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。
Hadoop实现了一个分布式文件系统(HadoopDistributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以流的形式访问(streaming access)文件系统中的数据。
Hadoop基本概念
·核心组件:
MapReduce
HDFS分布式文件存储系统
·GFS:google file system
将大文件分割成列存储在不同的服务器上
架构与其他分布式文件系统没有太大的区别
·数据类型:
结构化数据 RDBMS
半结构化数据 XML,JSON(轻量级XML)
非结构化数据
比如:我们使用爬虫对某个站点爬站,最后爬来的数据都是非结构化的数据
再比如:
将一个文件内计算文件中每个单词出现的数量并按照逆序排序--可以将将这个文件按大小分到不同的节点上,每个节点以不额定的文件大小对其进行处理
使用GFS时限分部署存储再通过mapReduce在分布式存储上完成分布式计算
NDFS:
引入了mapReduce思想,于是就有了HDFS,那么什么又是MapRdeuce思想呢?如下
mapReduce 思想:
·编程框架 API 基于这种API写的程序能够基于这种模型
·mapredeuce运行环境 -- Runtime Environment
·mapredeuce implamentation 技术实现
MapRdeuce基本工作流程:
首先,将单词MapReduce拆分为 Map,Rdeuce,顾名思义,此为2个组件。
以google爬虫为例,在处理的数据只能是键值(key/value)数据,很显然,google的网络爬虫所爬到的页面,对页面进行hash计算,对页面本身当中key ,对页面的内容当做value
如果处理的文件为日志,首先日志不是键值,但是mapReduce只能处理键值数据,所以这是其map redeuce的两段的意义了:
map:将原始数据转换成键值对,将转换后的数据存储下来(过程是按节点来处理的)
redeuce:将处理完成后半段,更进一步处理,完成我们所期望的结果
MapRedeuce为两段式任务:
(1)所有节点map必须都完成处理才可以进入下一段任务
(2)Map处理阶段至某个进度的时候(这个进度合适度需要自行进行定义),则开启Redeuce进程,从而Map处理结束后,则进入Redeuce处理。
ETL:
抽取转换加载进hadoop的工具
常用ETL工具
Hive:实现让hadoop拥有sql接口,再也不用写任务,但是Hive不是实时的的因为mapReduce不是实时的
HDFS:工作在用户空间,所有的结合是基于API接口,而且只支持写入删除等简单操作,源数据在源数据服务器上存放,数据则在数据服务器上存储,由此如果想在其存放数据并修改的话理论上来说是不可能的
BigTable:工作在GFS上,将存储内容最终转换为HDFS文件,但是在bigtable上支持随机读写,而且是随机高性能读写--列式存储NoSQL,同一个数据可以存放为N个版本
而且可以小量数据读写,但是本身功能依赖于GFS
impala:为hadoop提供实时的接口,使得任务可以实时进行,实时出结果
pig:yahoo
这样的工具很显然不能满足我们目前的需求,于是,HBase诞生了:
HBase:工作在HDFS之上,利用HDFS的功能实现了NoSQL列式存储的方式,而其就是Bigtable的克隆版,因此可以在HBase基础上也可以随意修改数据了;
HBase本身有分布式功能,因此跑在HDFS 天然具有分布优势,而HBase自己能够实现自动分区的功能 与mogodb相似,由于是列式存储,所以性能非常好。
因此做日志分析或日志挖掘,基于HBase就可以完全实现
MapReduce工作在HBase上如果不基于MapReduce 而是跑在HDFS是没有问题的,但是只能查看结果而不能处理结果
Hadoop组成部分:
hadoop由JAVA语言所研发,其不适合存储海量零碎小文件,其关键组件有:
·NameNode:名称节点,主要功能在于实现保存文件元数据,这些元数据直接保存在内存中,为了保证元数据的持久性,而也会周期性的同步到磁盘上去。磁盘上的数据通常被称为元数据的映像数据 p_w_picpath file
以防万一,如果服务或机器崩溃了,它会基于Image File以及各个DateNode的报告信息重新生成元数据。
·Secondary NameNode:第二名称节点,NameNode在早期只有一个,后来提供了第二个名称节点Secondry NameNode ,万一主节点崩溃,secondary无非是将p_w_picpath file整合到本地实现快速启动节点而已,同时也能够对Namenode节点映像文件合并的功能,平时不提供任何节点的服务。
·HDFS DataNode:所有大数据都保存在数据节点上,我们称为DataNode
HDFS不支持FUSE挂载到本地,所以支持基于HDFS的AIP(HadoopAPI)
来进行访问,因此必须自己去研发专用的命令行工具。服务是如何在HDFS中写数据
(1)当我们创建一个数据时候,需要先向NameNode发起请求;
(2)NameNode收到请求之后,会告知HDFSDataNode,说明需要分别存储至什么位置,当报告返回回来之后,HDFS Client将对其发起写操作请求;
(3)NameNode会为HDFS Client会分配一个DataNode数据节点;
(4)数据节点可能是多个,但HDFS Client却无知这一点,只需要向其一节点发起写操作即可;
(5)第一个数据节点datanode 接到请求之后,自行将数据复制到其它节点
(#一个数据块 报文为64k 于是其按报文逐一开始存放)
(为了保证数据可用性以及降低集群的成本,hadoop是工作在商用计算机硬件(说白了就是服务器或专业级存储),而且服务器不需要做RAID,它会在磁盘上自行存储多个副本,而且是在不同主机上)
(6)每个数据块存储结束之后,数据节点DataNode都要向Namenode报告存储完毕,接着存放下一个数据块然后报告。。。以此类推;
(7)一旦所有数据都存储完成,NameNode会保存一个列表,记录着数据的副本保存在哪个数据节点上。
如何在HDFS中读取数据
比如文件file1 分别存储在 D1 D2 D3 上,所以一旦有请求读取数据时,那么3个节点都有数据,那么该找谁去读取呢?如上图所示:
当客户端要请求访问某个数据块的时候,一个数据块可能在多个节点都有,那么所以这时候名称节点NameNode会告知它第一个块或文件 分别存储在D1 D2 D3 这么3个节点上,那么我们的客户端将会去第一个节点datanode1上去取数据,datanode1接到请求,将数据返回给客户端,假如中途出现中断的情况,那么客户端则去找datanode2,datanode2接到请求后如果有数据那么则将数据返回给用户
其实用户请求的为列表,告知的节点上都存在同样的数据;
如果用户请求存放某大文件,那么会被分割为报文,以报文形式存储到datanode 再由datanode相互复制 从而达到并行存储;
同样,也可以并行去读取文件,如果某台数据节点出现问题,那么肯定会导致数据不统一,所以每个datanode每隔3秒钟会向namenode报告自己的心跳信息、所持有的数据块的列表,如果超过阀值则将移除可用列表
在向namenode报告时候为了避免报告出错,还要检验一次数据块是否有问题,如果没有问题则报告,如果namenode没有接到其报告信息,则认为这个数据块缺少副本,并找将报告的完整副本完全复制到其故障节点上
Hadoop名称节的可用性
最简单的方式将名称节点上的持久元数据信息存储多个副本于不同的存储设备(独立硬盘,NFS等网络存储文件系统)中
·第二名节点
Secondary NameNode
·负载均衡
HDFS要做初始化硬盘
·支持回收站功能
·有专用自己的客户端工具
Map Reduce
·函数式编程框架 类似于能够接受参数、传递参数、处理机制等并将Map Reduce映射到集群上
大致为:
某一个数据存放在集群内多个节点上,有一数据在其中A、C、F三个节点上。
通过namenode可以得到其数据有多大,以及在哪些节点上,于是派发任务至存放期数据的节点上,做”Map”处理:
Map将这些文件,切割成一个一个的键值对,每个键值对应一个数值,而后输出由Reduce处理
JobTracker -- 作业追踪器
继续上面,由MapReduce集群的JobTracker决定来启动多少个Map作业,由此,在A C F节点上分别启动,但是对于mapReduce节点来讲是公共的,如下图所示:
(DataNode也被称为TaskTracker ;
NameNode也被称为JobTracker)
tasktracker接收到jobtracker任务之后,就在本地节点(datanode)启动一个map作业(进程),说白就是启动一个java虚拟机。所以如果运行3个作业 分别在A C F 节点上也就意味着各自提供一个任务进程,这3个任务进程实现去读取文件并完成进一步处理;
在实现map之前还要执行split操作:
将整个文件完全提取成键值对,这些键值对会均衡发往maper任务进程,每个maper拿到作业进程之后会对键值对在本地进行处理,运行之后会将split分割好的并分派给mapper的任务做输出,所以输出定是键值对,但未必和原有的一样;
于是这些键值要发往多个Reducer ,Reducer 也是由jobtracker发起的,一旦maper快要结束,那么必须要启动Reducer来接受3个map进程本身处理结果的,主要是保证同一个键值发往指定的Reducer。
总而言之,只要键值相同,那么肯定是发往同一个Redeucer
单redeuce任务的MapReduce数据流
将大文件切割成N份,并平均分配多个soplit任务 每个map处理完之后要在本地排序处理,主要目的是将每个键值对 发给同一个Reduce 而我们只有一个Reduce,Reduce在处理之前由merge将同键值对合并处理并交给Reduce;Reduce将结果输出并保存在HDFS上保存为副本文件
多redeuce任务的MapReduce数据流
一个作业可以没有redeuce 但绝对不能没有map
客户端如何提交作业的
job将作业发送给master (jobtracter)其控制着3个作业(Map);
每个Map去分割完数据之后并在本地完成处理,并且将处理结果按机制向对应的Reduce发送数据;
最终master要在Map处理完成之前启动多个Reduce 并接收来自maper的数据,并完成本地数据库处理而后输出结果;
MapRedeuce逻辑架构
一个hadoop集群,其中节点可能是成千上万的,同时运行的作业未必有一个 ,提交的mapperredeuce可能会同时运行 但是有个基本前提就是一般task tracker节点上最多有2个map和2个reduce服务,由此top tracker必须自行定义这些作业到底怎么跑跑在哪个节点上。
Historical Jbos表示已经跑完的作业。
Active为正在跑的作业。如上图可以看到task tracker 分别跑的reduce数量不一,是由job tracker根据数据摆放的机制调度来决定的
Partitioner 和 Combiner
Partitioner
Partitioner 主要作用是将mapper的结果排序完成并将结果输出结果给定义的reduce
所以每个mapperd背后对应一个partitioner程序,这个程序用户实现将本地的键输出的结果排序并根据整体key的数据发送给reducer
Combiner
Combiner :在必要时,如果需要最后由redeuce进行合并那么Combiner先在本地进行合并,Combiner不能在本地修改键
Hive和Pig
能够将提交的任务提交给jobtracker,由其转义之后才可以运行
·Hive
在目前来讲被理解为数据仓库架构
能够帮助用户将数据存储至HDFS
需要存放数据则与HIVE交互 如果需处理数据则需与mapreduce交互
功能:ETL:能够实现数据的抽取和加载,实现了数据存储管理,能够对大型数据集的查询和分析,能够跟框架进行交互,但也有自己的工作框架:
·Pig
与Hive一样,而pig本身是一个编程平台,内置转换编译器,也可以运行单节点或分布式环境。能够利用hadoop大规模数据分析的脚本语言和运行框架
HDFS
HBase功能
·实时访问
·随机访问
其本身是一个开源的分布式、支持多版本的面向列式的存储系统,实际上HBase存储的依然是键值对。
为了能够使HBase存储海量数据,建议将HBase跑在HDFS上,这样效果会更好,但无论如何,如果HBase想要实现自动分区等高级操作,节点可能会不止一个。
要结合Zookeeper才可以实现工作,所以,要想实现分布式存储必须先实现zookeeper
HBase将经常放在一起访问的数据排版为单独一个字段,这样的机制被称为列族
列族:
列族内的数据是放在一起的,所以往表内插入数据,可以只往期字段上插入数据其他字段可以同时没有数据
HBase特性:
·线性模块可扩展性
·一致性读写
·可配置表的自动切分策略
·RegionServer 自动故障恢复
·基于MapRdeuce备份
·提供便利的API
·为实时查询提供块缓存
Zookeeper
·专门设计为分布式应用所设计的开源、协调的服务,可以为用户提供同步、配置管理、分组和名称空间管理功能
·支持java和C 两种接口
·zookpeer最少需要3个节点,可以多,但不能少,尽可能是奇数节点;
·zookpeer也是文件系统,但是文件系统是虚拟出来的,在内存中模拟出来的,被称为名称空间
名称空间:内部的节点叫 znode
其名称空间分为2类:
·永久节点
·临时节点
Impala:实时分析和处理
部署hadoop
1.搭建伪分布式环境
1.1规划如下
IP地址 | 服务角色 | 操作系统 |
172.23.214.50 | ALL | Debian 7.2 |
1.2准备工作
配置本地hosts,将本地ip地址解析至localhost,至于为什么,往下就会明白
root@localhost:~# cat /etc/hosts
127.0.0.1 localhost
root@localhost:~# hostname
localhost
创建普通用户并授权ssh key免密码登录
root@localhost:~# useradd hduser
root@localhost:~# passwd hduser
授权本地ssh key
hduser@localhost:~$ ssh-keygen -t rsa -P ''
hduser@localhost:~$ cd
hduser@localhost:~$ ssh-copy-id -i .ssh/id_rsa.pubhduser@localhost
测试本地ssh key是否生效
这里直接ssh到目标主机,并执行date命令 查看是否生效
hduser@localhost:~$ ssh hduser@localhost ; date
Wed Mar 5 21:47:40 CST2014
安装JDK 1.7
这里直接将其他主机的jdk打包并解压缩到本地
hduser@localhost:~$ mkdir -p /home/hduser/jdk
hduser@localhost:~$ tar xf jdk.tar.gz
配置JDK环境变量
root@localhost:~# cat /etc/profile.d/java.sh
JAVA_HOME=/home/hduser/jdk
HADOOP_HOME=/usr/local/hadoop
STORM_HOME=/home/storm
export JAVA_HOME HADOOP_HOME STORM_HOME
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$STORM_HOME/bin/
激活配置文件
root@localhost:~# source /etc/profile
查看变量是否生效
root@localhost:~# echo $JAVA_HOME
/home/hduser/jdk
root@localhost:~# java -version
java version "1.7.0_03"
OpenJDK Runtime Environment (IcedTea7 2.1.7) (7u3-2.1.7-1)
OpenJDK 64-Bit Server VM (build 22.0-b10, mixed mode)
解压hadoop安装包
这里用的包装包为hadoop-2.2.0 64位,并解压缩至/usr/local/目录下
root@localhost:/usr/local# ln -s /usr/local/hadoop-2.2.0//usr/local/hadoop
设置Hadoop环境变量
root@localhost:cat /etc/profile.d/hadoop.sh
HADOOP_HOME=/usr/local/hadoop
PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_HOME PATH
查看是否生效
root@localhost: hadoop version
Hadoop 2.2.0
Subversion Unknown -r 1556437
Compiled by hadoop on 2014-01-08T04:16Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4
This command was run using/usr/local/hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar
对目录进行授权
root@localhost:/usr/local# chown hduser.hduser -R/usr/local/hadoop/
配置伪分布式:
配置的比较关键的配置文件为以下几个:
hdfs-site.xml
mapred-site.xml
core-site.xml #对于hadoop来讲是根据属性来定义的,而这些属性其实就是java运行的属性定义
hadoop_env.sh #设置hadoop环境变量脚本,必须要依赖jdk,如果没有在全局配置文件里设定的话,可以在这个文件里去设置变量
配置core-site.xml
hduser@locahost:/usr/local/hadoop/etc/hadoop$ cat core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name> #示hadoop存放数据的目录,即包括NameNode的数据,也包括DataNode的数据,路径可以任意,但必须确保路径的存在和路径的属主是否为hduser
<value>/hadoop/temp</value> #如果不指定路径,则默认是/tmp/
</property>
#定义HDFS 默认名称节点(主节点)的路径以及监听端口
<property>
<name>fs.default.name</name> #定义HDFS的名称节点和其默认的文件系统
<value>hdfs://localhost:8020</value>
</property>
</configuration>
切换至管理员创建目录
root@localhost:~# mkdir -p /hadoop/temp/
root@localhost:~# chown hduser.hduser -R /hadoop/
定义mapred-site.xml
hduser@localhost:/usr/local/hadoop/etc/hadoop$ cpmapred-site.xml.template mapred-site.xml
hduser@localhost:/usr/local/hadoop/etc/hadoop$ catmapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name> #接受多个以逗号分隔路径列表作为其值,并会以轮流的方式将数据分散存储在这些文件系统上
<value>localhost:8021</value> #设置tracker的默认端口
</property>
<property>
<name>mapred.map.tasks</name> #具体到底产生多少个分片进行处理,因为多少个map 是有关系,这里为10片
<value>10</value>
</property>
<property>
<name>mapred.reduce.tasks</name> #每任务的reduce数量
<value>2</value>
</property>
</configuration>
定义HDFS hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name> #定义dfs节点数,这里我们只是本机,所以写1
<value>1</value>
</property>
</configuration>
配置完毕,接下来初始化名称节点空间
hduser@localhost: hadoop namenode -format
或者
hduser@localhost: hdfs namenode -format
启动hadoop
hduser@localhost: pwd
/usr/local/hadoop/sbin
如果job tracker与namenode在同一节点上,那么可以使用一个脚本start-all.sh 全部启动起来,如果不在同一主机上,则需要逐个启动,以免增加服务器压力
#hadoop-daemon.sh #专门在某个节点上启动某个进程,如果我们新加了一个datanode ,显然不能将整个集群重新启动这是不现实的,所以要在新加的节点上配置好之后,启动hadoop-daemon.sh 后面跟上参数datanode | tasktrack .等 即可
我们来启动所有服务进程
hduser@localhost:start-all.sh
使用jps来查看启动的任务进程
hduser@localhost:~$ jps
7260 ResourceManager
7720 Jps
7354 NodeManager
6867 NameNode
6958 DataNode
7124 SecondaryNameNode
测试:向hadoop中保存文件
#在HDFS文件系统中新建目录
duser@localhost:/usr/local/hadoop/sbin$ hdfs dfs -mkdir /input
#查看目录
hduser@localhost:/usr/local/hadoop/sbin$ hdfs dfs -ls /
Found 1 items
drwxr-xr-x - hduser supergroup 0 2014-03-03 15:02 /input
#上传脚本至于HDFS根目录
hduser@localhost:/usr/local/hadoop/sbin$ hdfs dfs -putstop-all.sh /
#查看是否上传成功
hduser@localhost:/usr/local/hadoop/sbin$ hdfs dfs -ls /
Found 2 items
drwxr-xr-x - hdusersupergroup 0 2014-03-0315:02 /input
-rw-r--r-- 1 hduser supergroup 1462 2014-03-03 15:03 /stop-all.sh
验证:
运行Hadoop自带的wordcount程序实现对测试文件中各单词出现次数进行统计的实现过程
hduser@localhost: wgethttp://www.gutenberg.org/cache/epub/20417/pg20417.txt
hduser@localhost: hdfs dfs -ls /tmp
hduser@localhost: hadoop -jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jarwordcount /tmp/ /tmp/
hduser@localhost: hadoop fs -ls /tmp-output/part-r-00000
hduser@localhost: hadoop fs -get /tmp-output/part-r-00000
#在执行过程中我们可以看到有大量的信息,如下所示:
14/03/04 15:52:09 INFO mapred.LocalJobRunner: wrote record24000. 820459080 bytes left. > map
14/03/04 15:52:12 INFO mapred.LocalJobRunner: wrote record 36800. 685632166bytes left. > map
14/03/04 15:52:15 INFO mapred.LocalJobRunner: wrote record 48600. 561878098bytes left. > map
14/03/04 15:52:18 INFO mapred.LocalJobRunner: wrote record 60000. 442778615bytes left. > map
14/03/04 15:52:21 INFO mapred.LocalJobRunner: wrote record 72400. 312188642bytes left. > map
14/03/04 15:52:24 INFO mapred.LocalJobRunner: wrote record 80400. 227760952bytes left. > map
14/03/04 15:52:27 INFO mapred.LocalJobRunner: wrote record 94600. 77905011bytes left. > map
14/03/04 15:52:29 INFO mapred.LocalJobRunner: wrote record 94600. 77905011bytes left. > map
就是说不管你执行哪个示例程序,启动的job都只是在master这个节点本地运行的job,也就意味着为单节点工作
完全分布式
1.规划如下:
IP地址 | 服务角色 | 操作系统 |
172.23.214.50 | Master(NameNode)、JobTracker | Debian GNU/Linux 7.2 |
172.23.214.47 | Slave (Secondary NameNode) | Debian GNU/Linux 7.2 |
172.23.215.61 | DateNode 、Task Tracker | Debian GNU/Linux 7.2 |
2.准备工作
2.1修改本地hostname主机名,并指定hosts配置文件
以master为例:
hduser@namenode1:~$ hostname
namenode1
hduser@namenode1:~$ cat /etc/hosts
172.23.214.50 namenode1
172.23.214.47 namenode2
172.23.215.61 datanode1
127.0.0.1 localhost
测试链路是否通畅
hduser@namenode1:~$ ping datanode1
hduser@namenode1:~$ ping namenode2
反之,在其他节点也对其主机之外的host进行的测试,确保链路畅通
2.2配置ssh免密码登录
首先确保系统是否存在hduser或其他自定义用户名,如没有则手动建立
root@namenode1:~# id hduser
uid=1002(hduser) gid=1002(hduser) groups=1002(hduser)
root@namenode1:~# su - hduser
在各节点主机都进行以下操作
hduser@namenode1:~$ cd
hduser@namenode1:~$ ssh-keygen -t rsa -P ''
hduser@namenode1:~$ ssh-copy-id -i .ssh/id_rsa.pub hduser@datanode1
hduser@namenode1:~$ ssh-copy-id -i .ssh/id_rsa.pubhduser@namenode1
hduser@namenode1:~$ ssh-copy-id -i .ssh/id_rsa.pubhduser@datanode2
验证免密码
hduser@namenode1:~$ ssh hduser@namenode1 date
2014年 03月 06日 星期四 11:21:22 CST
hduser@namenode1:~$ ssh hduser@namenode2 date
2014年 03月 06日 星期四 11:21:24 CST
hduser@namenode1:~$ ssh hduser@datanode1 date
2014年 03月06日 星期四 11:21:30 CST
2.3环境变量
配置JDK环境变量
hduser@namenode1:~$ cat /etc/profile.d/java.sh
JAVA_HOME=/home/hduser/jdk
HADOOP_HOME=/usr/local/hadoop
STORM_HOME=/home/storm
export JAVA_HOME HADOOP_HOME STORM_HOME
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$STORM_HOME/bin/
配置hadoop环境变量
hduser@namenode1:~$ cat /etc/profile.d/hadoop.sh
HADOOP_HOME=/usr/local/hadoop
PATH=$HADOOP_HOME/bin:$PATH:/usr/local/hadoop/sbin/
export HADOOP_HOME PATH
验证HADOOP环境变量是否生效
hduser@namenode1:~$ echo $HADOOP_HOME
/usr/local/hadoop
查看hadoop版本
hduser@namenode1:~$ hadoop version
Hadoop 2.2.0
Subversion Unknown -r 1556437
Compiled by hadoop on 2014-01-08T04:16Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4
This command was run using /usr/local/hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar
验证JDK环境变量是否生效
hduser@namenode1:~$ echo $JAVA_HOME
/home/hduser/jdk
hduser@namenode1:~$ java -version
java version "1.7.0_03"
OpenJDK Runtime Environment (IcedTea7 2.1.7) (7u3-2.1.7-1)
OpenJDK 64-Bit Server VM (build 22.0-b10, mixed mode)
2.4修改配置文件
指定slaves节点
hduser@namenode1:/usr/local/hadoop/etc/hadoop$ cat slaves
namenode2
datanode1
配置core-site.xml
hduser@namenode1:/usr/local/hadoop/etc/hadoop$ cat core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name> #属性用于定义Hadoop的临时目录至/hadoop/temp/
<value>/hadoop/temp</value>
</property>
<property>
<name>fs.default.name</name> #定义HDFS的名称节点和其默认的文件系统
<value>hdfs://namenode1:8020</value>
<final>true</final>
</property>
</configuration>
配置mapred-site.xml
hduser@namenode1:/usr/local/hadoop/etc/hadoop$ catmapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name> #可以接受多个以逗号分隔路径列表作为其值,并会以轮流的方式将数据分散存储在这些文件系统上,因此指定位于不同磁盘上的多个文件系统路径可以分散数据I/O
<value>namenode1:8021</value> #
<final>true</final>
</property>
<property>
<name>mapred.reduce.tasks</name> #定义每任务的reduce数量
<value>2</value>
</property>
</configuration>
配置hdfs-site.xml
hduser@namenode1:/usr/local/hadoop/etc/hadoop$ cat hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name> #定义dfs节点个数,这里我们就有一个datanode
<value>1</value>
</property>
<property>
<name>dfs.data.dir</name> #HDFS文件数据块的本地目录
<value>/hadoop/data</value>
<final>ture</final>
</property>
<property>
<name>dfs.name.dir</name> #HDFS元数据的本地目录
<value>/hadoop/name</value>
<final>ture</final>
</property>
<property>
<name>fs.checkpoint.dir</name> #定义的SecondaryNameNode用于存储检查点文件的目录
<value>/hadoop/namesecondary</value>
<final>ture</final>
</property>
</configuration>
设置缓冲大小
Hadoop为其I/O操作使用了4KB的缓冲区容量,这个值是相当保守的。在当今的硬件和操作系统上,可以安全地增大此值以提高系统性能;一般说来,128KB(131072 bytes)是比较理想的设定。如果需要,可以在core-site.xml中通过io.file.buffer.size属性进行定义--在core-site.xml文件中追加以下内容
<property>
<name>io.file.buffer.size</name>
4096</value>
</property>
3.将配置复制至其他节点
hduser@namenode1:/usr/local/hadoop/etc/hadoop$ scp *hduser@datanode1:/usr/local/hadoop/etc/hadoop/
hduser@namenode1:/usr/local/hadoop/etc/hadoop$ scp * hduser@namenode2:/usr/local/hadoop/etc/hadoop/
4.初始化数据节点
hduser@namenode1:$ hadoop namenode -format
5.启动并验证Hadoop
为了方便,分别在其他节点执行start-all.sh,较大的内在需求;而在运行着众多MapReduce任务的环境中,JobTracker节点会用到大量的内存和CPU资源,因此,此场景中通常需要将NameNode和JobTracker运行在不同的物理主机上,也就是说如果在生产环境中,需要对服务角色进行执行对应的脚本
hduser@namenode1:/usr/local/hadoop/etc/hadoop$ cd/usr/local/hadoop/sbin/
hduser@namenode1:/usr/local/hadoop/sbin$ ./start-all.sh
使用jps命令分别查看不同角色服务器所运行的hadoop服务
hduser@namenode1:/usr/local/hadoop/sbin$ jps
3624 Jps
2951 NameNode
3351 ResourceManager
3125 SecondaryNameNode
hduser@namenode2:/usr/local/hadoop/etc/hadoop$ jps
31488 Jps
29784 SecondaryNameNode
31394 NodeManager
hduser@datanode1:~$ jps
32416 DataNode
462 Jps
32693 ResourceManager
328 NodeManager
32535 SecondaryNameNode
hdfs文件系统的状态信息
hduser@namenode1:/usr/local/hadoop/logs$ hdfs dfsadmin -report
Configured Capacity: 30302740480 (28.22 GB)
Present Capacity: 18599096320 (17.32 GB)
DFS Remaining: 18599047168 (17.32 GB)
DFS Used: 49152 (48 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 2 (2 total, 0 dead)
Live datanodes:
Name: 172.23.215.61:50010 (datanode1)
Hostname: datanode1
Decommission Status : Normal
Configured Capacity: 15151370240 (14.11 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 5851353088 (5.45 GB)
DFS Remaining: 929×××576 (8.66 GB)
DFS Used%: 0.00%
DFS Remaining%: 61.38%
Last contact: Wed Mar 05 16:56:09 CST 2014
Name: 172.23.214.47:50010 (namenode2)
Hostname: namenode2
Decommission Status : Normal
Configured Capacity: 15151370240 (14.11 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 5852291072 (5.45 GB)
DFS Remaining: 9299054592 (8.66 GB)
DFS Used%: 0.00%
DFS Remaining%: 61.37%
Last contact: Wed Mar 05 16:56:08 CST 2014
访问
查看RM
查看HDFS
转载于:https://blog.51cto.com/yijiu/1369225