1 大数据概述
1.1 什么是大数据(bigdata)?
大数据诞生背景:
大数据本身是一个抽象的概念。
简单来讲,大数据可以分开来看,即大和数据,也就是非常多的数据组成的数据集合称之为大数据。
那什么样的数据量可以算的上大呢?比如TB级别,PB级别以及更大
数据又包含哪些分类?
1.文本数据
2.图片数据
3.音频数据
4.视频数据
大数据的主要特点(4V)
1)Volume:数据体量巨大
随着移动端和互联网的兴起,数据集合的规模不断扩大,已经从 GB 级增加到 TB 级再增加到 PB 级,近年来,数据量甚至开始以 EB 和 ZB 来计数。
存储单位如下:
1 Byte(B 字节)= 8 bit
1KB(Kilobyte 千字节)= 1024 B
1MB(Megabyte 兆字节 简称“兆”)= 1024 KB
1GB(Gigabyte 吉字节 又称“千兆”)= 1024 MB
1TB(Trillionbyte 万亿字节 太字节)= 1024 GB
1PB(Petabyte 千万亿字节 拍字节)= 1024 TB
1EB(Exabyte 百亿亿字节 艾字节)= 1024 PB
1ZB(Zettabyte 十万亿亿字节 泽字节)= 1024 EB
2)Velocity:大数据的数据产生、处理和分析的速度在持续加快
加速的原因是数据创建的实时性特点,以及将流数据结合到业务流程和决策过程中的需求。
数据处理速度快,处理模式已经开始从批处理转向流处理。
业界对大数据的处理能力有一个称谓——“ 1 秒定律”,也就是说,可以从各种类型的数据中快速获得高价值的信息。大数据的快速处理能力充分体现出它与传统的数据处理技术的本质区别。
3)Variety:大数据的数据类型繁多
现在的数据类型不再只是结构化数据,更多的是半结构化或者非结构化数据,如 XML、邮件、博客、即时消息、视频、照片、点击流、 日志文件等。
4)Value:表示大数据的数据价值密度低,商业价值高
大数据由于体量不断加大,单位数据的价值密度在不断降低,然而数据的整体价值在提高。
以监控视频为例,在一小时的视频中,有用的数据可能仅仅只有一两秒,但是却会非常重要。
现在许多专家已经将大数据等同于黄金和石油,这表示大数据当中蕴含了无限的商业价值。
通过对大数据进行处理,找出其中潜在的商业价值,将会产生巨大的商业利润。
1.2 大数据产生
1)PC端应用系统**
早期移动互联网发展不是很快的时候,数据的来源绝大部分来自于PC端的应用,比如在电脑端进行聊天,购物,发微博等等。
2)手机端应用系统
随着互联网和移动终端的兴起,用户会通过社交App来主动发朋友圈、发微博、通过电商App或者小程序购买商品等,而且还特别便捷,这会产生大量的数据。
3)工业设备
随着工业化技术的发展,企业利用传感器来获取工业设备运行数据,进而监控机器的运行情况。这些设备会源源不断地产生新数据。
4)数据爬取
通过爬虫技术爬取过来的数据
1.3 大数据的作用?
现在正是大数据的时代,大数据在各行各业也发挥着越来越多的作用。
比如:
1)电商、零售行业,通过对用户购买行为的分析,细分市场、精准营销。
2)企业通过大数据技术,来分析生产的各个环节,提高生产效率。
3)通过数据采集技术,抓取互联网上的信息,并提取,比如:新闻采集。
随着互联网+的兴起,产生的数据会越来越多,数据的作用会越来大。
以后是得数据者得天下,各大互联网企业也在争抢数据来源。而且国家也开始重视大数据,防止数据外泄威胁国家安全,国家出台很多政策。
1.4 大数据的数据处理流程
第一阶段 : 数据抽取与集成
将不同数据源、不同类型的数据统一格式,存储到分布式文件系统中。
没有大数据技术前:存储到MySQL、oracle这种关系型数据库(单机瓶颈)。
有大数据技术后:存储到如hdfs分布式文件系统中(可多机存储和分析)。
第二阶段 : 数据分析
数据分析是整个大数据处理流程的核心。
数据分析包括 普通统计分析、算法分析(数据挖掘),通过分析数据产生价值。
数据分析通常有两种:
离线处理分析:
对一段时间内海量的离线数据进行统一的处理,对应的处理框架有 MapReduce、Spark。
数据有范围,对时间性要求不高。
实时处理分析:
对运动中的数据进行处理,即在接收数据的同时就对其进行处理,对应的处理框架有Storm、Spark Streaming、Flink。
数据没有范围(随着时间的流逝数据在产生),对时间性要求高。
随着处理框架的完善,也可以用SQL来对数据进行统计分析,如hiveSQL, sparkSQL。
第三阶段 : 数据解释
数据分析是大数据处理的核心,但是用户往往更关心对结果的解释。
通过数据可视化,将分析的结果形象的展现在数据大屏上,使用户更易于理解和接受。
1.5 大数据处理技术
对大数据技术的基本概念进行简单介绍,包括服务器集群,分布式存储和分布式计算 大数据技术。
1.5.1 服务器集群
单台服务器会有性能瓶颈,比如磁盘,CPU,内存等
服务器集群是一种提升服务器整体计算能力的解决方案。它是由互相连接在一起的服务器群组成的一个并行式或分布式系统。
通俗解释:
服务器集群由多台机器组成在一起
提供各种服务,比如存储的服务(hdfs)、计算的服务(mapreduce)等
由于服务器集群中的服务器运行同一个计算任务,因此,从外部看,这群服务器表现为一台虚拟的服务器,对外提供统一的服务。
尽管单台服务器的运算能力有限,但是将成百上千的服务器组成服务器集群后,整个系统就具备了强大的运算能力,可以支持大数据分析的运算负荷。
Google、Amazon, 阿里巴巴的计算中心里的服务器集群都达到了 5000 台服务器的规模。
1.5.2 分布式存储
单机版的时候是将数据放到一台机器的磁盘中,但是随着数据量的增多,一台机器的磁盘空间不够,所以需要使用服务器集群在存储超大文件,只需要将大文件拆分成多份小文件,分别存放到不同的服务器节点。
1.5.3 分布式计算
随着数据越来越大,单机的计算能力遇到瓶颈,处理时间太长,需要多台服务器利用更多的资源对数据进行处理,每台服务器节点计算数据的一部分, 而且是多台计算机同时计算,处理数据的速度会远高于单个计算机。
2 hadoop概述
2.1 Hadoop简介
Hadoop是一个分布式的、可靠的、可扩展的用于存储超大文件的存储和计算的项目
2.2 hadoop的历史起源
创始人: Doug Cutting 和 Mike Cafarella !
历史起源:
2002开始,两位创始人开发开源搜索引擎解决方案: Nutch,爬取了互联网上上亿条数据,怎么将数据存储起来成了难题。
2004年,基于Google发表的一篇论文《The Google File System 》,设计实现了《Nutch Distributed File System》简称NDFS,怎么对这些数据进行计算成了问题。
同年,Google又发表了篇论文《MapReduce 》,俩人基于这篇论文设计实现了MapReduce ,解决了分布式计算的问题。
2006年2月,Nutch中的NDFS和MapReduce独立出来,成为Apache Lucene项目的子项目,称为Hadoop;创始人Dong Cutting加盟雅虎公司。
2.3 hadoop核心组件和框架演变用于解决两个核心问题:存储和计算核心组件
1)Hadoop Common:
- common 包括Hadoop常用的工具类,由原来的Hadoopcore部分更名而来。主要包括系统配置工具Configuration、远程过程调用RPC、序列化机制和Hadoop抽象文件系统FileSystem等
2)Hadoop Distributed FileSystem(HDFS):解决存储问题
3)Hadoop MapReduce(分布式计算框架)--> 解决计算问题
4)Hadoop YARN(分布式资源管理器)--> 解决资源管理
hadoop的框架演变
Hadoop1.0 的 MapReduce(MR1):集资源管理和任务调用、计算功能绑在一起,扩展性较差,不支持多计算框架。Hadoop2.0 的Yarn(MRv2):将资源管理和任务调用两个功能分开,提高扩展性,并支持多计算框架 。
2.4 Hadoop 生态圈
Hadoop 生态圈包括以下主要组件。
1)HDFS(Hadoop分布式文件系统)
HDFS是一种数据分布式保存机制,数据被保存在计算机集群上。数据写入一次,读取多次。HDFS 为HBase等工具提供了基础。
2)MapReduce(分布式计算框架)
MapReduce是一种分布式计算模型,用以进行大数据量的计算,是一种离线计算框架。
这个 MapReduce 的计算过程简而言之,就是将大数据集分解为成若干个小数据集,每个(或若干个)数据集分别由集群中的一个结点(一般就是一台主机)进行处理并生成中间结果,然后将每个结点的中间结果进行合并, 形成最终结果。
3)HBASE(分布式列存数据库)
HBase是一个建立在HDFS之上,面向列的NoSQL数据库,用于快速读/写大量数据。HBase使用Zookeeper进行管理,确保所有组件都正常运行。
4)Flink(分布式处理引擎)
Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。
5)flume(分布式日志收集系统)
Flume是一个分布式、可靠、和高可用的海量日志聚合的系统,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。
6)Storm(流示计算、实时计算)
Storm是一个免费开源、分布式、高容错的实时计算系统。Storm令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求。Storm经常用于在实时分析、在线机器学习、持续计算、分布式远程调用和ETL等领域。
7)Zookeeper(分布式协作服务)
Hadoop的许多组件依赖于Zookeeper,它运行在计算机集群上面,用于管理Hadoop操作。
作用:解决分布式环境下的数据管理问题:统一命名,状态同步,集群管理,配置同步等。
9)Hive(数据仓库)
Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务在Hadoop上执行。通常用于离线分析。
HQL用于运行存储在Hadoop上的查询语句,Hive让不熟悉MapReduce开发人员也能编写数据查询语句,然后这些语句被翻译为Hadoop上面的MapReduce任务。
10)Spark(内存计算模型)
Spark提供了一个更快、更通用的数据处理平台。和Hadoop相比,Spark可以让你的程序在内存中运行时速度提升100倍,或者在磁盘上运行时速度提升10倍。
11)DolphinScheduler(工作流调度器)
DolphinScheduler可以把多个Map/Reduce作业组合到一个逻辑工作单元中,从而完成更大型的任务。
12)Mahout(数据挖掘算法库)
Mahout的主要目标是创建一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。
13)Hadoop YARN(\分布式资源管理器)****
YARN是下一代MapReduce,即MRv2,是在第一代MapReduce基础上演变而来的,主要是为了解决原始Hadoop扩展性较差,不支持多计算框架而提出的。
其核心思想:
将MR1中JobTracker的资源管理和作业调用两个功能分开,分别由ResourceManager和ApplicationMaster进程来实现。
1)ResourceManager:负责整个集群的资源管理和调度
2)ApplicationMaster:负责应用程序相关事务,比如任务调度、任务监控和容错等
14)Tez(DAG计算模型)
一个运行在YARN之上支持DAG(有向无环图)作业的计算框架。
Tez的目的就是帮助Hadoop处理这些MapReduce处理不了的用例场景,如机器学习。
2.5 Hadoop 发行版本
Apache(先学这个)
- 企业实际使用并不多。最原始(基础)版本。这是学习hadoop的基础。我们就是用的最原始的这个版本
cloudera --> CDH版(后学这个)
- 对hadoop的升级,打包,开发了很多框架。flume、hue、impala都是这个公司开发
- 2008 年成立的 Cloudera 是最早将 Hadoop 商用的公司,为合作伙伴提 供 Hadoop 的商用解决方案,主要是包括支持,咨询服务,培训。
- 2009年Hadoop的创始人 Doug Cutting也加盟 Cloudera公司。Cloudera 产品主要 为 CDH,Cloudera Manager,Cloudera Support
- CDH是Cloudera的Hadoop发行版,完全开源,比Apache Hadoop在兼容性,安全 性,稳定性上有所增强。
- Cloudera Manager是集群的软件分发及管理监控平台,可以在几个小时内部署 好一个Hadoop集群,并对集群的节点及服务进行实时监控。Cloudera Support即 是对Hadoop的技术支持。
- Cloudera 的标价为每年每个节点4000美元。Cloudera开发并贡献了可实时处理大 数据的Impala项目。
Hortonworks --> HDP+Ambari
- 2011年成立的Hortonworks是雅虎与硅谷风投公司Benchmark Capital合资组建
- 公司成立之初就吸纳了大约25名至30名专门研究Hadoop的雅虎工程师,上述工 程师均在2005年开始协助雅虎开发Hadoop,贡献了Hadoop 80%的代码。
- 雅虎工程副总裁、雅虎Hadoop开发团队负责人Eric Baldeschwieler出任Hortonworks的首席执行官。
- Hortonworks 的主打产品是Hortonworks Data Platform (HDP),也同样是100%开 源的产品,HDP除常见的项目外还包含了Ambari,一款开源的安装和管理系统
- HCatalog,一个元数据管理系统,HCatalog现已集成到Facebook 开源的Hive中
。Hortonworks的Stinger开创性地极大地优化了Hive项目。Hortonworks为入门提 供了一个非常好的,易于使用的沙盒。 - Hortonworks开发了很多增强特性并提交至核心主干,这使得Apache Hadoop能 够在包括Windows Server和Windows Azure在内的Microsoft Windows平台上本地 运行。
- 定价以集群为基础,每10个节点每年为12500美元。
3 服务器集群搭建
3.1 集群方式
本地模式:windows伪集群,本地开发。(自己电脑)
集群部署:完全分布式。(通过海牛实验室平台搭建)
公司环境 : 完全分布式
3.2 部署环境
伪集群 --> windows环境下
集群 --> 通过海牛实验室平台搭建
访问http://cloud.hainiubl.com/#/home 海牛实验室的首页
3.3 软件准备
集群环境准备
选择6台linux组件并配置cpu和内存
下载 hadoop3.x 安装包 我们使用的hadoop版本是 3.1.4
3.4 部署计划
计算机的组成:
规划存储节点:
规划计算节点:
最终集群配置方案:
集群部署规划,6台服务器:
一个主节点:nn1
两个从节点:nn2,nn3
三个工作节点:s1、s2、s3
注意:计算机名 --> 不要修改了,后面安装的所有组件都涉及主机名称。
在企业里还应有操作机(跳板机)防止服务器中毒,用跳板机联网做炮灰
我们机房里的服务器就是这么设置的
内部集群 ---->操作机op.hadoop (vpn) --------> 外网(电脑搞个vpn)
3.5 初始化环境
3.5.1 配置阿里云 yum 源
1)安装sz rz工具,用于以后用rz sz上传下载文件
yum install -y lrzsz
2)下载 repo 文件
文件下载地址: http://mirrors.aliyun.com/repo/Centos-7.repo
3)用 rz 将下载的 Centos-7.repo 文件上传到Linux系统的某个目录下
4)备份并替换系统的repo文件
cp Centos-7.repo /etc/yum.repos.d/
cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo.bak
mv Centos-7.repo CentOS-Base.repo
5)执行yum源更新命令
yum clean all
#服务器的包信息下载到本地电脑缓存起来
yum makecache
yum update -y
配置完毕。
3.5.2 安装常用软件
yum install -y openssh-server vim gcc gcc-c++ glibc-headers bzip2-devel lzo-devel curl wget openssh-clients zlib-devel autoconf automake cmake libtool openssl-devel fuse-devel snappy-devel telnet unzip zip net-tools.x86_64 firewalld systemd ntp unrar bzip2
3.5.3 安装JDK
1 JDK 下载地址
找到 /public/software/java下的jdk软件 jdk-8u144-linux-x64.rpm
2 安装JDK
#默认安装到了/usr目录下
rpm -ivh jdk-8u144-linux-x64.rpm
-ivh:安装时显示安装进度
3 配置JDK 环境变量
1)修改系统环境变量文件 /etc/profile,**在文件尾部追加以下内容**
使用批量命令进行执行
echo 'export JAVA_HOME=/usr/java/jdk1.8.0_144' >> /etc/profile
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile
2) 使修改生效,并配置JDK
#使修改生效
source /etc/profile
#查看系统变量值
echo $PATH
#检查JDK 配置情况
java -version
3.5.4 修改主机名
#所有服务器节点执行修改主机名
vim /etc/hostname
#修改完后用hostname可查看当前主机名
hostname
#并配置hosts文件 添加主机名和ip地址的映射
vim /etc/hosts
# 修改第一台机器的ip映射文件,然后分发都各个不同的机器上面 xxx代表其他服务器主机名
scp /etc/hosts root@xxx:/etc
3.5.5 创建hadoop 用户并设置密码
#创建hadoop用户
useradd hadoop
#给hadoop用户设置密码: 12345678
echo "12345678"|passwd hadoop --stdin
3.5.6 禁止非 wheel 组用户切换到root,配置免密切换root
通常情况下,一般用户通过执行“su -”命令、输入正确的root密码,可以登录为root用户来对系统进行管理员级别的配置。
但是,为了更进一步加强系统的安全性,有必要建立一个管理员的组,只允许这个组的用户来执行 “su -” 命令登录为 root 用户,而让其他组的用户即使执行 “su -” 、输入了正确的 root 密码,也无法登录为 root 用户。在UNIX和Linux下,这个组的名称通常为 “wheel” 。
1)修改/etc/pam.d/su配置
su 时要求 这个用户必须加入到wheel组,否则权限不足
修改/etc/pam.d/su文件,将“#auth\t\trequired\tpam_wheel.so”,替换成“auth\t\trequired\tpam_wheel.so”
修改/etc/pam.d/su文件,将字符串“#auth\t\tsufficient\tpam_wheel.so”替换成“auth\t\tsufficient\tpam_wheel.so”
sed -i 's/#auth\t\trequired\tpam_wheel.so/auth\t\trequired\tpam_wheel.so/g' '/etc/pam.d/su'
sed -i 's/#auth\t\tsufficient\tpam_wheel.so/auth\t\tsufficient\tpam_wheel.so/g' '/etc/pam.d/su'
命令说明:修改某个文件,并替换文件里的内容,命令格式:
#-i :直接修改读取的文件内容,而不是输出到终端。
sed -i 's/要被取代的字串/新的字串/g' '文件名'
2)修改/etc/login.defs文件只有wheel组可以su 到root
# 先备份一个
cp /etc/login.defs /etc/login.defs_back
# 把“SU_WHEEL_ONLY yes”字符串追加到/etc/login.defs文件底部
echo "SU_WHEEL_ONLY yes" >> /etc/login.defs
tail /etc/login.defs 从文件底部查看
3) 添加用户到管理员,禁止普通用户su 到 root
#把hadoop用户加到wheel组里
gpasswd -a hadoop wheel
#查看wheel组里是否有hadoop用户
cat /etc/group | grep wheel
4)用vuser1 用户验证一下,由于vuser1 没有在wheel 组里,所以没有 su - root 权限。**
useradd vuser1
su - vuser1
su - 是直接切换到root用户
海牛实验室的root用户的密码默认是hainiu
5)验证免密码切换到 root 用户
3.5.7 给hadoop用户,配置SSH密钥
配置SSH密钥的目的:使得多台机器间可以免密登录。实现原理:公钥加密私钥解密,称为非对称加密。
加密和解密是同一套秘钥,称为对称加密。 使用ssh-keygen在nn1 上生成private和public密钥,将生成的public密钥注册到远程机器,这样nn1就可以远程连接其他服务器了
#切换到hadoop用户
su – hadoop
#生成ssh公私钥
ssh-keygen
#将公钥注册给其他服务器 xxx代表其他服务器的主机名
ssh-copy-id xxx
如果想要其他服务器可以连接nn1,并且实现两两互联,需要将private秘钥发送至其他服务器,并且nn1需要给自己注册一份public秘钥
#将私钥远程拷贝到其他服务器 xxx代表其他服务器的主机名
scp /home/hadoop/.ssh/id_rsa hadoop@xxx:/home/hadoop/.ssh/
#nn1给自己注册一份公钥
ssh-copy_id nn1
4 hadoop多服务器批量操作
4.1 如何获取当前执行脚本的路径
用dirname $0
。
这个命令写在脚本文件里才有作用,他返回这个脚本文件放置的目录,这样就可以知道一些和脚本一起部署的文件的位置了,只要知道相对位置就可以根据这个目录来定位,而可以不用关心绝对位置。这样脚本的可移植性就提高了,扔到任何一台服务器,(如果是部署脚本)都可以执行。
#! /bin/bash
#获取脚本的当前位置
cd `dirname $0`
#输出脚本位置
echo `pwd`
4.2 命令说明及使用
4.2.1 scp 命令
scp 就是secure copy,一个在linux下用来进行远程拷贝文件的命令。
格式:
scp 文件名 登录用户名@目标机器IP或主机名:目标目录
示例:
scp /home/hadoop/f1 hadoop@s1.hadoop:/home/hadoop/
4.2.2 ssh 命令1)指定用户登录其他机器
ssh 登录用户名@目标ip或主机名
示例:ssh hadoop@s1.hadoop
2)指定用户登录其他机器执行某些命令
ssh 登录用户名@目标ip或主机名 命令
示例:ssh hadoop@s1.hadoop ls
4.2.3 eval命令
如何动态执行拼接的SSH 命令, 通过 eval 命令 eval命令会计算(evalue)它的参数,这些参数作为表达式计算后重新组合为一个字符串,然后作为一个命令被执行。 eval最常见的用法是将动态生成的命令行计算并执行。 示例:
name=hadoop
cmd="echo hello $name\! "
eval $cmd
4.3 批量脚本说明及使用
- ips :用于存放要操作的主机列表,用回车或空格隔开
- scp_all.sh :用hadoop用户拷贝当前机器的文件到其他操作机(多机分发脚本)
- ssh_all.sh :用hadoop 用户可登陆其他操作机执行相应操作(多机操作脚本)
- exe.sh : 执行su 命令,与ssh_root.sh 配套使用 ssh_root.sh : 用hadoop 用户登录其他操作机,并su 到 root 用户,以root 用户执行相应操作,与exe.sh 配套使用(root权限多机操作脚本)
4.3.1 ips
ips :用于存放要操作的主机列表,用回车或空格隔开
#在hadoop的家目录下创建bin目录,在bin目录中编写ips文件
nn1
nn2
nn3
s1
s2
s3
4.3.2 ssh_all.sh
用hadoop 用户可登陆其他操作机执行相应操作
在bin目录中编写ssh_all.sh
#! /bin/bash
# 进入到当前脚本所在目录
cd `dirname $0`
# 获取当前脚本所在目录
dir_path=`pwd`
#echo $dir_path
# 读ips文件得到数组(里面是一堆主机名)
ip_arr=(`cat $dir_path/ips`)
# 遍历数组里的主机名
for ip in ${ip_arr[*]}
do
# 拼接ssh命令: ssh hadoop@nn1.hadoop ls
cmd_="ssh hadoop@${ip} \"$*\" "
echo $cmd_
# 通过eval命令 执行 拼接的ssh 命令
if eval ${cmd_} ; then
echo "OK"
else
echo "FAIL"
fi
done
执行结果:
4.3.3 scp_all.sh
用hadoop用户拷贝当前机器的文件到其他操作机
#! /bin/bash
# 进入到当前脚本所在目录
cd `dirname $0`
# 获取当前脚本所在目录
dir_path=`pwd`
#echo $dir_path
# 读ips文件得到数组(里面是一堆主机名)
ip_arr=(`cat $dir_path/ips`)
# 源
source_=$1
# 目标
target=$2
# 遍历数组里的主机名
for ip in ${ip_arr[*]}
do
# 拼接scp命令: scp 源 hadoop@nn1.hadoop:目标
cmd_="scp -r ${source_} hadoop@${ip}:${target}"
echo $cmd_
# 通过eval命令 执行 拼接的scp 命令
if eval ${cmd_} ; then
echo "OK"
else
echo "FAIL"
fi
done
测试执行结果
但是此脚本不具备root权限,所以在执行某一些命令的时候会报权限错误
4.3.4 exe.sh
执行su 命令,与ssh_root.sh 配套使用 ,
#切换到root用户执行cmd命令
cmd=$*
su - << EOF
$cmd
EOF
测试:
4.3.5 ssh_root.sh
用hadoop 用户登录其他操作机,并su 到 root 用户,以root 用户执行相应操作,与exe.sh 配套使用
exe.sh 需要传到每一台服务器的/home/hadoop目录下
#! /bin/bash
# 进入到当前脚本所在目录
cd `dirname $0`
# 获取当前脚本所在目录
dir_path=`pwd`
#echo $dir_path
# 读ips文件得到数组(里面是一堆主机名)
ip_arr=(`cat $dir_path/ips`)
# 遍历数组里的主机名
for ip in ${ip_arr[*]}
do
# 拼接ssh命令: ssh hadoop@nn1.hadoop ls
cmd_="ssh hadoop@${ip} ~/exe.sh \"$*\""
echo $cmd_
# 通过eval命令 执行 拼接的ssh 命令
if eval ${cmd_} ; then
echo "OK"
else
echo "FAIL"
fi
done
测试: