hadoop/hdfs

首先hadoopapache基金会用java语言实现的开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算。

 

 

hadoop/hdfsmfs都是分布式文件系统,二者的比较如下

1hdfsmfs都是类似goolefs的实现方式,即一个master+多个chunkserver构成的集群

2、都存在master单点故障问题

3、都支持在线扩容

4、都是处理海量数据的,但对海量小文件处理乏力

差异:

1、hadoop基于java实现,mfs基于c++实现

2、mfs提供的快照功能

3、

所以,首先要保证java平台能够正常运行,下载安装jdk原码薄,一般情况下将其解压放至/usr/local然后创建软连接。

 

 

hadoop单机模式:

[root@server1 local]# ln -s jdk1.7.0_79/ java

进入/etc/profile下修改java路径(java_home,classpath,path)

export JAVA_HOME=/usr/local/java

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$PATH:$JAVA_HOME/bin

source使配置文件生效。

[root@server1 java]# source /etc/profile

查看配置是否正确

[root@server1 java]# echo $JAVA_HOME

/usr/local/java

[root@server1 java]# echo $CLASSPATH

.:/usr/local/java/lib:/usr/local/java/jre/lib

[root@server1 java]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/java/bin:/usr/local/java/bin

***如果是配置文件错误导致无法使用系统命令,那么需要使用绝对路径来调用命令

 

编写一个java小程序,测试java环境的正确性:

[root@server1 java]# cat test.java 

class test

{

public static void main (String args[]){

System.out.println("hello world ");

}

}

[root@server1 java]# !jav

javac test.java 

[root@server1 java]# java test

hello world 

至此,java环境配置完成。

 

 

hadoop/hdfs安装。

[root@server1 hadoop]# tar -xf hadoop-2.7.3.tar.gz -C /usr/local/

创建软连接:

[root@server1 local]# ln -s hadoop-2.7.3/ hadoop

 

 

默认情况下hadoop是运行在非分布式模式,在这种情况下,可以进行debug

尝试使用hdfs对数据进行统计:

[root@server1 hadoop]# pwd

/usr/local/hadoop

