1.外面的电脑可以访问本机的虚拟机(共享虚拟机服务)
 iptables -t nat -A PREROUTING -i enp2s0 -d 172.40.5.1 -p tcp --dport 2222 -j DNAT --to 192.168.4.10:22(路由前iptables作目的地址转发)
2.虚拟机连接外网
1)关闭本机防火墙服务 systemctl stop firewalld.service
2)开启本机路由转发功能 sysctl -w net.ipv4.ip_forward=1
3)iptables作源地址伪装
   iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o p8p1 -j MASQUERADE
4)在虚拟机里添加网关地址:route add default gw 192.168.4.254
3.brctl show 查看网桥
  brctl addbr lo1  创建网桥
  brctl delbr lo1  删除网桥
  brctl addif lo1  连接网桥
  brctl delif lo1  断开连接

一 。ansible介绍
1.自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
二。ansible特点
1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
2、默认使用SSH协议对设备进行管理;
3、有大量常规运维操作模块,可实现日常绝大部分操作。
4、配置简单、功能强大、扩展性强;
5、支持API及自定义模块,可通过Python轻松扩展;
6、通过Playbooks来定制强大的配置、状态管理;
7、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
8、提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
三。安装ansible
1.部署环境(7.2)
  yum -y install python-cryptography      安装依赖 
  python2-jmespath-0.9.0-3.el7.noarch.rpm 环境
  python-httplib2-0.9.2-1.el7.noarch.rpm
  python-paramiko-2.1.1-2.el7.noarch.rpm
  python-passlib-1.6.5-2.el7.noarch.rpm
  sshpass-1.06-2.el7.x86_64.rpm

2.安装ansible软件包
  ansible-2.4.1.0-1.el7.noarch.rpm
3.升级依赖软件包(需要配置centos7.4yum源)
 yum update python2-pyasn1.noarch
 yum update python2-cryptography.x86_64
4.验证安装是否ok
 ansible --version 正确显示版本号即安装OK
5.在所有主机配置主机名 vim /etc/hosts
192.168.4.55 zabbix-55
192.168.4.77 scal-77
192.168.4.250 C250
192.168.4.30 nfs-30
192.168.4.33 web-33
192.168.4.44 web-44

四。配置ansible
1.默认配置文件路径
 /etc/ansible/ansible.cfg
 /etc/ansible/hosts
2.添加管理主机配置
 vim /etc/ansible/hosts
 [web]
 web-33
 web-44

 [web:vars]
 ansible_ssh_user="root"
 ansible_ssh_pass="Taren1"     
 ansible_ssh_port="22"
 [db]
 nfs-30    
 C250
 scal-77 ansible_ssh_user="root" ansible_ssh_pass="123456"

 [db:vars]
 ansible_ssh_user="root" 
 ansible_ssh_pass="Taren1"
 ansible_ssh_port="22" 

 [ling:children] 
 web
 db
 :wq
 还需要修改配置文件,
 vim /etc/ansible/ansible.cfg
 host_key_checking = False 取消61行的注释
3.使用一些简单命令验证
 ansible web  --list-hosts 查看组对应的主机名
 ansible db  --list-hosts
 ansible ling  --list-hosts

 ansible web -m ping  ping组下的主机是否能同
4.可以新建一个文件,然后在新建这两个配置文件,就又 可以单独作服务
5.配置ansible使用公钥验证
 1)首先生成秘钥
 # ssh-keygen -t rsa
 2)然后向主机分发秘钥(一键部署到所有主机)
 ansible-doc -l | grep auth (帮助文档)
 ansible all -m authorized_key -a "user=root exclusive=true manage_dir=true key='$(< /root/.ssh/id_rsa.pub)'" -k -v 
6.ansible命令基础
ansible  [options]
– host-pattern 主机戒定义的分组
– -M 指定模块路径;/
– -m 使用模块,默认 command 模块
– -a or --args 模块参数
– -i inventory 文件路径,戒可执行脚本
– -k 使用交亏式登彔密码
– -e 定义变量
– -v 详绅信息,-vvvv 开吭 debug 模式
----------------------------------------------------------------------------------
批量配置管理--模块
1.ansible-doc模块
 模块的手册,相当 shell 的 man
 ansible-doc -l 列出所有模块
 ansible-doc 模块名   查看模块帮助
2.ping模块
 测试 ssh 的连通性 ;ping模块没有参数
 ansible web -m ping 测试web组ssh是否连通
3.command模块
 默认模块,进程执行命令
 command模块注意事项:
 该模块通过-a跟上要执 行的命令可以直接执行,不过命令里如果有带有如下字符部分则执行不成功
 "<", ">", "|", "&";该模块不使用shell 直接在 ssh 迚程中执行,所有使用到 shell 特性的命令执行都会失败
 ansible all -m command -a 'uptime' 查看所有机器的负载
 ansible all -m command -a "date +%F_%T" 查看日期和时间
