hadoop,
hadoop2.0核心
HDFS 分布式文件系统
YARN 资源管理调度系统
hadoop特点
扩容能力
能可靠的存储和处理千兆字节(PB)数据
成本低
可以通过普通机器组成的服务器群来分发处理数据.这些服务器群总计可达数千个节点
高效率
通过分发数据,hadoop可以在数据所在的节点上并行的处理他们,这使得处理非常的快速
可靠性
hadoop能自动的维护数据的多份副本,并且在任务失败后能自动的重新部署计算任务
hadoop部署方式
本地模式
伪分布模式
集群模式
hadoop目录结构
sbin 启动服务的命令
bin 操作hadoop的命令
etc 配置文件
share jar包
lib
include
libexec
hadoop伪分布式搭建
修改配置文件
hadoop-env.sh
修改: export JAVA-HOME=具体地址
core-site.xml
在<configuration>标签中添加
<!-- 指定namenode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存放目录(不是临时文件)-->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/tmp</value>
</property>
hdfs-site.xml
在<configuration>标签中添加
<!-- 指定hdfs副本的数量(文件总共保存1份)-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
mapred-site.xml(从mapred-site.xml.template重命名得来)
在<configuration>标签中添加
<!-- 指定mapreduce运行在yarn上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
在<configuration>标签中添加
<!-- 指定yarn的ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
</property>
<!-- reducer获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
将hadoop添加到环境变量
在/etc/profile文件中添加
export HADOOP_HOME=...
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
保存并source /etc/profile
初始化namenode
hdfs namenode -format
启动
运行安装目录下sbin下面的start-all.sh
查看jps是否启动成功
可使用浏览器访问hdfs管理界面查看是否启动成功(localhost:50070)
可使用浏览器访问yarn管理界面查看是否启动成功(localhost:8088)
或单独启动一个进程: hadoop-daemon.sh start namenode
hdfs命令
上传文件
hadoop fs -put /root/words.txt hdfs;//localhost:9000/words.txt
下载文件
hadoop fs -get hdfs://localhost:9000/words.txt /home/123.txt
查看文件
hadoop fs -ls hdfs://localhost:9000/
查看文件内容
hadoop fs -cat hdfs://localhost:9000/words.txt
删除文件
hadoop fs -rm -r hdfs://localhost:9000/tmp
统计(总文件夹数,总文件数,总大小)
hadoop fs -count hdfs://localhost:9000/
复制
hadoop fs -cp hdfs://localhost:9000/123 hdfs://localhost:9000/home/123
移动
hadoop fs -mv hdfs://localhost:9000/123 hdfs://localhost:9000/home/123
显示文件系统使用情况
hadoop fs -df hdfs://localhost:9000/
显示指定目录下各个文件的大小
hadoop fs -du hdfs://localhost:9000/
注意:
如果是本机,则hdfs://localhost:9000/可以省略为/
可使用通配符,如 hdfs://localhost:9000/12* ,当使用通配符时,需要写全路径,不能简写
HDFS的架构
主节点(namenode)
说明
只有一个
接收用户操作请求
维护文件系统的目录结构
管理文件与block之间关系,block与datanode之间关系
相关文件存在 tmp/dfs/name 中
维护的文件
fsimage 元数据镜像文件,存储某一时段namenode内存中的元数据信息
edits 操作日志文件
fstime 保存最近一次checkpoint的时间
工作特点
始终在内存中保存metadata,用于处理读请求
写请求时,首先向edits文件中写日志,再修改内存,并向客户端返回
会维护一个fsimage文件,是内存中metadata的镜像.fsimage不会随时更新,而是每隔一段时间会通过合并edits文件来更新内容.
secondary namenode就是用来合并fsimage和edits文件来更新fsimage的
secondarynamenode
说明
在伪分布式中存在,在集群中不存在
辅助namenode,用来合并fsimage和edits文件来更新fsimage的
ha的一个解决方案,但不支持热备,配置即可
默认安装在namenode节点上(不安全)
相关文件存在 tmp/dfs/namesecondary 中
工作流程
通知namenode切换新的edits文件
获得并合并fsimage和edits文件
发送给namenode新的fsimage文件
namenode用新的fsimage文件替换旧的fsimage
触发条件(checkpoint)
fs.checkpoint.period,指定两次运行最大时间间隔,默认3600秒
fs.checkpoint.size,规定edits文件的最大值,默认64mb
从节点(datanode)
说明
有很多个
存储文件
文件被分成block存储在磁盘上
为保证数据安全,文件会有多个副本
相关文件存在 tmp/dfs/node 中
特点
文件块为最基本的存储单位,hdfs默认block大小是128MB
不同于普通文件系统的是,hdfs中,如果一个文件小于数据块的大小,并不占用整个数据块存储空间
Replication,多副本,默认是三个
java操作hdfs
上传,下载
rpc
两个进程之间的方法调用
和webservice基本相同,不过需要得到接口对象(webservice是需要wsdl文件,然后生成类似于接口的文件)
底层还是套接字
hdfs底层
使用rpc调用namenode的方法获得资源的元数据信息(分几块,每块的位置,大小)
访问datanode获取数据
远程调试hadoop
jpda
sun公司提供的远程调试方式
需要在$HADOOP_HOME/etc/hadoop/hadoop-env.sh文件的最后添加你想debug的进程
#远程调试namenode
export HADOOP_NAMENODE_OPTS="-agentlib:jdwp=transport=dt_socket,address=8888,server=y,suspend=y"
#远程调试datanode
export HADOOP_DATANODE_OPTS="-agentlib:jdwp=transport=dt_socket,address=9888,server=y,suspend=y"
#远程调试RM
export YARN_RESOURCEMANAGER_OPTS="-agentlib:jdwp=transport=dt_socket,address=10888,server=y,suspend=y"
#远程调试NM
export YARN_NODEMANAGER_OPTS="-agentlib:jdwp=transport=dt_socket,address=10888,server=y,suspend=y"
说明
dt_socket表示使用套接字传输。
address=8000
JVM在8000端口上监听请求,这个设定为一个不冲突的端口即可。
server=y
y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。
suspend=y
y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。
然后使用eclipse的远程调试即可
MapReduce
说明
是一种分布式计算模型,主要用于搜索领域,解决海量数据的计算问题
由两个阶段完成,Map和Reduce,用户只需要实现map()和reduce()两个函数即可实现分布式计算
这两个函数的形参是key,value对,表示函数的输入信息
MapReduce执行步骤
总体流程
rm-resourceManager nm-nodeManager
1.客户端启动(配置map和reduce的信息)
2.客户端跟rm进行rpc通信,返回hdfs地址
3.客户端将jar包存放到hdfs对应地址上
4.客户端将作业的描述信息提交给rm
nm从rm获取作业的描述信息(心跳机制)
nm到hdfs上获取jar包
nm启动新进程(yarnChild)执行作业(MapReduce),并将结果写回到hdfs中
map任务处理
读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
在map函数中写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
对输出的key、value进行分区。
对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
(可选)分组后的数据进行归约。
reduce任务处理
对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
把reduce的输出保存到文件中。
例子:实现WordCountApp
实现过程
导入jar包
定义一个类继承Mapper类重写map方法
定义一个类继承Reduce类重写reduce方法
定义一个类,存在main方法,构建job对象,设置mapper和reduce,并设置属性,提交
使用本地模式运行main方法,或使用伪分布式运行(打jar包,用hadoop jar命令)
例子:单词统计
map
public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
//accept
String line = value.toString();
//split
String[] words = line.split(" ");
//loop
for(String w : words){
//send,发送的数据需要实现序列化接口
context.write(new Text(w), new LongWritable(1));
}
}
}
reduce
public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
@Override
protected void reduce(Text key, Iterable<LongWritable> values, Context context)
throws IOException, InterruptedException {
//define a counter
long counter = 0;
//loop
for(LongWritable l : values){
counter += l.get();
}
//write,发送的数据需要实现序列化接口
context.write(key, new LongWritable(counter));
}
}
main方法
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
//notice,main方法所在类
job.setJarByClass(WordCount.class);
//set mapper`s property
job.setMapperClass(WCMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
FileInputFormat.setInputPaths(job, new Path("hdfs://localhost:9000/words.txt"));
//set reducer`s property
job.setReducerClass(WCReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000//wcout"));
//submit
job.waitForCompletion(true);
}
hadoop序列化
hadoop的序列化没有使用jdk默认的序列化(可自定义需要序列化的属性,jdk是全部序列化)
hadoop序列化的特点
紧凑:高效使用存储空间。
快速:读写数据的额外开销小
可扩展:可透明地读取老格式的数据
互操作:支持多语言的交互
hadoop的序列化类型
Text --> String
LongWritable --> Long
需要序列化的类实现Writable接口,并实现两个方法(类型和顺序需要自己控制)
示例:
public void write(DataOutput out) throws IOException {
out.writeUTF(tel);
out.writeLong(upPayLoad);
out.writeLong(downPayLoad);
out.writeLong(totalPayLoad);
}
public void readFields(DataInput in) throws IOException {
this.tel = in.readUTF();
this.upPayLoad = in.readLong();
this.downPayLoad = in.readLong();
this.totalPayLoad = in.readLong();
}
分区和排序
说明
是在map后,reduce前对mapper结果进行操作
分区就是为了对mapper结果进行分组,确认将某个结果分配给哪个reduce,每个reduce会产生一个结果文件
分区的数量一般和reduce的数量相同,reduce的数量可手动设置(如果reduce的数量大于分区的数量,会产生空的结果文件)
reduce的数量默认为1个,分区的规则默认为平均分配给reduce(应尽量使不同分区的数据量均匀分布,否则造成某个reduce压力过大)
如统计手机号使用的流量,按移动,联通,电信分区,应有三个分区,三个reduce,产生3个输出文件
实现分区的步骤
1.1先分析一下具体的业务逻辑,确定大概有多少个分区
1.2首先书写一个类,它要继承org.apache.hadoop.mapreduce.Partitioner这个类
1.3重写public int getPartition这个方法,根据具体逻辑,返回数字(相同数字代表同一个分区)
1.4在main方法中设置Partioner的类,job.setPartitionerClass(DataPartitioner.class);
1.5设置Reducer的数量,job.setNumReduceTasks(6);
实现排序
需要写两个mapReduce,第二个实现排序,将需要排序的对象作为map输出的key,会自动排序
需要序列化的类实现WritableComparable接口,重写compareTo方法
例子:统计盈利最大的商户信息(收入,支出,盈利,需要排序)
Combiners
说明
combiners相当于本地reducer
会先对于map输出的key进行一次合并,减少网络传输
可适用于累加,求最大值,过滤等情况
如单词统计中,发送3次{hello=1}合并为1次{hello=3}
局限性
combiners使用的还是reducer的代码,且combiners的输出是reducer的输入
所以combiners只适用于reducer的输入key/value和输出key/value类型一致的时候,且要注意不能影响最终结果
使用
job.setCombinerClass(reducer实现类.class);
shuffle
说明
reduce获取map指定分区的位置的过程
粗略理解:map的输出到达reduce的输入的中间过程
MapReduce流程
数据切片
map
map处理
map处理后的数据放入内存缓存区,到达80m后分区,并写入硬盘形成一个小文件
将多个小文件进行归并排序,形成一个大文件(分区并排序好的,一个map形成一个大文件)
shuffle
reduce获取map指定分区的位置的过程
分配任务前rm会先启动一个MrAppMaster进程
nm向rm领取任务后启动yarnchild执行任务(yarnchild中可能运行map,也可能运行reduce)
map执行完成后向MrAppMaster进行汇报
reduce定时向MrAppMaster询问map的执行信息和分区结果
reduce
获取各个map对应分区的文件
合并,排序
reduce处理并写入hdfs
map的数量
一个切片对应一个map,调整map的数量即调整切片的大小
默认实现类: TextInputFormat, 一个块一个切片
可修改配置修改切片大小
mapreduce.input.fileinputformat.split.minsize
mapreduce.input.fileinputformat.split.maxsize
nameservice
一个nameservice中有两个namenode,可以有多个nameservice,可实现namenode的水平扩展
namenode的active和standby状态由zookerper进行切换
zookerper
说明
提供通用的分布式锁服务,用以协调分布式应用
集群由奇数台组成(由策略决定)
一台Leader(主人),多台Follower(随从)
可实现数据同步
在hadoop中的用处
hadoop2.0,使用Zookeeper的事件处理确保整个集群只有一个活跃的NameNode,存储配置信息等
HBase,使用Zookeeper的事件处理确保整个集群只有一个HMaster,察觉HRegionServer联机和宕机,存储访问控制列表等
特性
简单
富有表现力
高可用性
松耦合交互方式
是一个资源库
安装
下载压缩包解压
配置文件
位置:
conf/zoo_sample.xml
说明:
tickTime:CS通信心跳时间
Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
tickTime=2000
initLimit:LF初始通信时限
集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
initLimit=5
syncLimit:LF同步通信时限
集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
syncLimit=2
dataDir:数据文件目录
Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataDir=/home/michael/opt/zookeeper/data
clientPort:客户端连接端口
客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
clientPort=2181
服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
这个配置项的书写格式比较特殊,规则如下:
server.N=YYY:A:B
server.1=itcast05:2888:3888
server.2=itcast06:2888:3888
server.3=itcast07:2888:3888
单机环境搭建
将conf/zoo_sample.xml重命名为zoo.xml
启动服务端: bin/zkServer.sh start
启动客户端: bin/zKCli.sh
在客户端sell状态下可输入命令 help,ls,create,rmr
集群环境搭建
配置第一台机器
安装zookerper
将conf/zoo_sample.xml重命名为zoo.xml
在配置文件中添加集群信息
server.1=itcast05:2888:3888
server.2=itcast06:2888:3888
server.3=itcast07:2888:3888
在配置文件中将dataDir配置一个目录,并在配置的目录下创建一个文件:myid,内容为当前机器的id(配置文件的server.N的N)
将zookerper文件夹复制到另外两台机器,并分别修改对应的myid文件内容
启动三台机器上的zkServer.sh
启动的三台机器第二个启动的机器为leader(刚超过半数的那一台)
宕机的机器不能超过总数的一半,否则无法正常工作(无法选举leader)
可启动客户端演示多服务端的数据同步功能
hadoop分布式搭建(2.4.1)
集群规划:
主机名 IP 安装的软件 运行的进程
itcast01 192.168.1.201 jdk、hadoop NameNode、DFSZKFailoverController
itcast02 192.168.1.202 jdk、hadoop NameNode、DFSZKFailoverController
itcast03 192.168.1.203 jdk、hadoop ResourceManager
itcast04 192.168.1.204 jdk、hadoop ResourceManager
itcast05 192.168.1.205 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
itcast06 192.168.1.206 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
itcast07 192.168.1.207 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
说明:
1.在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode
这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态
2.hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,hadoop-2.4.1解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调
1.安装配置zooekeeper集群(在itcast05上)
1.1解压
tar -zxvf zookeeper-3.4.5.tar.gz -C /itcast/
1.2修改配置
cd /itcast/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改:dataDir=/itcast/zookeeper-3.4.5/tmp
在最后添加:
server.1=itcast05:2888:3888
server.2=itcast06:2888:3888
server.3=itcast07:2888:3888
保存退出
然后创建一个tmp文件夹
mkdir /itcast/zookeeper-3.4.5/tmp
再创建一个空文件
touch /itcast/zookeeper-3.4.5/tmp/myid
最后向该文件写入ID
echo 1 > /itcast/zookeeper-3.4.5/tmp/myid
1.3将配置好的zookeeper拷贝到其他节点(首先分别在itcast06、itcast07根目录下创建一个itcast目录:mkdir /itcast)
scp -r /itcast/zookeeper-3.4.5/ itcast06:/itcast/
scp -r /itcast/zookeeper-3.4.5/ itcast07:/itcast/
注意:修改itcast06、itcast07对应/itcast/zookeeper-3.4.5/tmp/myid内容
itcast06:
echo 2 > /itcast/zookeeper-3.4.5/tmp/myid
itcast07:
echo 3 > /itcast/zookeeper-3.4.5/tmp/myid
2.安装配置hadoop集群(在itcast01上操作)
2.1解压
tar -zxvf hadoop-2.4.1.tar.gz -C /itcast/
2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
#将hadoop添加到环境变量中
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_55
export HADOOP_HOME=/itcast/hadoop-2.4.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
#hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下
cd /itcast/hadoop-2.4.1/etc/hadoop
2.2.1修改hadoo-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_55
2.2.2修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/itcast/hadoop-2.4.1/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>itcast05:2181,itcast06:2181,itcast07:2181</value>
</property>
</configuration>
2.2.3修改hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>itcast01:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>itcast01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>itcast02:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>itcast02:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://itcast05:8485;itcast06:8485;itcast07:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/itcast/hadoop-2.4.1/journal</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
2.2.4修改mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
2.2.5修改yarn-site.xml
<configuration>
<!-- 开启RM高可靠 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>itcast03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>itcast04</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>itcast05:2181,itcast06:2181,itcast07:2181</value>
</property>
</configuration>
2.2.6修改slaves(slaves是指定子节点的位置,因为要在itcast01上启动HDFS、在itcast03启动yarn,所以itcast01上的slaves文件指定的是datanode的位置,itcast03上的slaves文件指定的是nodemanager的位置)
itcast05
itcast06
itcast07
2.2.7配置免密码登陆
#首先要配置itcast01到itcast02、itcast03、itcast04、itcast05、itcast06、itcast07的免密码登陆
#在itcast01上生产一对钥匙
ssh-keygen -t rsa
#将公钥拷贝到其他节点,包括自己
ssh-coyp-id itcast01
ssh-coyp-id itcast02
ssh-coyp-id itcast03
ssh-coyp-id itcast04
ssh-coyp-id itcast05
ssh-coyp-id itcast06
ssh-coyp-id itcast07
#配置itcast03到itcast04、itcast05、itcast06、itcast07的免密码登陆
#在itcast03上生产一对钥匙
ssh-keygen -t rsa
#将公钥拷贝到其他节点
ssh-coyp-id itcast04
ssh-coyp-id itcast05
ssh-coyp-id itcast06
ssh-coyp-id itcast07
#注意:两个namenode之间要配置ssh免密码登陆,别忘了配置itcast02到itcast01的免登陆
在itcast02上生产一对钥匙
ssh-keygen -t rsa
ssh-coyp-id -i itcast01
2.4将配置好的hadoop拷贝到其他节点
scp -r /itcast/ itcast02:/
scp -r /itcast/ itcast03:/
scp -r /itcast/hadoop-2.4.1/ root@itcast04:/itcast/
scp -r /itcast/hadoop-2.4.1/ root@itcast05:/itcast/
scp -r /itcast/hadoop-2.4.1/ root@itcast06:/itcast/
scp -r /itcast/hadoop-2.4.1/ root@itcast07:/itcast/
###注意:严格按照下面的步骤
2.5启动zookeeper集群(分别在itcast05、itcast06、tcast07上启动zk)
cd /itcast/zookeeper-3.4.5/bin/
./zkServer.sh start
#查看状态:一个leader,两个follower
./zkServer.sh status
2.6启动journalnode(分别在在itcast05、itcast06、tcast07上执行)
cd /itcast/hadoop-2.4.1
sbin/hadoop-daemon.sh start journalnode
#运行jps命令检验,itcast05、itcast06、itcast07上多了JournalNode进程
2.7格式化HDFS
#在itcast01上执行命令:
hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/itcast/hadoop-2.4.1/tmp,然后将/itcast/hadoop-2.4.1/tmp拷贝到itcast02的/itcast/hadoop-2.4.1/下。
scp -r tmp/ itcast02:/itcast/hadoop-2.4.1/
2.8格式化ZK(在itcast01上执行即可)
hdfs zkfc -formatZK
2.9启动HDFS(在itcast01上执行)
sbin/start-dfs.sh
2.10启动YARN(#####注意#####:是在itcast03上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)
sbin/start-yarn.sh
到此,hadoop-2.4.1配置完毕,可以统计浏览器访问:
http://192.168.1.201:50070
NameNode 'itcast01:9000' (active)
http://192.168.1.202:50070
NameNode 'itcast02:9000' (standby)
验证HDFS HA
首先向hdfs上传一个文件
hadoop fs -put /etc/profile /profile
hadoop fs -ls /
然后再kill掉active的NameNode
kill -9 <pid of NN>
通过浏览器访问:http://192.168.1.202:50070
NameNode 'itcast02:9000' (active)
这个时候itcast02上的NameNode变成了active
在执行命令:
hadoop fs -ls /
-rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile
刚才上传的文件依然存在!!!
手动启动那个挂掉的NameNode
sbin/hadoop-daemon.sh start namenode
通过浏览器访问:http://192.168.1.201:50070
NameNode 'itcast01:9000' (standby)
验证YARN:
运行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
OK,大功告成!!!
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。