【误闯大数据】【从安装到入门】常用脚本篇

513 阅读7分钟
作者 日期 有啥特别
元公子 2019-12-24(周二) 一个穿短袖没有雪的平安夜

你知道的越少,你不知道的就越少

没有朋友的点赞,就没法升级打怪

一、前言

大数据环境可能会使用到一些常用脚本,这里将统一进行讲述。部署机采用Centos7操作系统。

二、Linux新用户

# 创建名称为hadoop的用户组
[root@hadoop-master ~]# groupadd hadoop
# 创建名称为hadoop的用户,并指派到hadoop名称的用户组。第一个hadoop是用户组名称,第二个是用户名称
# 备注 -d 参数 指向用户目录
[root@hadoop-master ~]# useradd -g hadoop hadoop
# 修改hadoop用户的密码
[root@hadoop-master ~]# passwd hadoop

# 给该用户添加 sudo 权限,使其所有命令都不需要密码,即可使用sudo权限。
# 在“root ALL=(ALL) ALL”此行下面追加一行,由于是只读文件,要使用:wq!强制保存。
[root@hadoop-master ~]# vi /etc/sudoers
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
hadoop  ALL=(ALL)       NOPASSWD:ALL
执行保存: Esc :wq!

sudo命令简单说明:

# hadoop用户访问高权限目录时,提示权限不够
[hadoop@hadoop-master ~]$ ls /root/
ls: 无法打开目录/root/: 权限不够
# 加入sudo后,原先会提示输入hadoop的用户密码。设置了sudo用户权限后,可免除输入该用户密码。
[hadoop@hadoop-master ~]$ sudo ls /root
naconda-ks.cfg  cleardocker.sh  download

删除用户

# 删除用户,但相关文件还存在,例如home目录等
[root@hadoop-master ~]# userdel 用户名 
# 删除用户,以及相关文件
[root@hadoop-master ~]# userdel -r 用户名
# 查询与用户相关的文件,后续按情况使用rm命令删除
[root@hadoop-master ~]# find / -name "*用户名*"

三、域名映射

本机的域名

# 查看本机的域名名称
[root@hadoop-master /]# hostname
hadoop-master
# 编辑域名名称,需重启生效(reboot)
[root@hadoop-master /]# hostnamectl set-hostname 域名名称

域名与机器IP之间的映射关系

# 查看hosts文件
[root@hadoop-master /]# cat /etc/hosts
# 前面2行127.0.0.1、::1不用调整,在下面递增加行内容
127.0.0.1 localhost
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# 写法:ip地址+空格或者tab+自定义域名名称
192.168.0.1 hadoop-master
192.168.0.2 test1
192.168.0.3 test2
# 编辑此文件可增删改,保存后立即生效。
[root@hadoop-master /]# vi /etc/hosts
# 验证是否生效,ping域名是否正常,并显示所对应的ip信息
[root@hadoop-master /]# ping test1

四、Linux提示符显示全路径

/etc/profile 添加环境变量

[root@hadoop-master /soft]# vi /etc/profile
# 文件最底部加入。\$ '可以改为\$'(去掉空格)
export PS1='[\u@\h `pwd`]\$ '
执行保存: Esc :wq
# source当前会话生效,全局需重启
[root@hadoop-master /soft]# source /etc/profile
# 显示效果
[root@hadoop-master /home/hadoop]# 结果1
[root@hadoop-master /home/hadoop]#结果2(后续命令的空格区别)

五、多台机器间ssh免密码登录

此脚本来源于Hadoop官方的“Setup passphraseless ssh”章节,文章链接地址

先看下未设置免密码登录的样子。

# ssh登录本机服务器,默认以当前用户登录(hadoop用户示例),要求输入当前用户的密码。
[hadoop@hadoop-master /]$ ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:z264yqjSGmNB/6c+Bk6vYtNZ82zl7FIaLemL1aZNFdY.
ECDSA key fingerprint is MD5:eb:0a:e3:93:db:55:96:42:55:85:55:2d:5a:80:d2:93.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
hadoop@localhost's password: 
[hadoop@hadoop-master /]$ exit

设置当前账户的免密码登录。

