Linux上搭建Hadoop2.6.3集群以及WIN7经过Eclipse开发MapReduce的demo

近期为了分析国内航空旅游业常见安全漏洞,想到了用大数据来分析,其实数据也不大,只是生产项目没有使用Hadoop,所以这里实际使用一次。java

先看一下经过hadoop分析后的结果吧,最终经过hadoop分析国内典型航空旅游业厂商的常见安全漏洞个数的比例效果以下:node

第一次正式使用Hadoop,确定会遇到很是多的问题,参考了不少网络上的文章,我把本身从0搭建到使用的过程记录下来,方便之后本身或其余人参考。linux

以前简单用过storm,适合实时数据的处理。hadoop更偏向静态数据的处理,网上不少hadoop的教程,但有的版本比较老:好比有的是属于hadoop1.x时代,有的本机是ubuntu上安装,有的介绍理论,有的直接介绍代码demo。个人电脑是WIN7,打算在测试服务器linux Red Hat系列下搭建集群,而后经过本机win7开发并联调MapReduce程序。因为内容比较多,这篇博文主要写理论和Hadoop伪集群/集群安装过程以及Eclipse的插件安装,后面有时间再写一篇Eclipse开发的DEMO以及如何经过hadoop分析的航空旅游业典型安全漏洞。git

下面主要写如下部分,理论知识描述可能会有误,主要是方便之后本身或别人参考:github

1、Hadoop版本介绍web

2、Hadoop名词理论介绍redis

3、SSH无密码登录Linuxapache

4、Hadoop单机安装ubuntu

5、Hadoop单机模式运行数组

6、Hadoop伪分布式部署

7、Hadoop集群部署

8、Eclipse插件安装

9、安装调试过程当中我遇到的问题

 

 

1、Hadoop版本介绍

Hadoop有1.x和2.x两个版本,参考别人官方一点的说法:Hadoop 1.x由一个分布式文件系统HDFS和一个离线计算框架MapReduce组成,HDFS由一个NameNode和多个DataNode组成,MapReduce由一个JobTracker和多个TaskTracker组成;而Hadoop 2.x则包含一个支持NameNode横向扩展的HDFS,一个资源管理系统YARN和一个运行在YARN上的离线计算框架MapReduce,YARN它将JobTracker中的资源管理和做业控制功能分开,分别由组件ResourceManager和ApplicationMaster实现,其中,ResourceManager负责全部应用程序的资源分配,而ApplicationMaster仅负责管理一个应用程序。

他们的架构作了较大调整,内部细节感兴趣能够去研究,但对开发人员最直观看到的就是配置文件的参数名称不同了,具体能够参考:

http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/

 

2、Hadoop名词理论介绍

系统角色:ResourceManager ,ApplicationMaster , NodeManager

应用名称:Job

组建接口:Mapper , Reducer

HDFS:Namenode ,Datanode

Hadop1.x时代系统角色有JobTracker和TaskTracker的概念,Hadoop2.X时代用Yarn替换了这两个角色。TaskTracker 是 Map-reduce 集群中每台机器都有的一个部分,他作的事情主要是监视本身所在机器的资源状况。TaskTracker 同时监视当前机器的 tasks 运行情况。TaskTracker 须要把这些信息经过 heartbeat 发送给 JobTracker,JobTracker 会搜集这些信息以给新提交的 job 分配运行在哪些机器上。

ResourceManager 是一个中心的服务,它作的事情是调度、启动每个 Job 所属的 ApplicationMaster、另外监控 ApplicationMaster 的存在状况

NodeManager 功能比较专注,就是负责 Container 状态的维护,并向 ResourceManager 保持心跳。

ApplicationMaster 负责一个 Job 生命周期内的全部工做,相似老的框架中 JobTracker。但注意每个 Job(不是每一种)都有一个 ApplicationMaster,它能够运行在 ResourceManager 之外的机器上。

