3_大数据之Hadoop完全分布式

目录 :
 1)准备3台客户机(关闭防火墙、静态ip、主机名称)
 2)安装JDK
 3)配置环境变量
 4)安装Hadoop
 5)配置环境变量
 6)配置集群
 7)单点启动
 8)配置ssh
 9)群起并测试集群


一 虚拟机准备
#!/bin/bash
#环境初始化脚本V1.0
#V2.0待优化项:
#   1. 增加下载相关软件操作:例如下载JDK mysql等 ----> 相关命令wget Curl Axel
#   2. 完成下载软件的配置修改操作:例如修改mysql hadoop配置等 ----> sed
#   3. 读取用户输入指令交互优化:在合适的地方提示用户输入相关内容 ----> 参考VMTools安装交互过程
#   4. 加入检查机制:例如判断文件是否存在,用户是否已经被创建等操作 ----> if
#   5. 加入容错机制:执行过程中发生Error以后的处理逻辑 ----> 
#   6. 增加下载前软件安装情况检查等 ----> 待考虑点是否需要增加用户选择逻辑
#   7. 难点 : 
#           1. 下载过程中网络波动问题导致文件下载失败;
#           2. 部分软件需要登录才能下载例如JDK,实现方式选择 : 携带签名访问或者通过三方资源站点下载

#读取用户输入
read -t 10 -p "Enter your user name in 10 seconds " username
read -t 10 -p "Enter your folder name in 10 seconds " foldernameone
read -t 10 -p "Enter your folder name in 10 seconds " foldernametwo
read -t 10 -p "Enter your starting value in 10 seconds " minvalue
read -t 10 -p "Enter your end value in 10 seconds " maxvalue
read -t 10 -p "Enter your ip number in 10 seconds " ip


#关闭防火墙
echo "关闭防火墙"
service iptables stop
chkconfig iptables off

#创建一个一般用户
echo "创建一般用户"
useradd $username
echo "123456" | passwd $username --stdin

#创建目录
echo "创建目录"
mkdir /opt/$foldernameone /opt/$foldernametwo
chown $username:$username /opt/$foldernameone /opt/$foldernametwo

#加入Sudoers
echo "加入Sudoers"
sed -i "/^root/a $username ALL=(ALL)       NOPASSWD: ALL" /etc/sudoers


lan=`ifconfig | grep Bcast | cut -d . -f 3`
#改Host
echo "修改hosts"
for ((i=$minvalue;i<$maxvalue;i++))
do
    echo "192.168.$lan.$i hadoop$i" >> /etc/hosts
done

#改网卡
echo "修改网卡"
cat <<EOF >/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.$lan.$ip
PREFIX=24
GATEWAY=192.168.$lan.2
DNS1=192.168.$lan.2
NAME=eth0
EOF

#改主机名
echo "修改主机"
sed -i "s/HOSTNAME=.*/HOSTNAME=hadoop$ip/g" /etc/sysconfig/network

#改网卡脚本
echo "修改网卡"
sed -i '/eth0/d' /etc/udev/rules.d/70-persistent-net.rules 
sed -i 's/eth1/eth0/g' /etc/udev/rules.d/70-persistent-net.rules

#重启使配置生效
reboot

二 编写集群分发脚本xsync
  1. scp(secure copy)安全拷贝

(1)scp定义:
  scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
(2)基本语法
  scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
  命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
(3)案例实操
  (a)在hadoop101上,将hadoop101/opt/module目录下的软件拷贝到hadoop102上 : scp -r /opt/module root@hadoop102:/opt/module
  (b)在hadoop103上,将hadoop101服务器上的/opt/module目录下的软件拷贝到hadoop103上.
  (c)在hadoop103上操作将hadoop101/opt/module目录下的软件拷贝到hadoop104上 : scp -r root@hadoop101:/opt/module root@hadoop104:/opt/module
