Hadoop开发入门与实践(二)
一、Linux Hadoop环境开发
(一)安装JDK
1、下载Oracle JDK安装文件
[root@localhost ~]# wget http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.tar.gz
2、解压下载文件
(1)创建Java目录
[root@localhost ~]# mkdir /usr/java
(2)解压文件
创建Java目录:
[root@localhost ~]# mkdir /usr/java
[root@localhost ~]# tar zxvf jdk-8u151-linux-x64.tar.gz -C /usr/java
3、配置环境变量
[root@localhost ~]# vi /etc/profile
在文件结尾添加:
export JAVA_HOME=/usr/java/jdk1.8.0_151
export PATH=PATH:JAVA_HOME/bin
4、验证测试
[root@localhost ~]# echo $JAVA_HOME
[root@localhost ~]# java –version
(二)Hadoop布署方式
Hadoo部署模式有:本地模式、伪分布模式、完全分布式模式。
区分的依据是 NameNode、DataNode、ResourceManager、NodeManager 等模块运行在几个JVM 进程、几个机器。
模式名称 | 各模块占用的JVM进程数 | 各模块运行机器数 |
本地模式 | 1 个 | 1 个 |
伪分布式模式 | N 个 | 1 个 |
集群模式 | N 个 | N 个 |
1、Hadoop下载:
[root@localhost ~]# curl -O http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz
2、解压文件
(1) 目录创建hadoop目录
[root@localhost /]# mkdir /hadoop
(2) 解压文件:
[root@localhost hadoop]# tar -zxvf hadoop-2.7.4.tar.gz -C /hadoop
3、目录结构
目录 | 文件 | 说明 |
bin | 存放的可执行脚本,所有的用户都有执行的权限 | |
sbin | start-dfs.sh | 只有超级用户(superuser)才有权限执行的脚本 |
start-yarn.sh | 只有超级用户(superuser)才有权限执行的脚本 | |
stop-dfs.sh | 只有超级用户(superuser)才有权限执行的脚本 | |
stop-yarn.sh | 只有超级用户(superuser)才有权限执行的脚本 | |
etc | core-site.xml | 配置文件,common |
hdfs-site.xml | 配置文件, hdfs | |
mapred-site.xml | 配置文件, mapreduce(yarn)的配置信息。 | |
include | C语言接口开发用到的头文件 | |
lib | 库文件 | |
share | 存放的是doc文档和最重要的Hadoop源代码编译生成的jar包文件。 | |
libexec | 目录下存放的是hadoop的配置脚本 | |
logs | 日志文件 |
(三)独立模式(standalone或local mode)
本地模式是最简单的模式,所有模块都运行与一个JVM 进程中,使用的本地文件系统,而不是HDFS,本地模式主要是用于本地开发过程中的运行调试用。下载hadoop 安装包后不用任何设置,默认的就是本地模式。
1、运行MapReduce程序测试:
(1)用hadoop自带的 wordcount 例子来在本地模式下测试跑mapreduce:
创建目录:data:
准备mapreduce输入文件wordcount.txt
hello
hbase
spark
storm
sqoop
hadoop
hive
spark
hadoop
world
(2)运行测试
[root@localhost hadoop-2.7.4]#./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /root/wordcount.txt output
这里可以看到 job ID 中有 local 字样,说明是运行在本地模式下的。
本地模式下,mapreduce的输出是输出到本地。
[root@localhost hadoop-2.7.4]# ll output
总用量 4
-rw-r–r–. 1 root root 53 12月 12 08:02 part-r-00000
-rw-r–r–. 1 root root 0 12月 12 08:02 _SUCCESS
输出目录中有_SUCCESS 文件说明 JOB 运行成功,part-r-00000 是输出结果文件。
part-r-0000这个文件时存放在hdfs上的,并非本地文件系统。
(3)查看输出结果:
[root@localhost hadoop-2.7.4]# cat output/*
(四)伪分布模式
1、修改配置文件:
(1)配置Hadoop环境变量
[root@localhost hadoop-2.7.4]# vi /etc/profile
追加内容:
export HADOOP_HOME=/hadoop/hadoop-2.7.4
export PATH=PATH:JAVA_HOME/bin:HADOOPHOME/bin:HADOOP_HOME/sbin
(2) 环境验证:
root@localhost /]# source /etc/profile
[root@localhost hadoop-2.7.4]# echo $HADOOP_HOME
/hadoop/hadoop-2.7.4
(3) 修改hadoop-env.hs中的Java环境变量:
export JAVA_HOME=/usr/java/jdk1.8.0_151
[root@localhost hadoop-2.7.4]# vi etc/hadoop/hadoop-env.sh
(4) 核心配置:core-site.xml
[root@localhost hadoop-2.7.4]# vi ${HADOOP_HOME}/etc/hadoop/core-site.xml
fs.defaultFS:用来指定HDFS的(NameNode)的地址:
Hadoop.tmp.dir:用来指定Hadoop运行时产生文件的存放目录
比如 HDFS 的 NameNode 数据默认都存放这个目录下, 查看*-default.xml等默认配置文件,就可以看到很多依赖${hadoop.tmp.dir}的配置。
默认hadoop.tmp.dir 是/tmp/hadoop-${user.name},此时有个问题就是 NameNode 会将 HDFS 的元 数据存储在这个/tmp目录下,如果操作系统重启了,系统会清空/tmp 目录下的东西,导致 NameNode 元数据丢失,是个非常严重的问题,所有我们应该修改这个路径。
添加:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoopmaster:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/hadoop-2.7.4/tmp</value>
</property>
</configuration>
注意:
一定要修改主机名与之对应。
[root@localhost ~]# vi /etc/hosts
添加:
192.168.191.141 hadoopmaster
(5) 创建临时目录:
[root@localhost hadoop-2.7.4]# mkdir tmp
(6) HDFS配置文件:hdfs-site.xml
[root@localhost hadoop-2.7.4]# vi ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
fs.replicatio:指定hdfs保存数据副本的数量:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
(7) 格式化 HDFS
[root@localhost hadoop-2.7.4]# ./bin/hdfs namenode -format
格式化是对 HDFS这个分布式文件系统中的DataNode 进行分块,统计所有分块后的初始元数据的存储在NameNode中。
格式化后,查看core-site.xml 里 hadoop.tmp.dir指定的目录下是否有了dfs目录,如果有,说明格式化成功。
fsimage是NameNode元数据在内存满了后,持久化保存到的文件。
fsimage*.md5是校验文件,用于校验 fsimage 的完整性。
seen_txid是 hadoop 的版本.
[root@localhost hadoop-2.7.4]# cat /hadoop/hadoop-2.7.4/tmp/dfs/name/current/VERSION
vession文件里保存:
namespaceID:NameNode 的唯一ID。
clusterID:集群ID,NameNode 和 DataNode的集群ID应该一致,表明是一个集群。
(8) mapreduce配置:
在etc/hadoop目录下:mapred-site.xml
将:mapred-site.xml.template 改为:mapred-site.xml
[root@localhost hadoop]# cp mapred-site.xml.template mapred-site.xml
指定 mapreduce 运行在 yarn 框架上。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(9) Yarn配置yarn-site.xml
[root@localhost hadoop]# vi yarn-site.xml
yarn.nodemanager.aux-services:nodemanager获取数据的方式是shuffle
yarn:指定yarn的主机服务器地址
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoopmaster</value>
</property>
</configuration>
yarn.nodemanager.aux-services
配置了 yarn 的默认混洗方式,选择为 mapreduce 的默认混洗算法。
yarn.resourcemanager.hostname 指定了 Resourcemanager 运行在哪个节点上。
Yarn是一个资源调度系统。
2、hadoop初始化和测试
(1) 初始化文HDFS(格式化文件系统)
查找hadoop临时目录命令
[root@localhost hadoop]# which hadoop
/usr/hadoop/hadoop-2.7.4/bin/hadoop
(2) 启动HDFS和YARN
A. 启动NameNode
[root@localhost hadoop]# ${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
[root@localhost hadoop]# jps
B. 启动DataNode
[root@localhost hadoop]# ${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
[root@localhost hadoop]# jps
C. 启动SecondaryNameNode
[root@localhost hadoop]# ${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode
(3) start-all.sh启动所有节点:
[root@localhost hadoop]# start-all.sh
[root@localhost sbin]# ./start-all.sh
[root@localhost sbin]# jps
NodeManager:数据节点
SecondaryNameNode:辅助NameNode
(4) 启动Resourcemanager
需配置Yarn
[root@localhost hadoop]# ${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager
(5) 浏览器访问管理:
namenode管理界面:hdfs
资源管理:
YARN 的 Web 页面
http://192.168.191.141:8088