ubuntu搭建hadoop-Ver2.6.0彻底分布式环境笔记

1 参考博文

http://my.oschina.net/kakakaka/blog/336203#OSC_h2_12html

http://blog.csdn.net/greensurfer/article/details/39450369java

http://blog.csdn.net/zwto1/article/details/41073545node

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ClusterSetup.htmllinux

一般,集群里的一台机器被指定为 NameNode,另外一台不一样的机器被指定为JobTracker。这些机器是masters。余下的机器即做为DataNode做为TaskTracker。这些机器是slaves\web

官方地址:(http://hadoop.apache.org)shell

2 先决条件

  1. 确保在你集群中的每一个节点上都安装了全部必需软件:JDK ,ssh,Hadoopapache

3 实验环境搭建

3.1 准备工做

操做系统:Ubuntu
部署:Vmvare
在vmvare安装好一台Ubuntu虚拟机后,能够导出或者克隆出另外两台虚拟机。
说明:
保证虚拟机的ip和主机的ip在同一个ip段,这样几个虚拟机和主机之间能够相互通讯。
为了保证虚拟机的ip和主机的ip在同一个ip段,虚拟机链接设置为桥连。
ubuntu

准备机器:一台master,若干台slave,配置每台机器的/etc/hosts保证各台机器之间经过机器名能够互访,例如:
192.168.100.205 node1(master)
192.168.100.206 node2 (slave1)
192.168.100.207 node3 (slave2)
主机信息:
安全

机器名 IP地址 做用
Node1 192.168.100.205 NameNode、JobTracker
Node2 192.168.100.205 DataNode、TaskTracker
Node3 192.168.100.205 DataNode、TaskTracker

为保证环境一致先安装好JDK和ssh:网络

3.2 安装JDK

3.2.1 JDK下载

  本地选择的是 JDK  1.8.0_25下在地址为:http://www.oracle.com/technetwork/java/javase/downloads/index.html

3.2.2 JDK安装

  下载好后放入指定位置(如/usr/java),使用以下命令安装

 tar zxvf jdk-xxx-linux-xxx.tar.gz


3.2.3 JDK配置

  1.进入/etc目录

  2.将JDK配置信息加入profile文件

# The following configuration is for Java
export JAVA_HOME=/usr/java/jdk1.8.0_25
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:JAVA_HOME/lib:$JAVA_HOME/jre/lib

  3.使用下面组合命令使配置生效

chmod +x profile (这条命令须要超级权限)
source profile

  4.使用下面,验证JDK安装

 java -version

  若是安装版本信息显示则安装成功

 5.特殊状况:JDK版本冲突。原操做系统可能已经默认安装JDK版本,这是会发现JDK版本为旧版本。

 解决办法以下:

 (1)执行下属命令

sudo update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_25/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.8.0_25/bin/javac 300
sudo update-alternatives --install /usr/bin/jar jar /usr/java/jdk1.8.0_25/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /usr/java/jdk1.8.0_25/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /usr/java/jdk1.8.0_25/bin/javap 300 

sudo update-alternatives --config java

 (2)此时系统会列出JDK各版本以下:

有 3 个候选项可用于替换 java (提供 /usr/bin/java)。


  选择       路径                                    优先级  状态
------------------------------------------------------------
* 0            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      自动模式
  1            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      手动模式
  2            /usr/lib/jvm/java-6-sun/jre/bin/java       63        手动模式
  3            /usr/java/jdk1.8.0_25/bin/java             300       手动模式


要维持当前值[*]请按回车键,或者键入选择的编号:3

 (3)选择后执行下面语句后,将会发现版本已切换

java -version

3.3 配置ssh公钥秘钥自动登陆

在hadoop集群环境中,nameNode节点,须要可以ssh无密码登陆访问dataNode节点

进入SSH目录:

[root@node1 ~]# cd .ssh                 # 若是没有该目录,先执行一次ssh localhost
[root@node1 .ssh]#                      # 一直按回车就能够,生成的密钥保存为.ssh/id_rsa

生成公钥密钥对:

[root@node1 /]# ssh-keygen -t rsa


Generating public/private rsa key pair.    
Enter file in which to save the key (/root/.ssh/id_rsa):    
Enter passphrase (empty for no passphrase):    
Enter same passphrase again:    
Your identification has been saved in /root/.ssh/id_rsa.    
Your public key has been saved in /root/.ssh/id_rsa.pub.    
The key fingerprint is:    
98:3c:31:5c:23:21:73:a0:a0:1f:c6:d3:c3:dc:58:32 root@gifer    
The key's randomart image is:    
+--[ RSA 2048]----+    
|.   E.=.o                  |    
|.o = @ o .              |    
|. * * =                    |    
| o o o =                |    
|  .   = S                  |    
|       .                     |    
|                             |    
|                             |    
|                             |    
+------------------+


看到上面输出,表示密钥生成成功,目录下多出两个文件

私钥文件:id_raa
公钥文件:id_rsa.pub

将公钥文件id_rsa.pub内容放到authorized_keys文件中:

cat id_rsa.pub >> authorized_keys

将公钥文件authorized_keys分发到各dataNode节点:

scp authorized_keys  root@dataNode:/root/.ssh/

验证ssh无密码登陆:

[root@node1 .ssh]# ssh root@node2  
Last login: Sun Sep 21 11:38:05 2014 from 192.168.100.205

看到以上输出,表示配置成功!若是还提示须要输出密码访问,表示配置失败!


3.4 安装Hadoop(全部节点相同)

3.4.1 Hadoop下载

   地址为:http://www.apache.org/dyn/closer.cgi/hadoop/common/ 

3.4.2 Hadoop安装

   将下载下来的Hadoop放入指定目录(/usr/hadoop),使用以下命令安装

  tar xzf hadoop-2.6.0.tar.gz

3.4.3 Hadoop配置

   1.linux profile(路径:/etc)配置,以下图

# The following configuration is for hadoop
export HADOOP_INSTALL=/usr/hadoop/hadoop-2.6.0
export PATH=$PATH:$HADOOP_INSTALL/bin

  2.hadoop-env.sh(路径:$HADOOP_HOME/etc/hadoop)中把JAVA_HOME指向JDK安装根目录,以下

# The java implementation to use.
export JAVA_HOME=/usr/java/jdk1.8.0_25

  3.yarn-env.sh(路径:$HADOOP_HOME/etc/hadoop)中把JAVA_HOME指向JDK安装根目录,以下

# some Java parameters export
JAVA_HOME=/usr/java/jdk1.8.0_25

4.打开conf/core-site.xml(路径:$HADOOP_HOME/etc/hadoop)文件,编辑以下:

<configuration>  
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://node1:9000</value>
    </property>
</configuration>

1)fs.defaultFS是NameNode的URL。hdfs://主机名:端口/
2)hadoop.tmp.dir :Hadoop的默认临时路径,这个最好配置,若是在新增节点或者其余状况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录便可。不过 若是删除了NameNode机器的此目录,那么就须要从新执行NameNode格式化的命令。