注意:拷贝过来的/opt/module目录,别忘了在hadoop102、hadoop103、hadoop104上修改所有文件的,所有者和所有者组。sudo chown xxx:xxx -R /opt/module
  (d)将hadoop101/etc/profile文件拷贝到hadoop102/etc/profile上 : sudo scp /etc/profile root@hadoop102:/etc/profile
  (e)将hadoop101/etc/profile文件拷贝到hadoop103/etc/profile上 : sudo scp /etc/profile root@hadoop103:/etc/profile
  (f)将hadoop101/etc/profile文件拷贝到hadoop104/etc/profile
  注意:拷贝过来的配置文件别忘了source一下/etc/profile

  1. rsync 远程同步工具
    rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
    rsyncscp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去

(1)基本语法
rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数说明

(2)案例实操
  (a)把hadoop101机器上的/opt/software目录同步到hadoop102服务器的root用户下的/opt/目录 : rsync -av /opt/software/ hadoop102:/opt/software

  1. xsync集群分发脚本

(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
  (a)rsync命令原始拷贝:rsync -av /opt/module root@hadoop103:/opt/
  (b)期望脚本:xsync要同步的文件名称
  (c)说明:在/home/xxx/bin这个目录下存放的脚本,xxx用户可以在系统任何地方直接执行。
(3)脚本实现
  (a)在/home/xxx目录下创建bin目录,并在bin目录下xsync创建文件,文件内容如下

#!/bin/bash
# mkdir bin
# cd bin/
# touch xsync
# vi xsync
# 在该文件中编写如下代码
#1. 判断参数个数
if [ $# -lt 1 ]
then
   echo Not Enough Arguement!
   exit;
fi

#2. 遍历所有目录,挨个发送
for file in $@
do
   #4.5 判断文件是否存在
   if [ -e $file ]
   then
       #3. 获取父目录
       pdir=$(cd -P $(dirname $file); pwd)
       
       #4. 获取当前文件的名称
       fname=$(basename $file)
         
       #5. 遍历集群所有机器,拷贝
       for host in hadoop102 hadoop103 hadoop104
       do
           echo ====================    $host    ====================
           rsync -av $pdir/$fname $USER@$host:$pdir
       done
   else
       echo $file does not exists!
   fi
done

(b)修改脚本xsync具有执行权限 : chmod 777 xsync
(c)调用脚本形式:xsync 文件名称
注意:如果将xsync放到/home/xxx/bin目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin目录下

  1. SSH无密登录配置
  1. 配置ssh
    (1)基本语法 : ssh另一台电脑的ip地址;
    (2)ssh连接时出现Host key verification failed的解决方法
    (3)解决方案如下:直接输入yes
  2. 无密钥配置
    (1)免密登录原理

    (2)生成公钥和私钥 : ssh-keygen -t rsa
    (3)将公钥拷贝到要免密登录的目标机器上
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104

注意:
还需要在hadoop102上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop104; &emsp;还需要在hadoop103上采用xxx账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。

  1. .ssh文件夹下(~/.ssh)的文件功能解释

三 集群配置
  1. 集群部署规划
  2. 配置集群

(1)核心配置文件->配置core-site.xml : vim core-site.xml

<!-- 指定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)HDFS配置文件 : 配置hadoop-env.sh : vim hadoop-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
   配置hdfs-site.xml : vim hdfs-site.xml

<property>
     <name>dfs.replication</name>
     <value>3</value>
</property>

<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
     <name>dfs.namenode.secondary.http-address</name>
     <value>hadoop104:50090</value>
</property>

(3)YARN配置文件
 配置yarn-env.sh : vim yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
 配置yarn-site.xml : vim yarn-site.xml

<!-- 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>

(4)MapReduce配置文件
 配置mapred-env.sh : vim mapred-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
 配置mapred-site.xml : cp mapred-site.xml.template mapred-site.xml vim mapred-site.xml

<!-- 指定MR运行在Yarn上 -->
<property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
</property>
  1. 在集群上分发配置好的Hadoop配置文件 : xsync /opt/module/hadoop-2.7.2/
  2. 查看文件分发情况 : cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml

四 集群单点启动

(1)如果集群是第一次启动,需要格式化NameNode : hdfs namenode -format
(2)在hadoop102上启动NameNode : hadoop-daemon.sh start namenode jps
(3)在hadoop102hadoop103以及hadoop104上分别启动DataNode

hadoop-daemon.sh start datanode
jps

(4)思考:每次都一个一个节点启动,如果节点数增加到1000个怎么办?


五 集群群起
  1. 配置slaves : vim /opt/module/hadoop-2.7.2/etc/hadoop/slaves
hadoop102
hadoop103
hadoop104
# 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行

 同步所有节点配置文件 : xsync slaves

  1. 启动集群

(1)如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenodedatanode进程,然后再删除datalog数据): bin/hdfs namenode -format
(2)启动HDFS : sbin/start-dfs.sh
(3)启动YARN : sbin/start-yarn.sh
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN
(4)Web端查看SecondaryNameNode
 (a)浏览器中输入:http://hadoop104:50090/status.html
 (b)查看SecondaryNameNode信息

  1. 集群基本测试