# 查看当前用户.ssh目录下有哪些文件
# 提示:如不存在.ssh目录,则输入ssh localhost,录入密码登录后,再输入exit退出。
# .ssh目录的权限必须是700**
[hadoop@hadoop-master ~]$ ll  ~/.ssh/
总用量 4
-rw-r--r-- 1 hadoop hadoop 171 12月 23 14:08 known_hosts
[hadoop@hadoop-master ~]$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 生成两个文件id_rsa(私钥),id_rsa.pub(公钥,可发给其它机器)
[hadoop@hadoop-master ~]$ ll  ~/.ssh/
-rw------- 1 hadoop hadoop 1675 12月 23 14:59 id_rsa
-rw-r--r-- 1 hadoop hadoop  408 12月 23 14:59 id_rsa.pub
-rw-r--r-- 1 hadoop hadoop  171 12月 23 14:08 known_hosts
# 生成免密码登录的认证文件,并设置相应权限
[hadoop@hadoop-master ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# authorized_keys文件权限必须是600**
[hadoop@hadoop-master ~]$ chmod 0600 ~/.ssh/authorized_keys
# 测试,正常则为不用密码登录(畅通无阻)
[hadoop@hadoop-master ~]$ ssh localhost
# 退出
[hadoop@hadoop-master ~]$ exit

高能提示1现在使用root用户试试

[hadoop@hadoop-master ~]$ sudo su - root
[root@hadoop-master ~]# ssh localhost
root@localhost's password: 
# 结论你懂的。不是所有用户都会免密登录。所以要使用哪个用户,就切换到那个用户再重新来一遍吧。

高能提示2一起来看看authorized_keys文件的内容

[hadoop@hadoop-master ~]$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3JprUBnvkoLbbOexoMrVUEyAJcnCV31qinmpG+YE85mtk6WJEVThwN9Zi+KBIZCoXglpVWlr6jbbmRoMxGbsh6ytMXIsDNs5Tia9rMwNTG/Rbz1uDLgZ/V11uITAWxDSxksyJqqNV6wF/4jS5uDVXVzH4xmQhL0O9JhMJfOjDkzSpkIpOTbQbNSKHpKhFB9EqAxIBvu9ctvY2ozq2SaHFVXlY0xljKHuRi2UUqBfywNmRc4dhWwwzcz3vPQ/kJkJZjrRdQppMP9f6Fs4F7CPImktPRIPVqDGIamIVklREOu/UIIvr3wNuEJXOPvGKCi14bXPcxy/Bz73vt2ncsvft hadoop@hadoop-master
# 结论:你懂的。设置免密前,建议提前先把用户名和hostname统一和规划下。(hadoop@hadoop-master表示以哪个用户名来登录本机)

实现免密登录的简单思路:A机器拥有B机器的authorized_keys文件,那B机器就可以免密登录A机器。

所以,如果我们想多台机器之间,可以互相免密登录的话,我们最终要做到这两点:

  1. 每台机器需远程登录用户的目录下(~/.ssh/)都要有相同内容的authorized_keys文件
  2. authorized_keys文件内容为每台机器需远程登录用户的目录下~/.ssh/id_rsa.pub文件内容的汇总。

以下使用A、B、C三台机器讲述。

首先,每台机器的hosts文件存在以下映射信息。其中一台机器如下:

[hadoop@A /]# cat /etc/hosts
192.168.0.1 A
192.168.0.2 B
192.168.0.3 C

然后,每台机器已通过本章节的内容,生成各自的id_rsa.pub文件。下面把B和C机器的id_rsa.pub文件内容汇总A的authorized_keys中。

# 把B的id_rsa.pub内容追加到A机器的hadoop用户的.ssh/authorized_keys。
# 提示:
# 1.如果A中不存在authorized_keys,会自动创建一个。存在则在authorized_keys文件尾部追加。
# 2.如果打算考入A机器的其它用户,可修改A为root@A,root为目标用户。
# 3.如果命令不存在,则需安装命令包:yum -y install openssh-clients
[hadoop@B ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub A
hadoop@A's password: (需输入A机器hadoop用户的密码)
[hadoop@C ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub A
hadoop@A's password: (需输入A机器hadoop用户的密码)
# 追加A的id_rsa.pub信息。如果已操作过此步骤,可忽略。
[hadoop@A ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 查看A中authorized_keys的内容,确认已包含三台机器的公钥信息
[hadoop@A /home/hadoop/.ssh]# cat authorized_keys 
ssh-rsa 
Lt/Bg0HxiEL5SDhT hadoop@A
ssh-rsa 
7sR3R+pfHFg461Ra0v+uud03 hadoop@B
ssh-rsa 
7sR3R+pfHFg461Ra0v+uud03 hadoop@C
# 拷贝authorized_keys到B和C机器
[hadoop@A ~]$ scp -p ~/.ssh/authorized_keys B:/home/hadoop/.ssh/authorized_keys
[hadoop@A ~]$ scp -p ~/.ssh/authorized_keys C:/home/hadoop/.ssh/authorized_keys
# 进行测试,正常则无需输入登录密码
[hadoop@A ~]$ ssh B

六、服务器开机字符界面

# 查看当前的启动模式
[root@hadoop-master /]# systemctl get-default
# 设置字符界面(省资源,操作系统漏洞少),重启生效
[root@hadoop-master /]# systemctl set-default multi-user.target
# 设置图形界面,重启生效
[root@hadoop-master /]# systemctl set-default graphical.target

七、多台机器拷贝相同文件

脚本来自徐培成老师

[root@hadoop-master /]# vi /usr/local/bin/xrsync.sh
#!/bin/bash
if [[ $# -lt 1 ]] ; then echo no params ; exit ; fi
p=$1
dir=`sudo dirname $p`
filename=`sudo basename $p`
cd -P $dir
fullpath=`pwd -P .`
user=`whoami`
# 使用rsync增量同步,hadoop-master2为目标机器域名
rsync -lr $p $user@hadoop-master2:$fullpath
# 循环拷贝相似名称的机器,hadoop-dn1,hadoop-dn2,hadoop-dn3
i=1
for (( i=1 ; i<=3 ; i=$i + 1  )) ; do
    echo ================ dn$i  ==================
    rsync -lr $p $user@hadoop-dn$i:$fullpath
done

执行保存: Esc :wq
[root@hadoop-master /]# chmod +x /usr/local/bin/xrsync.sh
# 拷贝/root/demo.txt到其他机器同目录下,使用前建议设置免密登录到目标机器(单向传输的话,其他机器都已存在源机器的authorized_keys文件)
[root@hadoop-master /]# xrsync.sh /root/demo.txt
# 拷贝/root/demo目录到其他机器同目录下
[root@hadoop-master /]# xrsync.sh /root/demo

八、多台机器同时执行相同命令

脚本来自徐培成老师

[root@hadoop-master /]# vi /usr/local/bin/xcall.sh
#!/bin/bash
if [[ $# -lt 1 ]] ; then echo no params ; exit ; fi
params=$@
echo ================ master2  ==================
ssh hadoop-master2 "$params"
i=1
for (( i=1 ; i<=3 ; i=$i + 1  )) ; do
    echo ================ dn$i ==================
    ssh hadoop-dn$i "$params"
done

执行保存: Esc :wq
[root@hadoop-master /]# chmod +x /usr/local/bin/xcall.sh
[root@hadoop-master /]# xcall.sh jps

九、Kafka集群命令

注释的地方也可以开启使用,用途是只使用内置的节点服务器域名,不接收传入的参数。今后大家可以通过此脚本的思路,扩展成其它用途的脚本。

启动的脚本:

[root@hadoop-master /]# vi /usr/local/bin/kafka-cluster-start.sh
#!/bin/bash
# broker机器域名列表
#brokers=("broker1 broker2 broker3")
KAFKA_HOME="/soft/kafka"

echo "Begin to start kafka cluster..."

for arg in $@
#for broker in ${brokers[@]}
do
        #echo "  start kafka on ${broker}"
        echo "  start kafka on $arg"
        #ssh hadoop@$arg -C "source /etc/profile; sh ${KAFKA_HOME}/bin/kafka-server-start.sh -daemon /home/hadoop/kafka/config/server.properties"
        #ssh hadoop@${broker} -C "source /etc/profile; sh ${KAFKA_HOME}/bin/kafka-server-start.sh -daemon /home/hadoop/kafka/config/server.properties"
        ssh $arg -C "service kafka start"
        if [ $? -eq 0 ]; then
                #echo " [${broker}] start successfully "
                echo " [${arg}] start successfully "
        fi
done
echo "Kafka cluster starts successfully !"

执行保存: Esc :wq
[root@hadoop-master /]# chmod +x /usr/local/bin/kafka-cluster-start.sh
# 传入待启动的节点信息(支持多个)
[root@hadoop-master /]# kafka-cluster-start.sh broker1 broker2

停止的脚本:

[root@hadoop-master /]# vi /usr/local/bin/kafka-cluster-stop.sh
#!/bin/bash
#brokers=("broker1 broker2 broker3")
KAFKA_HOME="/soft/kafka"
echo "Begin to stop kafka cluster..."
for arg in $@
#for broker in ${brokers[@]}
do
	#echo "  stop kafka on ${broker}"
	echo "  stop kafka on $arg"
	#ssh hadoop@${broker} -C "source /etc/profile; sh ${KAFKA_HOME}/bin/kafka-server-stop.sh "
	# ssh root@${broker} -C "service kafka stop"
	ssh root@$arg -C "service kafka stop"
	if [ $? -eq 0 ]; then
		#echo " [${broker}] stop successfully "
		echo " [${arg}] stop successfully "
	fi
done
echo "Kafka cluster stop successfully !"

执行保存: Esc :wq
[root@hadoop-master /]# chmod +x /usr/local/bin/kafka-cluster-stop.sh
# 传入待停止的节点信息(支持多个)
[root@hadoop-master /]# kafka-cluster-stop.sh broker1 broker2

十、防火墙

# 查看状态
[root@hadoop-master /]# systemctl status firewalld
# 关闭
[root@hadoop-master /]# systemctl stop firewalld
# 启动
[root@hadoop-master /]# systemctl start firewalld
# 重启
[root@hadoop-master /]# systemctl restart firewalld
# 禁用开机启动服务
[root@hadoop-master /]# systemctl disable firewalld
# 启用开机启动服务
[root@hadoop-master /]# systemctl enable firewalld
# 永久开放端口
[root@hadoop-master /]# firewall-cmd --zone=public --add-port=80/tcp --permanent
# 不改变状态的条件下重新加载防火墙
[root@hadoop-master /]# firewall-cmd --reload
# 查询端口号80 是否开启
[root@hadoop-master /]# firewall-cmd --query-port=80/tcp
# 查询哪些端口是开启
[root@hadoop-master /]# firewall-cmd --list-port
# 闲麻烦,可以关闭掉美国国家安全局开发的功能(安全增强型Linux内核模块)
[root@hadoop-master /]# vi /etc/selinux/config
设置SELINUX=disable
# 查看selinux状态
[root@hadoop-master /]# getenforce

Centos6防火墙命令

# 查看防火墙状态:
[root@hadoop-master /]# service iptables status
# 开启防火墙(即时生效,重启后失效):
[root@hadoop-master /]# service iptables start
# 关闭防火墙(即时生效,重启后失效):
[root@hadoop-master /]# service iptables stop
# 重启防火墙:
[root@hadoop-master /]# service iptables restart
# 开启防火墙(重启后永久生效):
[root@hadoop-master /]# chkconfig iptables on
# 关闭防火墙(重启后永久生效):
[root@hadoop-master /]# chkconfig iptables off
# 查看打开的端口:
[root@hadoop-master /]# /etc/init.d/iptables status
# 开启端口:
[root@hadoop-master /]# iptables -A INPUT -p tcp --dport 6000 -j ACCEPT 
# 打开49152~65534之间的端口
[root@hadoop-master /]# iptables -A INPUT -p tcp --dport 49152:65534 -j ACCEPT 
# 直接编辑规则文件
[root@hadoop-master /]# vi /etc/sysconfig/iptables
# 保存规则并重启防火墙:
[root@hadoop-master /]# /etc/init.d/iptables save
# 同service iptables restart
[root@hadoop-master /]# /etc/init.d/iptables restart