.ssh权限问题
1.~/.ssh/authorized_keys
644
2.$/.ssh
700
3.root
配置SSH
生成密钥对
$>ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
添加认证文件
$>cp id_rsa.pub authorized_keys
$>scp id_rsa.pub hadoop@dn1:~/.ssh/authorized_keys
权限设置,文件夹和文件除了自己以外别人不可写
$>chmod 700 ~/.ssh
$>chmod 644 ~/.ssh/authorized_keys
修改文件的用户以及用户组
sudo chown -R hadoop:hadoop /usr/
由于在设置权限的时候把/usr的权限设置成了我自己的账号,导致在我的用户下,su root的时候报错,这时候就需要进入root用户下把权限修改回来
chown root:root /bin/su
chmod 4755 /bin/su
完全分布式 (一个节点配置完成以后要分发到其他节点里面)
1.配置文件
- core-site.xml
fs.defaultFS=hdfs://nn1:8020/ - hdfs-site.xml
replication=1 //伪分布式
replication=3 //完全分布式 - mapred-site.xml
mapreduce.framework.name=yarn //框架 - yarn-site.xml
rm.name=nn1 //不同的主机这个名字不一样 - workers //数据节点 (hadoop3.0以前的名字是slaves)
dn1
dn2
dn3 - hadoop-env.sh
export JAVA_HOME=/soft/jdk
2.分发文件
1.ssh
- openssh-server //sshd
- openssh-clients //ssh
- openssh //ssh-keygen
2.scp/rsync
1. scp远程复制
- scp xxx root@dn1:/soft /hadoop
2. rsync远程同步,支持符号链接
- rsync -lr xxx xxx
3.格式化文件系统
$>hadoop namenode -format
hadoop集群在修改配置文件以后要经常重新format,为了format的时候不产生问题,需要删除/tmp以及hadoop目录下logs中的文件所以写了sh简单的shell脚本来执行
脚本写完以后要通过执行下面命令来赋予执行权限
chmod +x rmhadooplogs.sh
我创建了一个名称节点和三个数据节点
这个脚本放在名称节点的root目录下
#!/bin/sh
echo "清理开始"
cd /root
./rmNN1logs.sh
echo "nn清理完毕"
echo "dn1开始清理"
ssh root@dn1 "cd /root/;source rmDN1logs.sh"
echo "dn2开始清理"
ssh root@dn2 "cd /root/;source rmDN2logs.sh"
echo "dn3开始清理"
ssh root@dn3 "cd /root/;source rmDN3logs.sh"
echo "清理完毕"
三个数据节点的root目录下放单个的删除脚本
#!/bin/sh
cd /tmp
rm -rf *
echo "dn1中tmp目录清除完成"
cd /soft/hadoop/logs
rm -rf *
echo "soft/hadoop/logs目录清除完成"
4.启动hadoop所有进程
//start-dfs.sh + start-yarn.sh
$>start-all.sh
5.xcall.sh jps 编写简单的sh脚本来执行
xcall.sh
#!/bin/sh
params=$@
hosts=(nn1 dn1 dn2 dn3)
for host in ${hosts[@]}
do
echo =========== $host:$params=====
ssh $host "$params"
done
hosts中是你的主机名
param=$@ //脚本后面跟的参数 表示你要执行的命令
创建xcall.sh后,将文件拷贝到/usr/local/bin目录下,并且设置可以执行的权限,同时在/usr/local/bin目录下创建java与jps的链接
每个主机中都要这么添加链接
添加完毕以后运行命令,发现命令可以执行,就可以了
6.xsync.sh 分发文件(如果当前目录有这个文件会进行覆盖)
xsync.sh
#!/bin/sh
#1、获取输入参数的个数,如果没有参数,直接退出
params=$#
if((params==0))
then
echo no args
exit
fi
echo "params" ----$params
#2、获取文件名称
pl=$1
echo "pl"----$pl
fname=$(basename $pl)
#echo fname=$fname
#3、获取上级目录的绝对路径
pdir=$(cd -P $(dirname $pl);pwd)
#4、获取当前用户名称
user=$(whoami)
#5、循环
hosts=(nn1 dn1 dn2 dn3)
for host in ${hosts[@]}
do
echo ==========$host==========
rsync -rvl $pdir/$fname $user@$host:$pdir
echo -----$pdir/$fname $user@$host:$pdir------
done
同样的这个也要放到/usr/local/bin的目录下
可以通过rpm -qa|grep "rsync"
来确认每个主机是否安装,
通过yum -y install rsync
来进行安装,
下图是安装将文件分发到其它主机控制台打出的log
7.关闭centos的防火墙
sudo service firewalld stop // <=6.5 start/stop/status/restart
sudo systemctl stop firewalld //7.0
sudo systemctl disable firewalld //关闭
sudo systemctl enable firewalld //开启
符号链接
- 在/usr/local/bin创建java和jps链接的时候是root用户,现在改成了hadoop用户,想要把用户和用户组改成hadoop
修改符号链接的owner
sudo chown -h hadoop:hadoop jps //-h针对链接本身,而不是所指文件
可以通过这个命令来修改需要加“h”,加h修改的是符号链接本身而不是链接所指向的位置
修改的时候显示hadoop不在sudoers中,需要在/etc/sudoers中root 下添加hadoop用户就可以了
- 修改符号链接
ln -sfT index.html index //覆盖原有的链接
chown -h hadoop:hadoop /usr/local/bin/jps //修改链接文件的用户以及用户组 -h 表示只针对当前的链接不针对所链接的文件
hadoop的端口(hadoop3以上的端口发生了改变)
50070 namenode的http port -> 9870
50075 datanode的http port ->9864
50090 2namenode http port ->9868
8020 namenode rps port 远程通信端口 ->9820
50010 datanode rps port ->9866
hadoop的四个模块
- common
- hdfs // 存储 分布式文件系统模块 namenode + datanode + secondarynamenode
- mapreduce //MR,编程模型
- yarn // 资源调度 框架 resourcemanager + nodemanager
进程-启动脚本
1.start-all.sh //启动所有进程
2.stop-all.sh //关闭所有进程
3.start-dfs.sh
- Namenode NN
- Datanode DN
- SecondaryNamenode2NN
4.start-yarn.sh
- ResourceManager RM
- NodeManager NM
脚本分析
hdfs --workers --daemon start datanode //在名称节点中开启所有的数据节点
hdfs --daemon start namenode //开启名称节点
- sbin/start-all.sh
1.libexec/hadoop-config.sh
2.sbin/start-dfs.sh
3.sbin/start-yarn.sh
hdfs --daemon start namenode //开启名称节点
hdfs --workers --daemon start datanode //开启数据节点
hdfs --daemon start datanode //开启所在主机的名称节点
hdfs --daemon stop namenode
hdfs --workers --daemon stop datanode //在stop-all.sh中添加这条语句可以关闭数据节点,防止在stop-all.sh执行中报数据节点出错不能关闭
- sbin/start-dfs.sh
1.libexec/hdfs-config.sh
2.bin/hdfs namenode --workers --config .. --daemon .. --hostname start namenode ...
3.bin/hdfs datanode --workers --config .. --daemon .. --hostname start datanode ...
4.bin/hdfs secondarynamecode --workers --config .. --daemon .. --hostname start secondarynamecode ...
5.bin/hdfs zkfc --workers --config .. --daemon .. --hostname start zkfc ... //容灾
- sbin/start-yarn.sh
1.libexec/yarn-config.sh
2.bin/yarn resourcemanager --workers --config .. --daemon .. --hostname start resourcemanager ...
3.bin/yarn nodemanager --workers --config .. --daemon .. start nodemanager ...
4.bin/yarn proxyserver --workers --config .. --daemon .. --hostname start proxyserver ...
- bin/hadoop
hadoop version //版本
hadoop fs //文件系统客户端
hadoop jar //运行jar包
hadoop classpath //查看类路径(每一个命令都对应着一个java类,当选择命令后,都会去找对应的java类文件来进行执行)
hadoop checknative //检查本地库(压缩和解压缩会用到)
hdfs常用命令
- hdfs dfs -mkdir /user/centos/hadoop //在节点中创建目录
- hdfs dfs -ls -r /user/centos/hadoop
- hdfs dfs -lsr /user/centos/hadoop
- hdfs dfs -put index.html /user/centos/hadoop
- hdfs dfs -get /user/centos/hadoop/index.html a.html
- hdfs dfs -rm -r -f /user/centos/hadoop
hdfs hadoop文件系统
1.hadoop将文件进行了切割分成了128M每块,原因是要让磁盘的寻址时间占用读取时间的1%,寻址时间是10ms,磁盘速率是100M/s,那么在1s内所能读取的内容为100M左右,所以切割的大小为128M
2.hadoop在名称节点下面只存放目录,存放fsimage文件是镜像,在数据节点下面存放的是数据,如果存放的数据被切割,可以通过cat 后一部分 >> 前一部分
来合成原来的文件,这个切割是没有添加标记头的。
3.名称节点在启动的时候会初始化内存中的文件系统结构,metainfo,名称节点只存放块的信息,不存放节点的信息,数据节点启动以后会向名称节点报告,报告自己的块列表。这样会造成节点id与块的映射。
HA:
high availablity //高可用性,通常用个5个9来衡量99.999%
SPOF:
single point of failure,单点故障 (配置两个名称节点)
secondarynamenode
辅助名称节点,备份,定期从名称节点抓取数据并且送回去,只是用来备份的并不是高可用
配置hadoop的临时目录
1.配置core-site.xml文件
hadoop.tmp.dir=/home/hadoop/hadoop
以下路径中地址都由上面的这个配置来决定,下面参数在hdfs-site.xml中修改
dfs.namenode.name.dir=file:///${hadoop.tmp.dir}/dfs/name
dfs.datanode.data.dir=file:///${hadoop.tmp.dir}/dfs/data
dfs.namenode.checkpoint.dir=file:///${hadoop.tmp.dir}/dfs/namesecondary
2.分发core-site.xml文件
xsync.sh core-site.xml
3.格式化文件系统
hdfs namenode -format
4.启动hadoop
start-dfs.sh