5.打开conf/hdfs-site.xml(路径:$HADOOP_HOME/etc/hadoop)文件,编辑以下:

<configuration>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node1:50090</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/hadoop/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/hadoop/dfs/data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
</configuration>

1) dfs.namenode.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到全部目录中作冗余备份。
2) dfs.datanode.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目录列表时,数据将被存储在全部目录下,一般分布在不一样设备上。
3)dfs.replication是数据须要备份的数量,默认是3,若是此数大于集群的机器数会出错。

注意:此处的name一、name二、data一、data2目录不能预先建立,hadoop格式化时会自动建立,若是预先建立反而会有问题。

6.打开conf/mapred-site.xml(路径:$HADOOP_HOME/etc/hadoop)文件,编辑以下:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>node1:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>node1:19888</value>
    </property>

</configuration>


7.打开conf/yarn-site.xml(路径:$HADOOP_HOME/etc/hadoop)文件,编辑以下:

<configuration>
<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>node1</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>node1:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>node1:8088</value>
    </property>
</configuration>


3.5 配置masters和slaves主从结点

配置$HADOOP_HOME/etc/hadoop/slaves文件来设置从结点,注意最好使用主机名,而且保证机器之间经过主机名能够互相访问,每一个主机名一行。

root@node1:/usr/hadoop/hadoop-2.6.0/etc/hadoop# vi slaves

输入:
node2
node3

配置结束,把配置好的hadoop文件夹拷贝到其余集群的机器中,而且保证上面的配置对于其余机器而言正确,例如:若是其余机器的Java安装路径不同,要修改$HADOOP_HOME/etc/hadoop/hadoop-env.sh

$ scp -r /home/hadoop/hadoop-2.6.0 root@node2: /home/hadoop/

 

4 hadoop启动

4.1 格式化一个新的分布式文件系统

先格式化一个新的分布式文件系统

$ cd hadoop-2.6.0
$ bin/hadoop namenode -format

成功状况下系统输出:

12/02/06 00:46:50 INFO namenode.NameNode:STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = ubuntu/127.0.1.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 0.20.203.0
STARTUP_MSG: build =http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-203-r 1099333; compiled by 'oom' on Wed May 4 07:57:50 PDT 2011
************************************************************/

12/02/0600:46:50 INFO namenode.FSNamesystem: fsOwner=root,root
12/02/06 00:46:50 INFO namenode.FSNamesystem:supergroup=supergroup
12/02/06 00:46:50 INFO namenode.FSNamesystem:isPermissionEnabled=true
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name1 has been successfully formatted.
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name2 has been successfully formatted.
12/02/06 00:46:50 INFO namenode.NameNode:SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode atv-jiwan-ubuntu-0/127.0.0.1
************************************************************/


 查看输出保证分布式文件系统格式化成功
执行完后能够到master机器上看到/usr/hadoop/dfs/name目录。在主节点master上面启动hadoop,主节点会启动全部从节点的hadoop。

4.2 启动全部节点

$ sbin/start-all.sh (同时启动HDFS和Map/Reduce)
系统输出:

starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-ubuntu.out
node2: starting datanode, loggingto /usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node3: starting datanode, loggingto /usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node1: starting secondarynamenode,logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-ubuntu.out
starting jobtracker, logging to/usr/local/hadoop/logs/hadoop-hadoop-jobtracker-ubuntu.out
node2: starting tasktracker,logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
node3: starting tasktracker,logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
As you can see in slave's output above, it will automatically format it's storage directory(specified by dfs.data.dir) if it is not formattedalready. It will also create the directory if it does not exist yet.

行完后能够到slave(node1,node2)机器上看到/usr/hadoop/dfs/data目录。


4.3 关闭全部节点

从主节点master关闭hadoop,主节点会关闭全部从节点的hadoop。

$ sbin/stop-all.sh

Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).

${HADOOP_HOME}就是安装路径.

5 测试

1)jps查看NameNode节点和DataNode节点服务

NameNode节点(node1)已开启以下守护进程表示正常:

DataNode(node二、node3)节点开启以下守护进程表示正常:

2)浏览NameNode和JobTracker的网络接口,它们的地址默认为:

NameNode - http://node1:50070/

ResourceManager - http://node1:8088/

NodeManager - http://node2:8042/

3) 使用netstat –nat查看端口:

NameNode节点(node1)启动端口以下:

DataNode(node二、node3)节点启动端口以下:

备注:tcp6表示ipv6网络,Linux若禁止ipv6后将默认变动tcp无影响。

4)执行WordCount实例:

a、首先建立所需的几个目录

bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/hadoop

b、将etc/hadoop中的文件做为输入文件复制到分布式文件系统中

bin/hdfs dfs -put etc/hadoop /user/hadoop/input

 经过查看DataNode的状态(占用大小有改变),输入文件确实复制到了DataNode中

c、接着就能够运行MapReduce做业了

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

运行时的信息以下所示,显示Job的进度。可能会比较慢,但若是迟迟没有进度,好比10分钟都没看到进度,那不妨重启Hadoop再试试。

