1 安装hadoop
1.1 将hadoop导入到/opt/software中
- 我使用xftp实现文件上传
1.2 安装hadoop
- 解压
tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
1.3 添加hadoop环境变量
- 在
/etc/profile.d/env.sh
中添加hadoop环境变量
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
- 使配置文件生效
source /etc/profile.d/env.sh
- 检查环境变量是否生效
hadoop version
1.4 hadoop的目录结构
2 hadoop集群配置
2.1 集群配置
2.1.2 集群部署规划
hadoop102 | hadoop103 | hadoop104 | |
---|---|---|---|
HDFS | ==NameNode== DataNode | DateNode | ==SecondaryNameNode== DataNode |
YARN | NodeManager | ==ResourceManager== NodeManager | NodeManager |
2.1.3 配置集群
需要配置的文件,在
/opt/module/hadoop-2.7.2/etc/hadoop
目录下- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- mapred-site.xml
- hadoop-env.sh
- yarn-env.sh
- mapred-env.sh
- slaves
2.1.3.1 核心配置文件 core-site.xml
- 修改
core-site.xml
vim core-site.xml
- 在
configuration
标签下添加如下配置
<!-- 指定 HDFS 中 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定 Hadoop 运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
2.1.3.2 HDFS配置文件 hadoop-env.sh/hdfs-site.xml
- 修改
hadoop-env.sh
vim hadoop-env.sh
- 修改jdk环境变量路径(25行)
export JAVA_HOME=/opt/module/jdk1.8.0_144
- 修改
hdfs-site.xml
vim hdfs-site.xml
- 在
configuration
标签下添加如下配置
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 指定 Hadoop 辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
2.1.3.3 YARN配置文件 yarn-env.sh/yarn-site.xml
- 修改
yarn-env.sh
vim yarn-env.sh
- 修改jdk环境变量路径(24行)
export JAVA_HOME=/opt/module/jdk1.8.0_144
- 修改
yarn-site.xml
vim yarn-site.xml
- 在
configuration
标签下添加如下配置
<!-- Reducer 获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 日志聚集功能 -->
<property>
<name>yarn.log-aggregation.enable</name>
<value>true</value>
</property>
<!-- 日志保留设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2.1.3.4 MapReduce配置文件 mapred-env.sh/mapred-site.xml
- 修改
mapred-env.sh
vim mapred-env.sh
- 修改jdk环境变量路径(16行)
export JAVA_HOME=/opt/module/jdk1.8.0_144
- 修改
mapred-site.xml
vim mapred-site.xml
- 在
configuration
标签下添加如下配置
<!-- 指定 MR 运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
2.1.3.5 修改slaves
- 添加集群主机名
vim slaves
hadoop102
hadoop103
hadoop104
2.1.4 集群单节点启动
- 如果集群时第一次启动,需要==格式化NameNode==,在
/opt/module/hadoop-2.7.2
目录下操作
hadoop namenode -format
- 在hadoop102中启动
NameNode
hadoop-daemon.sh start namenode
- 在hadoop102、hadoop103、hadoop104中分别启动
DataNode
hadoop-daemon.sh start datanode
- 使用
jps
查看节点启动情况
jps
2.1.5 SSH免密登陆配置
2.1.5.1 配置SSH
ssh 192.168.222.103
- 在询问是否connecting时,输入yes
2.1.5.2 无密钥配置
- 免密登陆原理
- 生成公钥和私钥,在
~/.ssh
目录下进行。敲3个回车
ssh-keygen -t rsa
- 将公钥拷贝到要免密登录的目标机器上
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
2.1.5.3 .ssh文件夹下文件功能解释
文件夹 | 功能 |
---|---|
known_hosts | 记录 ssh 访问过计算机的公钥(public key) |
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过得无密登录服务器公钥 |
2.1.6 编写集群分发脚本 xsync
2.1.6.1 scp(secure copy)安全拷贝
- scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
- 基本语法
命令 | 递归 | 要拷贝的文件路径/名称 | 目的用户@主机:目的路径/名称 |
---|---|---|---|
scp | -r | pdir/fname | user@hadoophost:pdir/fname |
- 实例
# 将 hadoop101 中/opt/module 目录下的软件拷贝到 hadoop102 上
scp -r /opt/module root@hadoop102:/opt/module
2.1.6.2 rsync远程同步工具
- rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
- ==rsync 和 scp 区别==:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更
新。scp 是把所有文件都复制过去。
基本语法
-r
:递归-v
:显示复制过程-l
:拷贝符号链接
命令 | 递归 | 要拷贝的文件路径/名称 | 目的用户@主机:目的路径/名称 |
---|---|---|---|
rsync | -rvl | pdir/fname | user@hadoophost:pdir/fname |
- 实例
#把 hadoop101 机器上的/opt/software 目录同步到 hadoop102 服务器的 root 用户 下的/opt/目录
rsync -rvl /opt/software/ root@hadoop102:/opt/software
2.1.6.3 xsync集群分发脚本 (~/bin/xsync)
- 需求:循环复制文件到所有节点的相同目录下
- 创建
vim xsync
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=103; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
- 修改脚本xsync,使具有执行权限
chmod 777 xsync
- 执行分发脚本,回到
/opt/module
目录
xsync hadoop-2.7.2/
2.1.7 群起集群
- 如果集群是第一次启动,需要格式化
NameNode
。==注意格式化之前,一定要先停 止上次启动的所有 namenode 和 datanode 进程,然后再删除 data 和 log 数据==。(/opt/module/hadoop-2.7.2
)
bin/hdfs namenode -format
启动命令
- ==注意:NameNode 和 ResourceManger 如果不是同一台机器,不能在 NameNode 上启 动 YARN,应该在 ResouceManager 所在的机器上启动 YARN。==
#老命令
sbin/start-all.sh
#新(推荐)
#启动HDFS
sbin/start-dfs.sh
#启动YARN
sbin/start-yarn.sh
- web端查看
NameNode
:http://hadoop102:50070/
2.1.8 集群基本测试
2.1.8.1 上传文件到集群
- 上传小文件(
/opt/module/hadoop-2.7.2
)
hdfs dfs -mkdir -p /user/ruki/input
hdfs dfs -put wcinput/wc.input /user/ruki/input
- 上传大文件
bin/hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/ruki/input
2.1.8.2 HDFS文件存放路径
/opt/module/hadoop-2.7.2/data/tmp/dfs/data
2.1.8.3 拼接
cat blk_1073741837>>tmp.file
2.1.8.4 下载
/opt/module/hadoop-2.7.2
bin/hadoop fs -get /user/atguigu/input/hadoop-2.7.2.tar.gz ./
2.1.9 集群启动/停止方式总结
2.1.9.1 各个组件逐一启动/停止
- HDFS
hadoop-daemon.sh start namenode/datanode/secondarynamenode
hadoop-daemon.sh stop namenode/datanode/secondarynamenode
- YARN
yarn-daemon.sh start / stop resourcemanager / nodemanager
2.1.9.2 各个模块启动/停止(配置ssh为前提)
- 整体启动/停止HDFS
start-dfs.sh
stop-dfs.sh
- 整体启动/定制YARN
start-yarn.sh
stop-yarn.sh
2.2 项目经验
2.2.1 HDFS存储多目录
- 在
hdfs-site.xml
文件中配置多目录,注意新挂载磁盘的访问权限问题。
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///hd2/dfs/ data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value>
</property>
开启目录数据均衡
/opt/module/hadoop-2.7.2
- 对于参数 10,代表的是集群中各个节点的磁盘空间利用率相差不超过 10%
bin/start-balancer.sh –threshold 10
- 停止数据均衡命令
bin/stop-balancer.sh
2.2.2 支持LZO压缩配置
- 将编译好的
hadoop-lzo-0.4.20.jar
放入hadoop-2.7.2/share/hadoop/common/
- 同步至hadoop103、hadoop104
xsync hadoop-lzo-0.4.20.jar
- 在
core-site.xml
新增配置 (/opt/module/hadoop-2.7.2/etc/hadoop
)
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
- 同步
core-site.xml
到 hadoop103、hadoop104
xsync core-site.xml
- 重启集群(
/opt/module/hadoop-2.7.2/bin
)
start-dfs.sh
stop-dfs.sh
2.2.3 LZO创建索引
- 创建 LZO 文件的索引,LZO 压缩文件的可切片特性依赖于其索引,故我们需要手动为 LZO 压缩文件创建索引。若无索引,则 LZO 文件的切片只有一个。
2.2.4.1 测试
- 将 bigtable.lzo(214M)上传到集群的根目录
hadoop fs -mkdir /input
hadoop fs -put bigtable.lzo /input
- 对上传的lzo文件上传索引
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /input/bigtable.lzo
- 执行wordcount
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output2
2.2.4 基准测试
2.2.4.1 HDFS写
- 写入10个128mb的文件
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
2.2.4.2 HDFS读
- 读取10个128mb的文件
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB
2.2.4.3 删除测试生成的数据
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.2-tests.jar TestDFSIO -clean
3 遇到的问题
3.1 NameNode没有启动成功
- 在hadoop102机器上使用
jps
命令,发现NameNode没有启动,导致无法使用hadoop命令 - 解决方式:Hadoop HDFS Namenode启动不成功