Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
[1] Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。 [2]
adoop的集群主要由 NameNode,DataNode,Secondary NameNode,JobTracker,TaskTracker组成.如下图所示:
NameNode中记录了文件是如何被拆分成block以及这些block都存储到了那些DateNode节点.NameNode同时保存了文件系统运 行的状态信息. DataNode中存储的是被拆分的blocks.Secondary NameNode帮助NameNode收集文件系统运行的状态信息.JobTracker当有任务提交到Hadoop集群的时候负责Job的运行,负责调 度多个TaskTracker.TaskTracker负责某一个map或者reduce任务.
####hadoop大数据平台单点服务
首先要有干净的虚拟机,给这个虚拟机的memy为2G
###首先要有两个软件包get hadoop-2.7.3.tar.gz jdk-7u79-linux-x64.tar.gz
useradd -u 800 hadoop
passwd hadoop ##给用户一个密码
mv * /home/hadoop/ ##把软件包都放在用户的加目录下
su - hadoop
ls ##有两个软件包
tar zxf jdk-7u79-linux-x64.tar.gz
ln -s jdk1.7.0_79/ java #做个软连接
cd java/bin/ ##此时的位置为/home/hadoop/java/bin
cd
vim .bash_profile #添加环境变量
PATH=$PATH:$HOME/bin:/home/hadoop/java/bin
source .bash_profile
jps ###产看jps的进程此时只有一个
tar zxf hadoop-2.7.3.tar.gz
cd hadoop-2.7.3/etc/hadoop/
vim hadoop-env.sh
###将环境变量打开 export JAVA_HOME=/home/hadoop/java
cd
cd hadoop-2.7.3
bin/hadoop ##产看用法
mkdir input
cp etc/hadoop/*.xml input/
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'
cd output/
ls
cat *
cd ..
cd input/
du -sh ##产看多大
cd ..
cd etc/hadoop
vim core-site.xml
###在《configuration》中加
<property>
<name>fs.defaultFS</name>
<value>hdfs://172.25.17.1:9000</value>
</property>
vim hdf-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
ssh-keygen ##直接回车
ssh-copy-id 172.25.17.1 ##复制一个钥匙,在/home/hadoop/.ssh下生成.ssh/authorized_keys这个文件
cd
cd .ssh
ls ###.ssh/authorized_keys其实就是copy id_rsa.pub 只是名字不同而已,内容没什么不同
diff authorized_keys id_rsa.pub
ssh 172.25.17.1
ssh localhost
ssh server1 ##一定要做解析,每次进去之后要记得退出
ssh 0.0.0.0
cd
cd hadoop-2.7.3/etc/hadoop
vim salves
172.25.17.1
cd ..
cd ..
bin/hdfs namenode -format
sbin/start-dfs.sh ##不会报错
jps ##看java服务开了那些
###进入浏览器
http://172.25.17.1:50070
bin/hdfs dfs -ls ##并不会显示任何目录,所以下面的步骤就是为了给他做一个目录
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/hadoop
进入浏览器,点击utilitics:选择文件系统,可以看见显示hadoop了
bin/hdfs dfs -ls
bin/hdfs dfs -put input/
进入浏览器,点击utilitics:选择文件系统,可以看见显示input了
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'
进入浏览器,点击utilitics:选择文件系统,可以看见多了两个目录
bin/hdfs dfs -ls
bin/hdfs dfs -cat output/*
bin/hdfs dfs -get output
cd output
cat *
jps ##看开起来的java进程
##并行服务,需要在开2台干净的虚拟机,memy分别给1G
cd hadoop-2.7.3
sbin/stop-dfs.sh
cd etc/hadoop
vim hdfs-site.xml ##将数字1改为2,因为有两个存储设备
vim slaves
172.25.17.2
172.25.17.3
jps ##因为服务是停掉的,所以就没有java进程
cd /tmp
rm -fr * ##删除所有数据,保证数据的一致性
yum install -y nfs-utils #需要在root用户下载
/etc/init.d/rpcbind start
vim /etc/exports
/home/hadoop *(rw,anonuid=800,anongid=800)
/etc/init.d/nfs start
showmount -e ##发现共享设备
##在新开启虚拟机中做,也就是server2 和server3中做
yum install -y nfs-utils
/etc/init.d/rpcbind start
netstat -antlupe #端口号为111
useradd -u 800 hadoop
showmount -e 172.25.17.1 #看能不能发现设备
mount 172.25.17.1:/home/hadoop /home/hadoop/
su - hadoop
####在server1里面做
ssh server2
ssh server3 ##应该可以免密,因为我们用了nfs文件系统,他可以同步链接点的文件,记得在hadoop用户下免密
cd hadoop-2.7.3
bin/hdfs namenode -format
sbin/start-dfs.sh ##开启服务
jps ##看有那些进程
cd /tmp
ls ##有文件
##在erver2 和server3中做
jps ##他也应该开启了服务
cd /tmp
ls ##有文件显示
###进入浏览器,点击节点,观察节点server2和server3有没有加进去
###在server1里面做
cd hadoop-2.7.3
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/hadoop
bin/hdfs dfs -put etc/hadoop/ input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount input output
ls ##显示有没有output这个文件,如果有,删除 rm -fr output
bin/hdfs dfs -get output
####做分布式存储的高可用
需要新开起的虚拟机server4,内存分分给2G
###在server4里面做
yum install -y nfs-utils
/etc/init.d/rpcbind start
useradd -u 800 hadoop
mount 172.25.17.1:/home/hadoop /home/hadoop
su - hadoop
ls ##应该有文件,因为将server1的文件挂在了本地
cd hadoop-2.7.3/etc/hadoop/
vim slaves
##加入172.25.17.4
cd ..
cd ..
sbin/hadoop-daemon.sh start datanode
jps ##看自己开启的服务有没有在进程里面
##去浏览器里面看节点server4有没有加进去
###在server1里面
ssh server4 ##应该免密
dd if=/dev/zero of=bigfile bs=1M count=500
bin/hdfs dfs -put bigfile
##进入浏览器里面看
发现有bigfile这个文件
###在server4里面做
cd
ln -s hadoop-2.7.3 hadoop
cd /hadoop-2.7.3/etc/hadoop
vim hdfs-site.xml
在<configuration>里面加入
<property>
<name>dfs.hosts.exclude</name>
<value>/home/hadoop/hadoop/etc/hadoop/exclude-hosts</value>
</property>
vim /home/hadoop/hadoop/etc/hadoop/exclude-hosts
172.25.17.4 ##
vim slaves
##删除server4
####在server1里做
cd /hadoop-2.7.3
bin/hdfs dfsadmin -refreshNodes ##刷新节点
bin/hdfs dfsadmin -report
jps ##有进呈显示
cd hadoop/etc/hadoop/
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
vim yarn-site.xml
<property>
<name>yarn.nodemanager.aux-service</name>
<value>mapreduce_shuffle</value>
</property>
jps ##看看进程在美在
cd
cd hadoop
sbin/start-yarn.sh
jps ##x显示有没有多加一个进程,resourceManager
####在server2和server3俩面看,新的进程有没有加进去
jps ##加进来的进程叫做nodemanager,resourcemanager进程会调用nodemanager,
###在开一个虚拟机server5,要求环境干净
yum install -y nfs-utils
/etc/init.d/rpcbind start
useradd -u 800 hadoop
mount 172.25.17.1:/home/hadoop /home/hadoop
df
su - hadoop
###在server1里面做
cd
cd hadoop
sbin/stop-yarn.sh
sbin/stop-dfs.sh
###在server2和server3里面
jps ##因为server1服务关了,所以2,3也不显示了
###在server4里面做
jps ##还有服务,因为server4从server1中脱离出来了
/home/hadoop/hadoop/sbin/hadoop-daemon.sh stop datanode
jps ##此时没有服务了
###在所有的服务器上都做下列步骤
rm -fr /tmp/*
##在server2里面做
首先要有一个zookeeper-3.4.9.tar.gz 的包,必须在hadoop用户下
tar zxf zookeeper-3.4.9.tar.gz
cd zookeeper-3.4.9/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
##在里面添加
server.1=172.25.17.2:2888:3888
server.2=172.25.17.3:2888:3888
server.3=172.25.17.4:2888:3888
mkdir /tmp/zookeeper
cd /tmp/zookeeper
vim myid 1
##去server3和server4里面做
mkdir /tmp/zookeeper
cd /tmp/zookeeper
vim myid 2/3
###在server2,3,4里面做
cd
cd zookeeer-3.4.9
bin/zkServer.sh start
###在server2里面做
cd
cd zookeeer-3.4.9
bin/zkCli.sh
ls /
ls /zookeeper
ls /zookeeper/quota
get /zookeeper/quota
##在server1里面做
cd
cd /hadoop/etc/hadoop
vim core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://masters</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>172.25.17.2:2181,172.25.17.3:2181,172.25.17.4:2181</value>
</property>
vim hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>masters</value>
</property>
<property>
<name>dfs.ha.namenodes.masters</name>
<value>h1,h2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.masters.h1</name>
<value>172.25.17.1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.masters.h1</name>
<value>172.25.17.1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.masters.h2</name>
<value>172.25.17.5:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.masters.h2</name>
<value>172.25.0.5:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://172.25.17.2:8485;172.25.17.3:8485;172.25.17.4:8485/masters</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/tmp/journaldata</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.masters</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvid
er</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
###在srver2,3,4节点做
bin/zkServer.sh start
jps ##看是否为高可用
cd
cd hadoop
sbin/hadoop-daemon.sh start journalnode #3个节点都做
###在server1里面做格式话
cd
cd hadoop
bin/hdfs namenode -format
vim etc/hadoop/slaves
172.25.17.4
scp -r /tmp/hadoop-hadoop 172.25.17.5:/tmp
bin/hdfs zkfc -formatZK
###在server2里做
cd
cd zookeeper-3.4.9
bin/zkCli.sh
ls /hadoop-ha/masters
get /hadoop-ha/masters
###在server1里面做
sbin/start-dfs.sh
jps ##有3个进程
##继续在server2里做
get /hadoop-ha/masters/ActiveBreadCrumb
##进入浏览器里面做
http://172.25.17.1:50070 active
http://172.25.17.5:50070 ##都能显示standby
##在server1里面做
sbin/start-dfs.sh
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/hadoop
bin/hdfs dfs -put etc/hadoop/ input
##进入浏览器里面
看到上传了input
##在server1里面
jps
kill -9 namenode的进称号 ##谁是主master,杀谁的进程号
杀掉 h1 主机的 namenode 进程后依然可以访问,此时 h2 转为 active 状态接
管 namenode
sbin/hadoop-daemon.sh start namenode
启动 h1 上的 namenode,此时为 standby 状态。
到此 hdfs 的高可用完成