一样能够经过Web界面查看任务进度 http://192.168.100.205:8088/cluster

在 Web 界面点击 “Tracking UI” 这一列的 History,可能会提示网页没法打开,遇到这种状况须要手动开启 jobhistory server,开启以后刷新页面再点击就能够打开了。

sbin/mr-jobhistory-daemon.sh start historyserver

注:执行上述语句后,jps查看JobHistoryServer进程已经开启,经过web(http://192.168.100.205:19888/jobhistory)访问JobHistoryServer没有问题。可是在上面ResourceManagerWeb界面中点击 “Tracking UI” 这一列的 History,依旧提示网页没法打开。

发现URL:http://node1:19888/jobhistory/job/job_1418203576437_0001/jobhistory/job/job_1418203576437_0001,使用的是机器名node1来访问。由于我用的是hadoop集群外部机器web访问。须要修改该机器(win7系统)的hosts文件,修改方法以下:

进入C:\Windows\System32\drivers\etc,修改hosts文件。文件中追加以下内容(注意后面须要一个回车换行):

192.168.100.205        node1
192.168.100.206        node2
192.168.100.207        node3
 

经过这些修改若上面ResourceManagerWeb界面中点击 “Tracking UI” 这一列的 History,依旧提示网页没法打开。则重启下hadoop(守护进程),从新执行测试程序后,History网页就能够打开了。

d、执行完毕后的输出结果:

bin/hdfs dfs -cat /user/hadoop/output/*

e)补充
Q: bin/hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep /user/hadoop/input /user/hadoop/output 'dfs[a-z.]+'什么意思啊?
A: bin/hadoop jar(使用hadoop运行jar包)hadoop-mapreduce-examples-2.6.0.jar(jar包的名字) grep (要使用的类,后边的是参数)input output 'dfs[a-z.]+'
整个就是运行hadoop示例程序中的grep,对应的hdfs上的输入目录为input、输出目录为output。
Q: 什么是grep?
A: A map/reduce program that counts the matches of a regex in the input.

6 HDFS经常使用操做

hadoop dfs -ls 列出HDFS下的文件
hadoop dfs -ls in 列出HDFS下某个文档中的文件
hadoop dfs -put test1.txt test 上传文件到指定目录而且从新命名,只有全部的DataNode都接收完数据才算成功
hadoop dfs -get in getin 从HDFS获取文件而且从新命名为getin,同put同样可操做文件也可操做目录
hadoop dfs -rmr out 删除指定文件从HDFS上
hadoop dfs -cat in/* 查看HDFS上in目录的内容
hadoop dfsadmin -report 查看HDFS的基本统计信息,结果以下
hadoop dfsadmin -safemode leave 退出安全模式
hadoop dfsadmin -safemode enter 进入安全模式

7 添加节点

可扩展性是HDFS的一个重要特性:

1)首先在新加的节点上安装hadoop

2)而后修改etc/hosts文件,加入 DataNode主机名

3)而后在NameNode节点上修改$HADOOP_HOME/conf/slaves文件,加入新加节点主机名

4)创建到新加节点无密码的SSH链接

5)NameNode节点上运行启动命令:start-all.sh

而后能够经过http://(Masternode的主机名):50070查看新添加的DataNode

8 负载均衡

start-balancer.sh,可使DataNode节点上选择策略从新平衡DataNode上的数据块的分布

9 结束语

遇到问题时,先查看logs,颇有帮助,查看log方法以下:

cat /usr/hadoop/hadoop-2.6.0/logs/*.log

若是日志在更新,如何实时查看 tail -f /usr/hadoop/hadoop-2.6.0/logs/*.log

还可使用 watch -d -n 1 cat /usr/hadoop/hadoop-2.6.0/logs/*.log

-d表示高亮不一样的地方,-n表示多少秒刷新一次。

该指令,不会直接返回命令行,而是实时打印日志文件中新增长的内容,这一特性,对于查看日志是很是有效的。若是想终止输出,按 Ctrl+C 便可。

相关文章
相关标签/搜索