4.shell|raw 模块
 – shell 模块用法基本和command一样,区别是 shell模
  块是通过/bin/sh执行命令,可以执行任意命令
 – raw模块,用法和shell 模块一样 ,可以执行任意命令
 – 区别是 raw 没有chdir、creates、removes参数
 – 执行以下命令查看结果
ansible t1 -m command -a 'chdir=/tmp touch f1'
ansible t1 -m shell -a 'chdir=/tmp touch f2'
ansible t1 -m raw -a 'chdir=/tmp touch f3'
5.script模块
 – 直接在本地写脚本,然后使用 script 模块批量执行
使用格式 ansible t1 -m script -a 'urscript'
6.copy模块
复制文件到进程主机 
– src:要复制到进程主机的文件在本地的地址,可以是
绝对路径,也可以是相对路径。如果路径是一个目彔,
它将递归复制。在这种情况下,如果路径使用"/"来结
尾,则只复制目彔里的内容,如果没有使用"/"来结尾,
则包含目彔在内的整个内容全部复制,类似亍rsync
– dest:必选项。进程主机的绝对路径,如果源文件是
一个目彔,那么该路径也必须是个目彔
– 复制文件
ansible t1 -m copy -a 'src=/root/alog dest=/root/a.log'
– 复制目彔
ansible t1 -m copy -a 'src=urdir dest=/root/'
7.lineinfile | replace模块
– 类似 sed 的一种行编辑替换模块
– path 目的文件
– regexp 正则表达式
– line 替换后的结果
 ansible web -m lineinfile -a ‘path=”/etc/config” regexp=”^SELINUX=” line=”SELINUX=disabled”’
– 替换指定字符
ansible t1 -m replace -a 'path="/etc/selinux/config"
regexp="^(SELINUX=).*" replace="\1disabled"'
8.yum模块
– 使用yum包管理器来管理软件包
– config_file:yum的配置文件
– disable_gpg_check:关闭gpg_check
– disablerepo:丌吭用某个源
– enablerepo:吭用某个源
– name:要迚行操作的软件包的名字,也可以传递一个
url戒者一个本地的rpm包的路径
– state:状态(present,absent,latest)
yum模块
– 删除软件包
ansible t1 -m yum -a 'name="lrzsz" state=absent'
– 删除多个软件包
ansible t1 -m yum -a 'name="lrzsz,lftp" state=absent'
– 安装软件包
ansible t1 -m yum -a 'name="lrzsz"'
– 安装多个软件包
ansible t1 -m yum -a 'name="lrzsz,lftp"'
9.service模块
– name:必选项,服务名称
– enabled:是否开机吭劢 yes|no
– sleep:如果执行了restarted,在则stop和start乊间
沉睡几秒钟.
– state:对当前服务执行吭劢,停止、重吭、重新加载
等操作(started,stopped,restarted,reloaded)
ansible t1 -m service -a 'name="sshd" enabled="yes"
state="started"'
10.setup模块
– 主要用亍获取主机信息,在playbooks里经常会用到的
一个参数gather_facts就不该模块相关。setup模块下
经常使用的一个参数是filter参数
– filter 可以过滤到我们需要的信息
ansible t1 -m setup -a 'filter=ansible_distribution'

-------------------------------------------------------
json简介:
– json 是 JavaScript 对象表示法,它是一种基亍文本,
   独立亍诧言的轻量级数据交换格式。
– JSON 是纯文本
– JSON 具有"自我描述性"(人类可读)
– JSON 具有层级结构(值中存在值)
– JSON 可通过 JavaScript 迚行解析
yaml简介
– 是一个可读性高,用杢表达数据序列的格式。
– YAML:YAML Ain't Markup Language
– YAML参考了其他多种诧言,包括:C诧言、Python、
   Perl,幵从XML、电子邮件的数据格式(RFC 2822)
   中获得灵感。
jinja2模版简介
– 要使用 ansible 就要深入学习 playbook 配置及模板。
    playbook 的模板使用 python 的 jinja2 模块杢处理的
------------------------------------------------------
playbook简介
– playbook 是 ansible 用亍配置,部署,和管理托管主
  机剧本。通过 playbook 的详绅描述,执行其中的一系
  列 tasks,可以让进端主机达到预期的状态。
– 也可以这么理解,playbook 字面意思,即剧本,现实
  中由演员按照剧本表演,在 Ansible 中由计算机迚行表
  演,由计算机安装,部署应用,提供对外服务,以及组
  细计算机处理各种各样的事情

