共计 17800 个字符,预计需要花费 45 分钟才能阅读完成。
近期为了分析国内航空旅游业常见安全漏洞,想到了用大数据来分析,其实数据也不大,只是生产项目没有使用 Hadoop,因此这里实际使用一次。
先看一下通过 hadoop 分析后的结果吧,最终通过 hadoop 分析国内典型航空旅游业厂商的常见安全漏洞个数的比例效果如下:
第一次正式使用 Hadoop,肯定会遇到非常多的问题,参考了很多网络上的文章,我把自己从 0 搭建到使用的过程记录下来,方便以后自己或其他人参考。
之前简单用过 storm,适合实时数据的处理。hadoop 更偏向静态数据的处理,网上很多 hadoop 的教程,但有的版本比较老:比如有的是属于 hadoop1.x 时代,有的本机是 Ubuntu 上安装,有的介绍理论,有的直接介绍代码 demo。我的电脑是 WIN7,打算在测试服务器 linux Red Hat 系列下搭建集群,然后通过本机 win7 开发并联调 MapReduce 程序。由于内容比较多,这篇博文主要写理论和 Hadoop 伪集群 / 集群安装过程以及 Eclipse 的插件安装,后面有时间再写一篇 Eclipse 开发的 DEMO 以及如何通过 hadoop 分析的航空旅游业典型安全漏洞。
下面主要写以下部分,理论知识描述可能会有误,主要是方便以后自己或别人参考:
一、Hadoop 版本介绍
二、Hadoop 名词理论介绍
三、SSH 无密码登陆 Linux
四、Hadoop 单机安装
五、Hadoop 单机模式运行
六、Hadoop 伪分布式部署
七、Hadoop 集群部署
八、Eclipse 插件安装
九、安装调试过程中我遇到的问题
一、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 仅负责管理一个应用程序。
他们的架构做了较大调整,内部细节感兴趣可以去研究,但对开发人员最直观看到的就是配置文件的参数名称不一样了。
二、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 是各个键对应的数据集合。
三、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 写入特定目录。
四、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 目录,执行命令:
1
2
3
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
表示安装成功
五、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/*
dfsadmin
这里的数据实际为 part-r-00000 的内容
[hadoop@p5 hadoop]$ ls output
part-r-00000 _SUCCESS
注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。
rm -r ./output
单机模式运行成功。
六、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/*
- dfsadmin
- dfs.replication
- dfs.namenode.name.dir
- 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
七、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.]+’
集群测试成功!
八、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 即可。
九、安装调试过程中我遇到的问题
问题在上面每个步骤都写了,这里再汇总一下:
1、每次执行 MapReduce 程序需要删除输出目录,比如:
需要先删除:./bin/hdfs dfs -rm -r output # 删除 output 文件夹
2、报错:java.net.NoRouteToHostException: No route to host
解决:可能是防火墙没有关闭,导致网络访问连接问题。需要关闭集群所有服务器防火墙:service iptables stop(注意这里是直接关闭防火墙,生成环境最好针对端口开放特定访问权限)
3、执行./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
4、./sbin/start-dfs.sh 执行后,如果“NameNode”、”DataNode”、“SecondaryNameNode”进程没有启动成功,则查看对应 /usr/local/hadoop/logs/ 目录下的日志。
5、/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 端口。
6、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 机器连接的用户名。
下面关于 Hadoop 的文章您也可能喜欢,不妨看看:
Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程 http://www.linuxidc.com/Linux/2015-02/113487.htm
CentOS 安装和配置 Hadoop2.2.0 http://www.linuxidc.com/Linux/2014-01/94685.htm
Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-01/127715.htm