NameNode能够看做是分布式文件系统中的管理者,主要负责管理文件系统的命名空间、集群配置信息和存储块的复制等。NameNode会将文件系统的Meta-data存储在内存中,这些信息主要包括了文件信息、每个文件对应的文件块的信息和每个文件块在DataNode的信息等。

Datanode是文件系统的工做节点,他们根据客户端或者是namenode的调度存储和检索数据,而且按期向namenode发送他们所存储的块(block)的列表。

hadoop系统中,master/slaves的通常对应关系是:
master---NameNode;ResourceManager ;
slaves---Datanode;NodeManager
在MapReduce中,一个准备提交执行的应用程序称为“做业(job)”,而从一个做业划分出的运行于各个计算节点的工做单元称为“任务(task)”。

Mapper任务运行时,它把输入文件切分红行并把每一行提供给可执行文件进程的标准输入传到map函数。 同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,做为mapper的输出。 其中key的值为距离文件第0个字符的距离,value为该行的值。

Reducer类中reduce函数接受Map函数组装的key/value,其中key为Map输出的键,values是各个键对应的数据集合。

 

3、SSH无密码登录Linux

Ssh链接linux服务器,除了用帐户密码链接,还提供经过公钥私钥配对登陆的方式,这里让SSH无密码登陆Linux,主要是为了方便Hadoop的Master直接链接各个Slave机器。所以建立SSH无密码登陆Linux和Hadoop的功能没有关系,建立方式能够参考:

cd ~/.ssh/ #进入当前用户主目录下的.ssh文件夹下

rm ./id_rsa*  #先删除已经存在的id_rsa开头的公钥文件,可能没有

ssh-keygen -t rsa  #建立公钥文件,有提示,所有按肯定便可

cat ./id_rsa.pub >> ./authorized_keys #把生成的id_rsa.pub公钥文件内容追加到当前目录下authorized_keys文件

  

建立公钥文件完成,测试能够试试:

ssh Master #Master为当前机器名,或ssh 当前ip。若是不须要输入密码,则说明成功

  

而后执行:

scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/  #这条指令执行有前提,须要有一台Slave1的机器,而且当前机器Hosts对Slave1机器作了IP 机器猫映射,而且Slave1机器有一个用户名hadoop,而且用户的文件目录是/home/hadoop/。这条指令意思是把当前机器所属用户主目录下.ssh文件夹下的id_rsa.put公钥文件复制到远程机器Slave1的/home/hadoop目录下,而且访问远程机器的用户名是hadoop。

  

输入该指令后会要求输入Slave1机器hadoop用户的密码,输入成功后则会把id_rsa.pub文件传递到Slave1机器上。好比会有显示:

id_rsa.pub                                    100%  391     0.4KB/s   00:00 

  

而后再Slave1上把Master机器的公钥文件放到用户主目录的/.ssh/authorized_keys文件里,在Slave1上操做的命令以下:

mkdir ~/.ssh #若是不存在则先建立

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

rm ~/id_rsa.pub    #复制完就能够删掉了

  

 

如今在Master机器上测试,由于把Master上生成的公钥文件放到Slave1机器hadoop用户的制定位置,就能够免密码登陆Slave1机器了。

[hadoop@Master .ssh]$ ssh Slave1

[hadoop@Slave1 ~]$ exit  #显示不用密码已经进入了Slave1机器,exit回到Master机器

logout

Connection to Slave1 closed.

[hadoop@Master .ssh]$   #显示回到了Master机器

  

 

SSH无密码登录Linux就完成了。

前段时间Redis未受权访问(就是无密码)致使能够远程链接Redis后修改Redis持久文件,并写入公钥文件到特定目录,致使能够远程无密码链接到ssh,就是能够经过这样配置公钥,并经过redis写入特定目录。

 

4、Hadoop单机安装

单机模式我在一台测试服务器172.26.5.187上作的测试,把187服务器的主机名修改成Master,并修改Hosts文件机器名和IP映射,须要用root去执行命令:

vi /etc/sysconfig/network

  

修改:HOSTNAME=Master

vi /etc/hosts

172.26.5.187 Master

  

 

而后在187服务器上建立一个hadoop用户:

useradd -m hadoop -s /bin/bash 建立hadoop用户,-m建立主目录 -s /bin/bash 指定用户的登陆Shell

passwd hadoop

mima.. #修改设置hadoop密码

usermod -g root hadoop #加入root组

   

经过http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.6.3/hadoop-2.6.3.tar.gz 镜像地址下载2.6.3版本。

把hadoop安装到/usr/local/hadoop下,把hadoop-2.6.3.tar.gz放到/usr/local目录,执行命令:

rm -rf /usr/local/hadoop    # 删掉旧的(若是存在)

tar -zxf ~/hadoop-2.6.3.tar.gz -C /usr/local

  

把文件夹修改成hadoop,执行命令,修改文件夹所属用户和组:

chown -R hadoop:hadoop /usr/local/hadoop

  

而后用hadoop登陆后执行:

cd /usr/local/hadoop

./bin/hadoop version

  

输出结果:

[hadoop@Master hadoop]$ ./bin/hadoop version

Hadoop 2.6.3

Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r cc865b490b9a6260e9611a5b8633cab885b3d247

Compiled by jenkins on 2015-12-18T01:19Z

Compiled with protoc 2.5.0

From source with checksum 722f77f825e326e13a86ff62b34ada

This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.6.3.jar

  

表示安装成功

 

5、Hadoop单机模式运行

把hadoop-2.6.3.tar.gz解压到187服务器:/usr/local/hadoop后,执行命令:

mkdir ./input