一.配置ELK集群
准备6台机器
5台 装ES 内存1G
1台 装kibana logstash 内存4G
1.elasticserach的安装
  1)安装java 1.8以上版本
   先修改/etc/hosts 文件,使自己可以ping自己的主机名
  yum -y install java-1.8.0-openjdk.x86_64
  2)RPM安装elasticserach软件包
  rpm -ivh elasticsearch-2.3.4.rpm
  3)修改配置文件
  vim /etc/elasticsearch/elasticsearch.yml
    network.host: 0.0.0.0 修改54行
  4)查看端口9200;9300
2.所有主机配置/etc/hosts 所有机器能相互ping同
3.所有机器禁用selinux,卸载firewalld
 systemctl stop firewalld ; systemctl mask firewalld
4.所有机器都安装 java-xx-openjdk 要求版本1.8
5.修改node机器上的elasticserarch.yml,重启服务
 cluster.name: my-nsd1710
 node.name:node1
 network.host: 0.0.0.0
 discovery.zen.ping.unicast.hosts:["node1","node2","node3"]
副用sed修改配置文件
sed -i 's/# cluster.name: my-application/cluster.name: my-nsd/' /etc/elasticsearch/elasticsearch.yml
sed -i "s/# node.name: node-1/node.name: $(hostname)/" /etc/elasticsearch/elasticsearch.yml
sed -i 's/# network.host: 192.168.0.1/network.host: 0.0.0.0/' /etc/elasticsearch/elasticsearch.yml
x='["s1","s2"]'
sed -i "s/# discovery.zen.ping.unicast.hosts:.*/discovery.zen.ping.unicast.hosts: $x/" /etc/elasticsearch/elasticsearch.yml

6.验证: http://192.168.4.xx:9200/_cluster/health?pretty
二.安装插件(head, kopf,bigdesk)
1.cd /usr/share/elasticsearch/bin/
  执行
  ./plugin install file:///root/elk/elasticsearch-head-master.zip 
  ./plugin install file:///root/elk/elasticsearch-kopf-master.zip 
  ./plugin install file:///root/elk/bigdesk-master.zip 
  ./plugin list 查看已安装的插件
 2.用浏览器验证插件功能
  http://192.168.4.55:9200/_plugin/head
  http://192.168.4.55:9200/_plugin/kopf
  http://192.168.4.55:9200/_plugin/bigdesk
3.
Rest API 的简单使用
– _cat API 查询集群状态,节点信息
– v 参数显示详细信息
http://192.168.4.15:9200/_cat/health?v
– help 显示帮助信息
http://192.168.4.15:9200/_cat/health?help
– nodes 查询节点状态信息
http://192.168.4.15:9200/_cat/nodes?v
– 索引信息
http://192.168.4.15:9200/_cat/indices?v
4.对数据库增加、删除、修改数据
– GET 查询
– POST 增加
– PUT 更改
– DELETE 删除
1)– 创建一个 school 的 (Index) 和一个 students (Type)
 – 并增加一条信息
curl -XPUT 'http://192.168.4.11:9200/school/students/1' -d
'{
"title": "devops",
"name":{
"first": "guzhang",
"last": "wu"
},
"age": 25
}'

2)– 修改 school 下面 students 的第一个文档中的 age 信
  息,从 25 修改为 30
curl -XPOST'http://192.168.4.11:9200/school/students/1/_update' -d '{
"doc":{
"age": 30
}
}'

3)– 查询刚刚创建的文档信息
 curl –XGET 'http://192.168.4.11:9200/school/students/1‘

– 只查询 name 和 age
curl -XGET
'http://192.168.4.11:9200/school/students/1?_source=name,age'

4)– 删除刚才创建的文档
  curl -XDELETE 'http://192.168.4.14:9200/school/students/1'
  – 删除 school
  curl -XDELETE 'http://192.168.4.14:9200/school'

三.kibana 安装
1.kibana特点:
– 灵活的分析和可视化平台
– 实时总结和流数据的图表
– 为不同的用户显示直观的界面
– 即时分享和嵌入的仪表板
2.kibana安装
 rpm –ivh kibana-4.5.2-1.x86_64.rpm
– kibana 默认安装在 /opt/kibana 下面,配置文件在
/opt/kibana/config/kibana.yml
3.kibana.yml 的配置
 vim /opt/kibana/config/kibana.yml (取消注释即可,只有一个要修改)
– server.port: 5601
– server.host: "0.0.0.0"
– elasticsearch.url: "http://192.168.4.13:9200"
– kibana.index: ".kibana"
– kibana.defaultAppId: "discover"
– elasticsearch.pingTimeout: 1500
– elasticsearch.requestTimeout: 30000
– elasticsearch.startupTimeout: 5000    
4.启动服务
 systemctl start kibana;systemctl enable kibana