(1)上传文件到集群
hdfs dfs -mkdir -p /user/xxx/input
hdfs dfs -put wcinput/wc.input /user/xxx/input
(2)上传文件后查看文件存放在什么位置
 (a)查看HDFS文件存储路径 : pwd
 (b)查看HDFS在磁盘存储文件内容 : cat blk_1073741825
(3)拼接 cat blk_1073741836>>tmp.file
(4)打包 tar -zxvf tmp.file
(5)下载 bin/hadoop fs -get /user/xxx/input/hadoop-2.7.2.tar.gz ./


六 集群启动/停止方式总结

1.各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件 : hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
(2)启动/停止YARN : yarn-daemon.sh start / stop resourcemanager / nodemanager

  1. 各个模块分开启动/停止(配置ssh是前提)常用
    (1)整体启动/停止HDFS : start-dfs.sh / stop-dfs.sh
    (2)整体启动/停止YARN : start-yarn.sh / stop-yarn.sh
七 集群时间同步

时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间

配置时间同步具体操作 :

  1. 时间服务器配置(必须root用户)
    (1)检查ntp是否安装 : rpm -qa|grep ntp
    (2)修改ntp配置文件 : vim /etc/ntp.conf
a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这>>台机器上查询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改2(集群在局域网中,不使用其他互联网上的时间)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst为
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服>>务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10

(3)修改/etc/sysconfig/ntpd文件 : vim /etc/sysconfig/ntpd

# 增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes

(4)重新启动ntpd服务 : service ntpd status ntpd 已停 service ntpd start 正在启动 ntpd: [确定]
(5)设置ntpd服务开机启动 : chkconfig ntpd on

  1. 其他机器配置(必须root用户)
    (1)在其他机器配置10分钟与时间服务器同步一次 : crontab -e */10 * * * * /usr/sbin/ntpdate hadoop102
    (2)修改任意机器时间 : date -s "2017-9-11 11:11:11"
    (3)十分钟后查看机器是否与时间服务器同步 date

Hadoop编译源码

1️⃣前期准备工作

  1. CentOS联网
    配置CentOS能连接外网。Linux虚拟机ping www.baidu.com 是畅通的
    注意:采用root角色编译,减少文件夹权限出现问题
  2. jar包准备(hadoop源码、JDK8mavenantprotobuf)

2️⃣jar包安装 : 注意:所有操作必须在root用户下完成

  1. JDK解压、配置环境变量 JAVA_HOMEPATH,验证java -version(如下都需要验证是否配置成功)
tar -zxf jdk-8u144-linux-x64.tar.gz -C /opt/module/
vim /etc/profile
#JAVA_HOME:
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
  1. Maven解压、配置 MAVEN_HOMEPATH
tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/
vim conf/settings.xml
<mirrors>
   <!-- mirror
    | Specifies a repository mirror site to use instead of a given >>repository. The repository that
    | this mirror serves has an ID that matches the mirrorOf element of >>this mirror. IDs are used
    | for inheritance and direct lookup purposes, and must be unique >>across the set of mirrors.
    |
<mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
     </mirror>
    -->
      <mirror>
               <id>nexus-aliyun</id>
               <mirrorOf>central</mirrorOf>
              <name>Nexus aliyun</name>
               <url>http://maven.aliyun.com/nexus/content/groups/public</url>
       </mirror>
</mirrors>
vi /etc/profile
#MAVEN_HOME
export MAVEN_HOME=/opt/module/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin
source /etc/profile
mvn -version
  1. ant解压、配置 ANT _HOMEPATH
tar -zxvf apache-ant-1.9.9-bin.tar.gz -C /opt/module/
vim /etc/profile
#ANT_HOME
export ANT_HOME=/opt/module/apache-ant-1.9.9
export PATH=$PATH:$ANT_HOME/bin
source /etc/profile
ant -version
  1. 安装 glibc-headersg++ 命令如下
yum install glibc-headers
yum install gcc-c++
  1. 安装makecmake
yum install make
yum install cmake
  1. 解压protobuf,进入到解压后protobuf主目录,/opt/module/protobuf-2.5.0,然后相继执行命令
tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
cd /opt/module/protobuf-2.5.0/
./configure 
make 
make check
make install
ldconfig
vim /etc/profile
#LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0
export PATH=$PATH:$LD_LIBRARY_PATH
source /etc/profile
验证命令:protoc --version
  1. 安装openssl
yum install openssl-devel
  1. 安装ncurses-devel
yum install ncurses-devel

到此,编译工具安装基本完成

3️⃣编译源码

  1. 解压源码到/opt/目录 : tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/;
  2. 进入到hadoop源码主目录 : pwd;
  3. 通过maven执行编译命令 : mvn package -Pdist,native -DskipTests -Dtar等待时间30分钟左右,最终成功是全部SUCCESS,如下图所示 :
  4. 成功的64位hadoop包在/opt/hadoop-2.7.2-src/hadoop-dist/target
  5. 编译源码过程中常见的问题及解决方案
    (1)MAVEN install时候JVM内存溢出
     处理方式:在环境配置文件和maven的执行文件均可调整MAVEN_OPTheap大小。(详情查阅MAVEN 编译 JVM调优问题,如:http://outofmemory.cn/code-snippet/12652/maven-outofmemoryerror-method
    (2)编译期间maven报错。可能网络阻塞问题导致依赖库下载不完整导致,多次执行命令(一次通过比较难):mvn package -Pdist,nativeN -DskipTests -Dtar
    (3)报ant、protobuf等错误,插件下载未完整或者插件版本问题,最开始链接有较多特殊情况,同时推荐
    (4)2.7.0版本的问题汇总帖子 http://www.tuicool.com/articles/IBn63qf

九 常见错误及解决方案

1)防火墙没关闭、或者没有启动YARN : INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主机名称配置错误
3)IP地址配置错误
4)ssh没有配置好
5)root用户和xxx两个用户启动集群不统一
6)配置文件修改不细心
7)未编译源码 Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032

8)不识别主机名称

java.net.UnknownHostException: hadoop102: hadoop102
       at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
       at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitte>>r.java:146)
       at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
       at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
       at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)

解决办法:
(1)在/etc/hosts文件中添加192.168.1.102 hadoop102
(2)主机名称不要起hadoop hadoop000等特殊名称

9)DataNodeNameNode进程同时只能工作一个

10)执行命令不生效,粘贴word中命令时,遇到-和长–没区分开。导致命令失效

解决办法:尽量不要粘贴word中代码

11)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。原因是在linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
12)jps不生效。
 原因:全局变量hadoop java没有生效。解决办法:需要source /etc/profile文件。
13)8088端口连接不上

cat /etc/hosts
注释掉如下代码
#127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         hadoop102
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容