cp ./etc/hadoop/*.xml ./input

  

直接测试自带的jar包程序,从input文件夹下的文件分析含有dfs..正则的字符串,若是有就输出到output文件夹:

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

  

发现会有报错,大意是说权限不够,执行命令:

chmod -R 744 ./bin/  #改变当前目录读写权限

  

再次执行:

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

  

执行后输出一串......

        File Input Format Counters 

                Bytes Read=123

        File Output Format Counters 

                Bytes Written=23

..........

  

说明执行成功,查看:

[hadoop@p5 hadoop]$ cat ./output/*

1       dfsadmin

  

这里的数据实际为part-r-00000的内容

[hadoop@p5 hadoop]$ ls output

part-r-00000  _SUCCESS

  

注意,Hadoop 默认不会覆盖结果文件,所以再次运行上面实例会提示出错,须要先将 ./output 删除。

rm -r ./output

  

单机模式运行成功。

 

6、Hadoop伪分布式部署

首先进入到/usr/local/hadoop下:

[hadoop@Master hadoop]$ pwd

/usr/local/hadoop

  

修改core-site.xml和hdfs-site.xml配置文件,执行:

vi ./etc/hadoop/core-site.xml 

<configuration>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>file:/usr/local/hadoop/tmp</value>

        <description>Abase for other temporary directories.</description>

    </property>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://172.26.5.187:9000</value>

    </property>

</configuration>

 

vi ./etc/hadoop/hdfs-site.xml

<configuration>

    <property>

        <name>dfs.replication</name>

        <value>1</value>

    </property>

    <property>

        <name>dfs.namenode.name.dir</name>

        <value>file:/usr/local/hadoop/tmp/dfs/name</value>

    </property>

    <property>

        <name>dfs.datanode.data.dir</name>

        <value>file:/usr/local/hadoop/tmp/dfs/data</value>

    </property>

</configuration>

  

配置完成后,执行 NameNode 的格式化(只执行一次便可,之后不须要执行了):

./bin/hdfs namenode -format

  

成功的话,会看到 “successfully formatted” 和 “Exiting with status 0″ 的提示,若为 “Exiting with status 1″ 则是出错。

开启 NaneNode 和 DataNode 守护进程:

[hadoop@Master hadoop]$ ./sbin/start-dfs.sh

  

可能会报错:

bash: ./sbin/start-dfs.sh: 权限不够

执行命令,添加执行权限:

chmod -R 744 ./sbin

  

再执行./sbin/start-dfs.sh可能还会报错:

localhost: Error: JAVA_HOME is not set and could not be found.

执行下面命令解决:

[hadoop@Master hadoop]$ vi ./etc/hadoop/hadoop-env.sh

  

新增:

export JAVA_HOME=/usr/java/jdk1.6.0_38

  

这里设置Jdk的路径

再次执行:

[hadoop@p5 hadoop]$ ./sbin/start-dfs.sh

16/01/06 16:05:50 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Starting namenodes on [localhost]

  

能够忽略,并不会影响正常使用。

Jps查看当前java进程状况:

[hadoop@p5 hadoop]$ jps

25978 Jps

25713 DataNode

25876 SecondaryNameNode

25589 NameNode

  

若是缺乏任何一个进程,都表示启动失败,须要./sbin/stop-dfs.sh中止后,检查/usr/local/hadoop/logs/hadoop-hadoop-XXX-Master.log对应XXX名称的日志

浏览器输入:http://172.26.5.187:50070/ 可访问了

 

下面在伪分布式下运行一个自带的demo实例:

首先建立HTFS用户目录和input文件夹:

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

./bin/hdfs dfs -mkdir input

./bin/hdfs dfs -put ./etc/hadoop/*.xml input  #复制当前目录下/etc/hadoop/下的全部xml文件到HTFS的input目录里,

  

经过下面指令查看复制过去的文件夹:

./bin/hdfs dfs -ls input

  

执行刚才单机版的测试jar包程序:

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

  

执行后输出一串..

        File Input Format Counters 

                Bytes Read=219

        File Output Format Counters 

                Bytes Written=77

  

查看HDFS里output文件夹:

./bin/hdfs dfs -cat output/*

1       dfsadmin

1       dfs.replication

1       dfs.namenode.name.dir

1       dfs.datanode.data.dir

  

截图是以前没有修改hostname,因此机器名仍是p5。

 

发现已找到多个字符串,能够把HDFS里的文件取回到output文件夹:

rm -r ./output    # 先删除本地的 output 文件夹(若是存在)

./bin/hdfs dfs -get output ./output     # 将 HDFS 上的 output 文件夹拷贝到本机

cat ./output/*  #查看当前用户目录下的output文件夹下内容

  

这里伪分布式程序就运行完成了。

 

上述经过 ./sbin/start-dfs.sh 启动 Hadoop,仅仅是启动了 MapReduce 环境,咱们能够启动 YARN ,让 YARN 来负责资源管理与任务调度。

修改文件:

mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml

[hadoop@p5 hadoop]$ vi ./etc/hadoop/mapred-site.xml

<configuration>

    <property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>

</configuration>

 

[hadoop@p5 hadoop]$ vi ./etc/hadoop/yarn-site.xml

<configuration>

    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

        </property>

</configuration>

 

  

执行命令:

./sbin/start-yarn.sh      # 启动YARN

./sbin/mr-jobhistory-daemon.sh start historyserver  # 开启历史服务器,才能在Web中查看任务运行状况

  

Jps查看:

[hadoop@Master hadoop]$ jps

27492 Jps

27459 JobHistoryServer

25713 DataNode

27013 ResourceManager

27283 NodeManager

25876 SecondaryNameNode

25589 NameNode

  

启动成功后能够在 http://172.26.5.187:8088/cluster 下查看任务运行状况了。

若是不想启动 YARN,务必把配置文件 mapred-site.xml 重命名,改为 mapred-site.xml.template

关闭 YARN 的脚本以下:

./sbin/stop-yarn.sh

./sbin/mr-jobhistory-daemon.sh stop historyserver

   

7、Hadoop集群部署

使用172.26.5.187 作Master和172.26.5.20 作Slave 测试

先187上操做:

[hadoop@Master ~]$ su root

  

密码:

[root@p5 hadoop]# vi /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=p5

  

修改:HOSTNAME=Master

再修改hosts文件

[root@p5 hadoop]# vi /etc/hosts

172.26.5.187 Master

172.26.5.20 Slave1

   

而后在20服务器上操做:

useradd -m hadoop -s /bin/bash 建立hadoop用户,-m建立主目录 -s /bin/bash 指定用户的登陆Shell

passwd hadoop

mima...

usermod -g root hadoop

  

而后root权限下:

[root@Slave1 ~]# vi /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=p2

  

修改:HOSTNAME=Slave1

[root@Slave1 ~]# vi /etc/hosts

172.26.5.20 Slave1

172.26.5.187 Master

  

 

测试:

ping Master -c 3 

ping Slave1 -c 3

  

187和20都能ping通说明配置没有问题了。

 

187 Master上操做(单机模式下已操做过):

cd ~/.ssh 

rm ./id_rsa*

ssh-keygen -t rsa       # 一直按回车就能够

cat ./id_rsa.pub >> ./authorized_keys

  

完成后可执行 ssh Master 验证一下(可能须要输入 yes,成功后执行 exit 返回原来的终端)。接着在 Master 节点将上公匙传输到 Slave1 节点:

scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/

  

输入完成后会提示传输完毕,以下图所示:

id_rsa.pub                                    100%  391     0.4KB/s   00:00 

   

接着在 Slave1  172.26.5.20节点上,将 ssh 公匙加入受权:

mkdir ~/.ssh       # 若是不存在该文件夹需先建立,若已存在则忽略

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

rm ~/id_rsa.pub    # 用完就能够删掉了

  

 

172.26.5.187上测试无密码链接20服务器:

[hadoop@Master .ssh]$ ssh Slave1

[hadoop@Slave1 ~]$ exit  #exit回到187服务器

logout

Connection to Slave1 closed.

[hadoop@Master .ssh]$ 

   

187上执行:

[hadoop@Master .ssh]$ vi ~/.bashrc

export PATH=$PATH:/usr/local/hadoop/bin:usr/local/hadoop/sbin

  

修改187配置文件:

[hadoop@Master .ssh]$ cd  /usr/local/hadoop/etc/hadoop

[hadoop@Master hadoop]$ vi slaves

  

删除localhost,新增一行:Slave1

文件 slaves,将做为 DataNode 的主机名写入该文件,每行一个。

 

187上cd到 /usr/local/hadoop/etc/hadoop目录,修改配置文件:

vi core-site.xml

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://Master:9000</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>file:/usr/local/hadoop/tmp</value>

        <description>Abase for other temporary directories.</description>

    </property>

</configuration>

vi hdfs-site.xml

<configuration>

    <property>

        <name>dfs.namenode.secondary.http-address</name>

        <value>Master:50090</value>

    </property>

    <property>

        <name>dfs.replication</name>

        <value>1</value>

    </property>

    <property>

        <name>dfs.namenode.name.dir</name>

        <value>file:/usr/local/hadoop/tmp/dfs/name</value>

    </property>

    <property>

        <name>dfs.datanode.data.dir</name>

        <value>file:/usr/local/hadoop/tmp/dfs/data</value>

    </property>

</configuration>

vi mapred-site.xml

<configuration>

    <property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>

    <property>

        <name>mapreduce.jobhistory.address</name>

        <value>Master:10020</value>

    </property>

    <property>

        <name>mapreduce.jobhistory.webapp.address</name>

        <value>Master:19888</value>

    </property>

</configuration>

vi yarn-site.xml

<configuration>

    <property>

        <name>yarn.resourcemanager.hostname</name>

        <value>Master</value>

    </property>

    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>

</configuration>

 

cd /usr/local

rm -rf ./hadoop/tmp     # 删除 Hadoop 临时文件

rm -rf ./hadoop/logs/*   # 删除日志文件

   

而后把187上修改了配置文件后的hadoop文件夹压缩后发送到Slave机器上,这里上传到20服务器。

tar -zcf ~/hadoop.master.tar.gz ./hadoop   # 先压缩到用户主目录下

cd ~

[hadoop@Master ~]$ scp ./hadoop.master.tar.gz Slave1:/home/hadoop  #再复制到Salve1

hadoop.master.tar.gz                          100%  187MB  11.0MB/s   00:17 

  

复制完成后,到Slave1 20服务器上操做:

rm -rf /usr/local/hadoop    # 删掉旧的(若是存在)

tar -zxf ~/hadoop.master.tar.gz -C /usr/local

chown -R hadoop:hadoop /usr/local/hadoop 

   

而后在187上start启动:

[hadoop@Master hadoop]$ ./sbin/start-dfs.sh

./sbin/start-yarn.sh      # 启动YARN

./sbin/mr-jobhistory-daemon.sh start historyserver  # 开启历史服务器,才能在Web中查看任务运行状况

  

执行后可能会报错:

namenode进程启动不了,报错:Storage directory /usr/local/hadoop/tmp/dfs/name does not exist,须要从新格式化namenode。

在187上执行:hdfs namenode -format

而后须要关闭187和20服务器的防火墙,不然会致使端口访问不通,莫名其妙的错误:

[hadoop@Master local]$ service iptables stop

[hadoop@Slave1 local]$ service iptables stop

   

再次187上start启动后,而后在187上查询以下:

[hadoop@Master hadoop]$ hdfs dfsadmin -report

16/01/21 17:55:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Configured Capacity: 52844687360 (49.22 GB)

Present Capacity: 44751773696 (41.68 GB)

DFS Remaining: 44741738496 (41.67 GB)

DFS Used: 10035200 (9.57 MB)

DFS Used%: 0.02%

Under replicated blocks: 7

Blocks with corrupt replicas: 0

Missing blocks: 0

 

-------------------------------------------------

Live datanodes (1):

 

Name: 172.26.5.20:50010 (Slave1)

Hostname: Slave1

Decommission Status : Normal

Configured Capacity: 52844687360 (49.22 GB)

DFS Used: 10035200 (9.57 MB)

Non DFS Used: 8092913664 (7.54 GB)

DFS Remaining: 44741738496 (41.67 GB)

DFS Used%: 0.02%

DFS Remaining%: 84.67%

Configured Cache Capacity: 0 (0 B)

Cache Used: 0 (0 B)

Cache Remaining: 0 (0 B)

Cache Used%: 100.00%

Cache Remaining%: 0.00%

Xceivers: 1

Last contact: Thu Jan 21 17:55:44 CST 2016

  

若是显示Live datanodes (1)表示有 1 个 Datanodes,表示启动成功。

在这个过程当中,可能还会出现问题:

好比20服务器上DataNode和NodeManager进程启动成功后自动死亡,查看日志报错:

Caused by: java.net.UnknownHostException: p2: p2...

说明多是机器名没有修改为功,推出shh,从新链接后修改/etc/sysconfig/network里的HOSTNAME值便可。

最后启动服务在187上查看:

[hadoop@Master hadoop]$ jps

10499 ResourceManager

10801 Jps

10770 JobHistoryServer

10365 SecondaryNameNode

10188 NameNode

   

20上查看:

[hadoop@Slave1 ~]$ jps

4977 NodeManager

5133 Jps

4873 DataNode

  

表示启动成功了。

 

下面在集群上执行刚才测试过的自带demo程序:

187服务器执行:(若是再次执行,须要先删除:./bin/hdfs dfs -rm -r output    # 删除 output 文件夹)

hdfs dfs -mkdir -p /user/hadoop

hdfs dfs -mkdir input

hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input

[hadoop@Master hadoop]$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

  

可能会报错:java.net.NoRouteToHostException: No route to host

这时须要确保187和20服务器防火墙是否关闭,root权限下查看防火墙:

service iptables status

须要保证用root帐户关闭防火墙:service iptables stop

在187上执行:

[hadoop@Master hadoop]$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input

[hadoop@Master hadoop]$ ./bin/hdfs dfs -rm -r output

[hadoop@Master hadoop]$ ./bin/hdfs dfs -ls input

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

     

集群测试成功!

 

8、Eclipse插件安装

要在 Eclipse 上编译和运行 MapReduce 程序,须要安装 hadoop-eclipse-plugin,https://github.com/winghc/hadoop2x-eclipse-plugin这里有源代码和release目录下打好包的hadoop-eclipse-plugin-2.6.0.jar等3个版本的jar包。我是经过其余渠道下载的hadoop-eclipse-plugin-2.6.3.jar版本的插件,安装到MyEclipse里。

在MyEclipse里window->Preferences->Hadoop Map/Reduce,Hadoop installation directory选择到win7本地的Hadoop文件夹,好比我吧Hadoop解压后放到:D:\hadoop-2.6.3里。

Window->Show View->Other选择Map/Reduce,在面板中单击右键,选择 New Hadoop Location,在General选项里,由于以前fs.defaultFS的值设置为hdfs://172.26.5.187:9000,因此DFS Master 的 Port 写为9000,Location Name随便写,好比我写成187Hadoop,Map/Reduce(V2) Master的Host写172.26.5.187。最后点击Finish则完成配置。

配置完成后Project Explorer 中有DFS Location。双击下面的187Hadoop则可查看187集群下的HDFS文件了。

但经过WIN7链接远程linux的Hadoop集群会报错,好比后面Myeclipse用程序执行程序,可能会报以下错:

.....................................

INFO client.RMProxy: Connecting to ResourceManager at Master/172.26.5.187:8032

INFO mapreduce.JobSubmitter: Cleaning up the staging area /tmp/hadoop-yarn/staging/SL/.staging/job_1452581976741_0001

Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=SL, access=EXECUTE, inode="/tmp":hadoop:supergroup:drwxrwx---

at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271)

......................

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=SL, access=EXECUTE, inode="/tmp":hadoop:supergroup:drwxrwx---

at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271)

..........................

  

经过查看,user=SL,SL是我当前WIN7登陆的用户名,网上介绍有几种解决方案,我用了最简单的解决方案,配置WIN7系统环境变量:HADOOP_USER_NAME=hadoop便可。

 

 

9、安装调试过程当中我遇到的问题

问题在上面每一个步骤都写了,这里再汇总一下:

一、每次执行MapReduce程序须要删除输出目录,好比:

须要先删除:./bin/hdfs dfs -rm -r output    # 删除 output 文件夹

 

二、报错:java.net.NoRouteToHostException: No route to host

解决:多是防火墙没有关闭,致使网络访问链接问题。须要关闭集群全部服务器防火墙:service iptables stop(注意这里是直接关闭防火墙,生成环境最好针对端口开放特定访问权限)

 

三、执行./sbin/start-dfs.sh报错:localhost: Error: JAVA_HOME is not set and could not be found.

解决:i ./etc/hadoop/hadoop-env.sh,新增:

export JAVA_HOME=/usr/java/jdk1.6.0_38

 

四、./sbin/start-dfs.sh执行后,若是“NameNode”、”DataNode” 、“SecondaryNameNode”进程没有启动成功,则查看对应/usr/local/hadoop/logs/目录下的日志。

 

五、/etc/hadoop/core-site.xml文件里fs.defaultFS若是配置为hdfs://localhost:9000等,有可能致使9000端口其余服务器不能telnet,致使莫名其妙的问题。

解决:经过在187上执行:netstat -ntl,查看到好比以下:

tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN   

  

说明9000端口被127.0.0.1监听,致使只能本机能链接9000端口,其余服务器不能链接,若是是:

tcp        0      0 0.0.0.0:9000              0.0.0.0:*                   LISTEN

  

则表示任何机器均可以链接9000端口。

 

六、Myeclipse链接DFS Locations下的Hadoop集群报错:An internal error occurred during: "Map/Reduce location status updater".

187上cd到/usr/local/hadoop下执行:./bin/hdfs dfs -mkdir -p /user/root/input

./bin/hdfs dfs -mkdir -p /user/root/output,这里还多是插件包问题或系统环境变量HADOOP_USER_NAME没有设置为Master机器链接的用户名。

 

如需转载,请注明来自:http://lawson.cnblogs.com 

相关文章
相关标签/搜索