5.浏览器访问:
  http://192.168.4.20:5601/
6.数据批量导入
 1)– 导入含有 index 配置的 json 文件
  gzip –d logs.jsonl.gz 解压准备号的数据文件
curl -XPOST 'http://192.168.4.14:9200/_bulk' --data-binary @logs.jsonl
2)– 导入没有有 index 配置的 json 文件
   – 我们需要在 uri 里面制定 index 和 type
gzip –d accounts.json.gz

curl -XPOST 'http://192.168.4.14:9200/accounts/act/_bulk?pretty' --  data-binary @accounts.json

四.logstash 部分
1.logstash介绍:
– logstash是一个数据采集、加工处理以及传输的工具
logstash 特点:
– 所有类型的数据集中处理
– 不同模式和格式数据的正常化
– 自定义日志格式的迅速扩展
– 为自定义数据源轻松添加插件
2.logstash 安装
– Logstash 依赖 java 环境,需要安装 java-1.8.0-openjdk
– Logstash 没有默认的配置文件,需要手动配置
– logstash 安装在 /opt/logstash 目录下
 rpm -ivh logstash-2.3.4-1.noarch.rpm
3.创建logstash的配置文件
 vim /etc/logstash/logstash.conf
input{
stdin{}
}
filter{ }
output{
stdout{}
}
4.启动并验证(启动命令太长,作alias)
 /opt/logstash/bin/logstash -f /etc/logstash/logstash.conf
5.logstash 插件
/opt/logstash/bin/logstash-plugin list 
插件的具体用法到官网查帮助手册
– 常用的插件:plain、json、json_lines、rubydebug、multiline等
1)codec 类插件 
 设置输入源的 codec 是 json,在输入的时候选择rubydebug
input{
stdin{ codec => "json" }
}
filter{ }
output{
stdout{ codec => "rubydebug" }
}
我们输入普通数据和 json 对比
– {"a": 1, "c": 3, "b": 2}

2)input file 插件
file{
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb-access"
path => [“/tmp/alog”, “/tmp/blog”]
type => 'filelog'
}

– sincedb_path 记录读取文件的位置
– start_position 配置第一次读取文件从什么地方开始

3)input tcp 和 udp 插件
tcp{
host => "0.0.0.0"
port => 8888
type => "tcplog"
}
udp{
host => "192.168.4.16"
port => 9999
type => "udplog"
}

– 使用 shell 脚本,对 tcp 指定端口发送数据(用数据端机器验证)
function sendmsg(){
if (( $# == 4 )) && [ $1 == "tcp" -o $1 == "udp" ];then
exec 9<>/dev/$1/$2/$3
echo "$4" >&9
exec 9<&-
else
echo "$0 (tcp|udp) ipaddr port msg"
fi
}

– 发送 tcp 数据
– sendmsg tcp 192.168.4.10 8888 ‘tcp msg’
– 发送 udp 数据
– sendmsg udp 192.168.4.10 9999 ‘udp msg’

4)syslog 插件
syslog{
host => "192.168.4.10"
port => 514
type => "syslog"
}

在数据端配置
vim /etc/rsyslog.conf 配置向远程发送数据
local0.info  @192.168.4.6:514   (系统日志自动发送到远端主机;一个@表示udp)
authpriv.info @@192.168.4.6:514  (登录系统信息自动发送远端主机;@@表示tcp)

5)filter grok插件 (类似CPK)
– 解析各种非结构化的日志数据插件
– grok 使用正则表达式把飞结构化的数据结构化
– 在分组匹配,正则表达式需要根据具体数据结构编写
– 虽然编写困难,但适用性极广
– 几乎可以应用于各类数据
格式:
grok{
match => [“message”,“%{IP:ip}, (?reg)”]
}
定义的函数路径:
/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns
例子1:

filter{
    grok{
        match => ["message","%{IP:ip} %{WORD:method} %{URIPATH:uri} %{NUMBER:bytes} %{NUMBER:duration}"]
    }
}

grok 使用正则表达式把飞结构化的数据结构化在分组匹配,正则表达式需要根据具体数据结构编写,虽然编写困难,但适用性极广,几乎可以应用于各类数据

6)output ES 插件
使用Logstash 收集数据,格式化以后放入 ES 集群
input{
    file{
        start_position => "beginning"
        sincedb_path => "/dev/null"
        path => ["/tmp/alog"]
        type => 'filelog'
        codec => "json"
    }
}

filter{
}
output{ 
    if [type] == "filelog"{
    elasticsearch {
        hosts => ["192.168.4.15:9200"]
        index => "weblog"
        flush_size => 2000
        idle_flush_time => 10
    }}
}