$mkdir input

  $ cp etc/hadoop/*.xml input

  $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'

  $ cat output/*

[root@server1 hadoop]# cat output/*

1dfsadmin

1dfs.replication

 

 

hdfs伪分布模式

很多hadoop配置的模版在share/doc中都有,所以将其移到/var/www/html下,使用网页查看,以便修改配置文件:

[root@server1 doc]# cp hadoop/ /var/www/html/ -r

[root@server1 hadoop]# pwd

/usr/local/hadoop/etc/hadoop

[root@server1 hadoop]# vim core-site.xml 

 

<configuration>

        <property>

                <name>fs.defaultFS</name>

                        <value>hdfs://172.25.33.1:9000</value>

                            </property>namenode IP也可以使用主机名,但最好要有解析。

</configuration>

[root@server1 hadoop]# vim hdfs-site.xml 

<configuration>

<property>

        <name>dfs.replication</name>

                <value>1</value>//分片数量,单机模式将其配置为1.

                    </property>

</configuration>

 

[root@server1 hadoop]# vim hadoop-env.sh 

24 # The java implementation to use.

 25 export JAVA_HOME=/usr/local/java

 

在启动hdfs时会使用ssh进行多次登陆,所以,设置ssh输入密码登陆。

[root@server1 hadoop]# ssh-keygen //一路回车

 

[root@server1 hadoop]# ssh-copy-id  172.25.33.1//将密钥分发给172.25.33.1,即刚才在core-site中设置的IP

使用ssh 172.25.33.1可以无密码访问即为成功

格式化namenode 节点

[root@server1 hadoop]# bin/hdfs namenode -format

启动hdfs

[root@server1 hadoop]# sbin/start-dfs.sh 

 

使用jps查看本节点的资源信息

[root@server1 hadoop]# jps

2918 NameNode

3011 DataNode

3293 Jps

3184 SecondaryNameNode

此时可以通过网页的50070访问到关于hdfs的信息

***如果发现无法访问,并提示not found,检查本地的50070是否打开,然后清理/tmp/下的所有临时文件,再清空浏览器的缓存,再次访问。

 

创建hdfs目录,以便于执行mapreduce工作。 

bin/hdfs dfs -mkdir /user

bin/hdfs dfs -mkdir /user/root

***如果在这里没有创建hdfs目录,那么可能会出现没有这个目录的报错。

项分布式系统中放一些东西

bin/hdfs dfs -put etc/hadoop/  input

运行mapreduce的一些测试方法:

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'

 

检测输出的结果,

[root@server1 hadoop]# bin/hdfs dfs -get output output

 

[root@server1 hadoop]# cat output/* 

6dfs.audit.logger

4dfs.class

3dfs.server.namenode.

2dfs.period

2dfs.audit.log.maxfilesize

2dfs.audit.log.maxbackupindex

1dfsmetrics.log

1dfsadmin

1dfs.servers

1dfs.replication

1dfs.file

或直接执行:

[root@server1 hadoop]# bin/hdfs dfs -cat output/* 

 

同时也可以在浏览器中查看结果是否成功

使用bin/hdfs dfs 回车,会发现好多可以执行的命令。

 

 

分布式hdfs

停掉bin/stop-dfs.sh

启动三台虚拟机:

为三台虚拟机创建hadoop用户,uid=1000

 

mv hadoop-2.7.3/ /home/hadoop/

vim /etc/profile

export JAVA_HOME=/home/hadoop/java

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$PATH:$JAVA_HOME/bin

 

source /etc/profile

改变/home/hadoop/下的所有文件的所属主和所属组均为hadoop

 

 

234上均安装nfs-utils 实现/home/hadoop目录共享

修改配置文件,将/home/hadoop共享出去

vim /etc/exports

/home/hadoop 172.25.33.0/24(rw,anonuid=1000,anongid=1000)

server1添加slaves

[root@server1 hadoop]# pwd

/home/hadoop/hadoop/etc/hadoop

编辑slaves文件,添加要共享的主机IP 

172.25.33.3

172.25.33.4

启动nfs

service nfs start

并检查rpcbind and rpcidmapd 的状态

如果二者的状态不在运行,那么,nfs可能无法启动

将二者体起来

server1上执行showmount -e来查看自己的共享

使用exports -v  输出自己的共享

exportfs -v

/shared       172.25.33.2/24(rw,wdelay,root_squash,no_subtree_check)

/var/www/html/upload

172.25.33.2/24(rw,wdelay,root_squash,no_subtree_check)

/home/hadoop  172.25.33.0/24(rw,wdelay,root_squash,no_subtree_check,anonuid=1000,anongid=1000)

server2,3,4上挂在/home/hadoop /home/hadoop

2,3,4hadoop用户设置免密码登陆

为每个hadoop设置密码

切换到hadoop用户,生成密钥:

ssh-keygen 

然后将其分发出去:

ssh-copy-id 172.25.33.2/3/4

为每台机器添加java环境变量

vim /etc/profile

source /etc/profile

/home/hadoop目录中文件的属主属组改为hadoop

编辑[root@server1 hadoop]# vim hdfs-site.xml 

value 值改为2.

使用hadoop格式化,启动hdfs

使用jps查看发现

[hadoop@server1 hadoop]$ jps

17846 Jps

17737 SecondaryNameNode

17545 NameNode

在本地没有了datanode,在34上看,发现数据节点已经传过来了。

jps

[hadoop@server3 ~]$ jps

3005 DataNode

3110 Jps

 

此时可能有各种各样的原因导致各种错误,因此,如果出现某个节点无法启动,可以在hadoop/对应目录下有log/下边有各种日志,方便派错哦。

此次错误主要是namenode无法启动,经过派错发现,50070端口被java已经占用,所以,果断一个killall - 9 java,弄死他,然后在从新格式化,启动,即OK ~

 

创建hdfs执行目录:

 

bin/hdfs dfs -mkdir /user

bin/hdfs dfs -mkdir /user/hadoop

bin/hdfs dfs -put etc/hadoop/ input 

bin/hdfs dfs -cat input/*

 

在浏览器中同样可以看到

 

使用bin/hdfs dfsadmin -report可以查看资源输出和占用情况。

启动资源管理器:

yarn

yarnhadoop的资源管理器,他的设计思想时将jobTracker拆分成了两个独立的服务,一个是全剧的资源管理器,ResourceManager和每个应用程序特有的ApplicationMaster

ResourceManager负责整个系统的资源分配和管理,而AM负责单个应用程序的管理

其总体上仍然是M/S结构。

 

hdfs资源迁移:

对新机器做根目录共享和挂在,启动datanode节点

 

[hadoop@server5 hadoop]$ sbin/hadoop-daemon.sh start datanode

 

5上同样要有hosts解析,同时要有sshkey免密码钥匙

server1上执行bin/hdfs dfsadmin -report可以看到server5在节点中。

server1上,添加datanode控制文件:

vim hdfs.site.xml

<configuration>

 <property>

        <name>dfs.replication</name>

                <value>2</value>

                    </property>

<property>

        <name>dfs.hosts.exclude</name>

                        <value>/home/hadoop/hadoop/etc/hadoop/exludes</value>

                                            </property>

</configuration>

 

 

添加控制资源信息

[hadoop@server1 hadoop]$ vim /home/hadoop/hadoop/etc/hadoop/exludes

172.25.33.3//server3的资源进行操作。

刷新资源节点:

[hadoop@server1 hadoop]$ bin/hdfs dfsadmin -refreshNodes

它会提示成功,但是,实际进行的资源转移正在进行。

使用[hadoop@server1 hadoop]$ bin/hdfs dfsadmin -report

查看资源变化状态。

当资源进行后,使用

[hadoop@server3 hadoop]$ sbin/hadoop-daemon.sh stop datanode

停掉该节点的资源。

使用bin/hdfs dfsadmin -report就会发现,资源3已经停止了。

使用jps已经没有资源信息了。