放入集群以后的数据可以通过 kibana 展示

apache 文档 金步国

7)input filebeats 插件
filebeat 配置
input {
    beats {
        port => 5044
        codec => "json"
    }
}

这个插件主要用来接收 beats 类软件发送过来的数据,
由于 logstash 依赖 java 环境,而且占用资源非常大,
我们往往不希望所有集群的机器都部署 java 环境安装
logstash,而使用更轻量的 filebeat 替代
ilebeat 安装与配置
– 使用 rpm 安装 filebeat
rpm -ivh filebeat-1.2.3-x86_64.rpm
– 修改配置文件 /etc/filebeat/filebeat.yml
paths:
- /root/logs.jsonl
document_type: weblog
... ...
paths:
- /root/accounts.json
document_type: account
output:
logstash:
hosts: ["192.168.4.10:5044"]
– 设置开机运行
systemctl enable filebeat
– 开启服务
systemctl start filebeat

一.部署hadoop完全分布式
准备四台机器
master,node1,node2,node3
1.安装环境:java-1.8.0-openjdk.x86_64 和 java-1.8.0-openjdk-devel.x86_64
  修改/etc/hosts使所有主机互通
  关闭系统防火墙 关闭 selinux
2.配置 SSH 信任关系
 在master上创建ssh密钥,并分发给node端;
  ssh-keygen 
  ssh-copy-id  root@node端
 注意:不能出现要求输入 yes 的情况,每台机器都要能登录成功,因此修改
 vim /etc/ssh/ssh_config
  Host *
         GSSAPIAuthentication yes 修改57行
         StrictHostKeyChecking no 修改58行
3.master安装hadoop
 tar -xf hadoop-2.7.3.tar.gz -C /usr/local/  修改名字
4.配置HDFS 完全分布式系统(只在master作)
 1)修改java环境vim hadoop-env.sh
   export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre"  25行
   export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop  33行
  备注:java路径查看方法:readlink –f $(which java)
 2)vim core-site.xml 

 
  fs.defaultFS 
  hdfs://master:9000 (设置谁是管理者)
 
 
  hadoop.tmp.dir
  /var/hadoop     (设置文件的存放路径)
 

3)在所有值机上创建文件存放路径
  mkdir –p /var/hadoop
4)vim hdfs-site.xml 

 
  dfs.namenode.http-address
  master:50070
 
 
  dfs.namenode.secondary.http-address
  master:50090
 
 
  dfs.replication
  2        (设置备份数量)
 


5).配置声明DataNode节点主机
   vim slaves
   node1
   node2
   node3
6)配置完成以后,把 hadoop 的文件夹拷贝到所有机器
  for i in node{1..3}; do rsync -avz /usr/local/hadoop  $i:/usr/local/; done    
7)在 namenode(master) 上执行格式化操作和启动集群
  ./bin/hdfs namenode -format
  在没有报错的情况下启动集群 ./sbin/start-dfs.sh
8)验证hdfs是否启动ok
 启动以后分别在 namenode 和 datanode执行命令  jps
 成功的情况下应该可以看见:
 master端:NameNode  SecondaryNameNode
 datanode端:DataNode

./bin/hdfs dfsadmin -report 查看节点
9)文件系统已经创建ok,进行基本命令的使用
 – ./bin/hadoop fs –ls /   查卡文件系统中的根
 – ./bin/hadoop fs –mkdir /abc
 – ./bin/hadoop fs –touchz /urfile   
 – ./bin/hadoop fs –cat /urfile
 – ./bin/hadoop fs –rm /urfile
 -./bin/hadoop fs -put *.txt /qq 上传本地文件到/qq
 – ./bin/hadoop fs –get /remotefile 下载文件

5.Yarn 安装与配置(体现他的数据分析功能,先只在master上操作)
 修改配置文件
 1) vim mapred-site.xml

 
  mapreduce.framework.name
  yarn    
 


2)vim yarn-site.xml

 
  yarn.nodemanager.aux-services
  mapreduce_shuffle
 
 
  yarn.resourcemanager.hostname
  master
 


3)配置修改完成以后把配置同步到所有主机
for i in node{1..3}; do rsync -avz /usr/local/hadoop/etc  $i:/usr/local/hadoop/; done   
4)启动yarn服务
  ./sbin/start-yarn.sh
5)验证yarn服务是否启动,在所有主机上执行 jps;
 master:ResourceManager
 datanode:NodeManager 
 登陆以下网址,是否正常访问

6)使用yarn的单词出现频率统计功能;(在任意节点主机都可以)
 • 创建文件夹
 – ./bin/hadoop fs –mkdir /input
 • 导入要分析的文件
 – ./bin/hadoop fs –put *.txt /input
 • 提交分析作业
 – ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input  /aaa
 • 查看结果
 – ./bin/hadoop fs –cat  /aaa/*

二.NFS网关
1.新建一台服务器作nfsgw
 部署java环境,关防火请,selinux
 添加ssh锁
 设置所有主机的/etc/hosts 所有主机都通
2.在master停止所有服务
 ./sbin/stop-all.sh
3.在master主机和nfs主加创建相同的用户,用于登陆nfs
  useradd -u 500 -g 100 nfsuser
4.在master修改配置文件
 vim  core-site.xml (之前做的配置不动)
 
  hadoop.proxyuser.nfsuser.groups
  *         这里的用户为刚创建的
 
 
  hadoop.proxyuser.nfsuser.hosts
  *
 
5.同步master上的配置文件到所有的data主机上
 for i in node{1..3}; do rsync -avz /usr/local/hadoop/etc  $i:/usr/local/hadoop/; done
6.把mater上的hadoop安装目录拷贝到nfs主机上
7.在master主机上启动dfs服务
  ./sbin/start-dfs.sh
8.查看dfs是否成功启动
 成功的情况下应该可以看见:
 master端:NameNode  SecondaryNameNode
 datanode端:DataNode

 ./bin/hdfs dfsadmin -report 查看节点
9.到nfs的主机上设置相关配置
 1)修改配置文件
   vim hdfs-site.xml (之前的配置不要动)
 
  nfs.exports.allowed.hosts
  * rw  (设置允许访问 NFS 主机列与权限)
 
 
  dfs.namenode.accesstime.precision
  3600000  (设置文件自动更新时间)
 
 
  nfs.dump.dir
  /var/nfsfile   (设置转储目录)
 
 
  nfs.rtmax
  4194304  (设置读缓存)
 
 
  nfs.wtmax
  1048576  (设置写缓存)
 
 
  nfs.port.monitoring.disabled
  false   (允许从没有权限的客户端挂载 nfs)
 
2)创建转储目录,并修改权限
 mkdir /var/nfsfile
 chown nfsuser:users /var/nfsfile
3)查看服务器是否安装rpcbind和nfs-utils安装的话,要卸载掉 
 rpm -qa | grep
4)先启动nfs所依赖的服务Portmap(一定用root用户来启动)
 ./sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
 启动成功用jps查看会出现:Portmap
5)设置/usr/local/hadoop/logs文件的权限,nfsuser有rwx权限;
  setfacl -m  u:nfsuser:rwx logs
6)切换nfsuser用户登陆系统检查自己是否拥有logs和/var/nfsfile的权限
7)启动nfs服务 (一定要是nfsuser登陆系统,并执行nfs启动)
  [nfsuser@nfs hadoop]$ ./sbin/hadoop-daemon.sh --script ./bin/hdfs start nfs3
 确认服务是否启动,jps查看
 正常显示;Nfs3
8)登出nfsuser用户,切换到root用户;
  输jps查看,正常将显示:Portmap ,Nfs3 或(--process)
  查看端口2049和111是否启动netstat -antpu | grep 
9)端口起来,说明nfs配置成功,找台客户端挂载nfs验证

10.新建一台虚拟机,作nfs的客户端,挂载nfs使用;
 1)yum -y install nfs-utils
 2)挂载nfs
  mount -t nfs -o vers=3,proto=tcp,nolock,noacl,noatime,sync 192.168.4.15:/ /mnt
 3)查看挂载:df -h
   cd /mnt
   ls  
   touch

-----------------
三.Hadoop 节点管理(增删修)
1.在hadoop集群中添加一个node节点
 1)配置所有hadoop环境,包括主机名、ssh免密码登
    录、禁用 selinux、iptables、安装 java 环境,vim/etc/hosts
 2)把master的hadoop的目录复制到新建的机器
 3)在该节点启动Datanode
  ./sbin/hadoop-daemon.sh start datanode
 4)修改master的slaves文件增加该节点
 5)在master设置同步带宽,并同步数据
   ./bin/hdfs dfsadmin -setBalancerBandwidth 60000000
 6)在master启动同步进程
  ./sbin/start-balancer.sh 
 7)查看集群状态
  ./bin/hdfs dfsadmin -report
2.在hadoop集群中修复节点,和增加节点操作一样,无非就是换台服务器
3.在hadoop集群中删除节点 (如果修改了备份数量也需要作以下操作)
 1)配置master的hdfs-site.xml
   vim hdfs-site.xml

 
  dfs.namenode.http-address
  master:50070
 
 
  dfs.namenode.secondary.http-address
  master:50090
 
 
  dfs.replication
  3
 
 
  dfs.hosts.exclude
  /usr/local/hadoop/etc/hadoop/exfile
     (定义存放要删除的用户的文件)

~                
 2)在master增加 exclude 配置文件,写入要删除的节点 ip   
 touch /usr/local/hadoop/etc/hadoop/exfile
  vim exfile
  写要删除的主机名
 3)在master更新数据
  ./bin/hdfs dfsadmin -refreshNodes
 4)查看集群状态
 ./bin/hdfs dfsadmin -report
  如果被删除的主机状态为:Decommission in progress 则表名正在同步数据,不能删除
  如果被删除的主机状态为:Decommissioned  表名数据同步完成,可以删除主机
 5)修改master的slave文件,删除要卸载的主机名
 6)在要卸载的主机上执行停止服务操作
  ./sbin/hadoop-daemon.sh stop datanode
 7)删除完成后

一. zookeeper的高可用集群
1.安装环境准备(准备4台)
 java-1.8.0-openjdk.x86_64 和 java-1.8.0-openjdk-devel.x86_64
2.修改/etc/hosts 使集群主机互通
3.解压zookeeper
  tar -xf zookeeper-3.4.10.tar.gz  -C /usr/local/
  mv /usr/local/zookeeper-3.4.10/  /usr/local/zookeeper
4.修改配置文件
  mv zoo_sample.cfg   zoo.cfg (改配置文件名字)
  vim zoo.cfg (添加以下配置)
  server.1=node1:2888:3888
  server.2=node2:2888:3888
  server.3=node3:2888:3888
  server.4=master:2888:3888:observer
  创建datadir 指定的目录
  mkdir /tmp/zookeeper
  echo 4 > /tmp/zookeeper/myid
5.拷贝安装的目录到所有主机并创建myid
  for i in node{1..3}; do rsync -avz /usr/local/zookeeper  $i:/usr/local/; done
  mkdir /tmp/zookeeper
  echo 2 > /tmp/zookeeper/myid (根据id号配置)
6.所有主机启动服务
  /usr/local/zookeeper/bin/zkServer.sh  start
7.查看每个主机的状态和角色
  /usr/local/zookeeper/bin/zkServer.sh  status
8.创建脚本,查看所有主机的身份
  #!/bin/bash
    function getstatus(){
    exec 9<>/dev/tcp/$1/2181 2>/dev/null
    echo stat >&9
    MODE=$(cat <&9 |grep -Po "(?<=Mode:).*")
    exec 9<&-
    echo ${MODE:-NULL}
}
for i in node{1..3} master;do
    echo -ne "${i}\t"
    getstatus ${i}
done

二.kafka集群(node节点主机上配置)
1.安装环境
  kafka集群的安装配置是依赖 zookeeper
2.安装kafka
  tar -xvf kafka_2.10-0.10.2.1.tgz -C /usr/local/
  mv /usr/local/kafka_2.10-0.10.2.1/ /usr/local/kafka
3.修改配置文件 
  vim server.properties
  broker.id=11  (修改21行,每台服务器的id不能相同)
  zookeeper.connect=node1:2181,node2:2181,node3:2181 (修改119行)
                                                   集群地址,不用都列出,写一部分即可
4.拷贝安装目录,拷贝完后要修改配置文件id号
5.在所有主机上启动服务
 /usr/local/kafka/bin/kafka-server-start.sh -daemon  /usr/local/kafka/config/server.properties
6.验证服务是否启动
 jps 命令应该能看到 kafka 模块
 netstat 应该能看到 9092 在监听
7.集群验证与消息发布
 1)创建一个topic(随便一台主机就行,创建命令脚本)
./bin/kafka-topics.sh --create --partitions 2 --replication-factor 2 --zookeeper node3:2181 --topic lingxudong
 2)查看已经存在的 topic
 ./bin/kafka-topics.sh --list --zookeeper node2:2181
 3)查看已经存在的 topic详细信息
  /bin/kafka-topics.sh --describe --zookeeper node1:2181 --topic lingxudong
 4)在两个终端里面,生产者发布消息,消费者读取消息
 生产者先发布一个会话
 ./bin/kafka-console-producer.sh --broker-list node1:9092 --topic nsd1710
 消费者消费者进入绘画,并实时读取信息(--from-beginning 表示从开始读取消息)
 ./bin/kafka-console-consumer.sh --bootstrap-server node3:9092 --topic nsd1710

一.搭建hadoop的高可用集群(namenode单点故障)
1.集群需要用到的服务角色
192.168.4.10  namenode 
192.168.4.20  namenode
192.168.4.11  datanode
192.168.4.12  datanode
192.168.4.13  datanode

2.新建master-2服务器,完成以下配置,满座以下要求
 1)安装java环境,关闭selinux,firewalld;创建mkdir /var/hadoop
 2)修改所有的/etc/hosts 使所有集群主机互通
 3)装master的锁,可以直接被ssh
 4)在master-2上修改/etc/ssh/ssh_config,ssh时免输入yes
 5)在master-2上ssh-keygen创建密钥对,发给集群所有主机,包括本机;
 6)暂停之前的hadoop集群服务;所有主机上删除/var/hadoop/*
 7)重启node1,2,3的zookeeper服务

3.修改master的配置文件
 1) vim core-site.xml
 
  fs.defaultFS
  hdfs://mycluster  (设置组)
 
 
  hadoop.tmp.dir
  /var/hadoop
 
 
  ha.zookeeper.quorum
  node1:2181,node2:2181,node3:2181  (指定zk)
 

 2) vim hdfs-site.xml
   删除一些配置,最终为:
 
 
  dfs.replication
  2
 
 
  dfs.nameservices
  mycluster    指定hdfs的nameservices名称为mycluster
 
 
  dfs.ha.namenodes.mycluster
  master,master-2  指定集群的两个 NaneNode 的名称
 
 
  dfs.namenode.rpc-address.mycluster.master
  master:8020  配置的rpc通信端口
 
 
  dfs.namenode.rpc-address.mycluster.master-2
  master-2:8020 配置的rpc通信端口
 
 
  dfs.namenode.http-address.mycluster.master
  master:50070  配置的http通信端口
 
 
  dfs.namenode.http-address.mycluster.master-2
  master-2:50070  配置的http通信端口
 
 
  dfs.namenode.shared.edits.dir
  qjournal://node1:8485;node2:8485;node3:8485/mycluster
  指定namenode元数据存储在journalnode中的路径
 
  dfs.journalnode.edits.dir 
  /var/hadoop/journal  指定journalnode日志文件存储的路径
 
 
  dfs.client.failover.proxy.provider.mycluster
  org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider 指定HDFS客户端连接active namenode的java类
 
 
  dfs.ha.fencing.methods
  sshfence   配置隔离机制为 ssh
 
 
  dfs.ha.fencing.ssh.private-key-files
  /root/.ssh/id_rsa 指定秘钥的位置
 
 
  dfs.ha.automatic-failover.enabled
  true   开启自动故障转移
 


 3) vim yarn-site.xml

 
  yarn.nodemanager.aux-services
  mapreduce_shuffle
 
 
  yarn.resourcemanager.ha.enabled
  true
 
 
  yarn.resourcemanager.ha.rm-ids
  master,master-2
 
 
  yarn.resourcemanager.hostname.master
  master
 
 
  yarn.resourcemanager.hostname.master-2
  master-2
 
 
  yarn.resourcemanager.recovery.enabled
  true
 
 
  yarn.resourcemanager.store.class
  org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
 
 
  yarn.resourcemanager.zk-address
  node1:2181,node2:2181,node3:2181
 
 
  yarn.resourcemanager.cluster-id
  yarn-ha
 


4.同步master数据到所有集群主机
  for i in node{1..3} master-2; do rsync -avz /usr/local/hadoop  $i:/usr/local/; done
5.在node1,2,3启动zookeeper集群,并验证;
6.在master上初始化ZK集群
 bin/hdfs zkfc -formatZK
7.在node1,2,3启动JNS
 /usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode
8.在master格式化文件系统
 ./bin/hdfs namenode -format
9.格式化数据后把master的/var/hadoop/* 拷贝到master-2的/var/hadoop/
 [root@master-2 hadoop]#rsync -azSH --delete master:/var/hadoop/ /var/hadoop/
10.在master执行以下启动命令
  ./bin/hdfs namenode -initializeSharedEdits
  ./sbin/start-dfs.sh
11.在master和master-2上分别启动yarn
  ./sbin/start-yarn.sh  start
   ./sbin/start-dfs.sh
12.在node1,2,3停用journalnode
   sbin/hadoop-daemon.sh stop journalnode
13.查看集群状态(任意集群主机都可以)
  ./bin/hadoop dfsadmin -report
  bin/hdfs haadmin -getServiceState master
  bin/hdfs haadmin -getServiceState master-2

  ./bin/hadoop fs -ls hdfs://mycluster/
  ./bin/hadoop fs -mkdir hdfs://mycluster/abc
  ./bin/hadoop fs -ls hdfs://mycluster/
14.验证高可用,关闭一台状态为active namenode
  ./sbin/hadoop-daemon.sh  stop namenode
  查看是否还可以看到文件系统中的文件
  ./bin/hadoop fs -ls hdfs://mycluster/
  在查看之前状态为standby的namenode现在状态是否变为active
  如果可以看到文件,且状态为active,说明搭建OK