Hadoop7.08

昨日内容概要

  • Hadoop环境准备

    1.解压hadoop压缩包(2.X版本)
    2.配置环境变量并重新加载
    3.检测是否正常启动
    
  • Hadoop目录结构

    bin
    	程序文件
    etc
    	配置文件
    share
    	说明文档
    sbin
    	操作命令
    readme
    	产品说明
    
  • Hadoop官网案例

    1.grep过滤案例
    	hadoop jar share/....  grep  目标文件  输出位置
    2.wordcount统计案例
    	hadoop jar share/....  word  目标文件  输出位置
    
  • 异常情况

    服务无法正常启动或者中途自动结束的情况
    	1.配置文件书写格式不到位
        2.计算机硬件设备要求不够
    
  • 伪分布式

    分布式:将一个整体拆分成多个个体分撒在不同的机器上运行
    伪分布式:用一台机器模拟多台机器的效果
    完全分布式:真正的使用多台机器
        
    说白了 在linux中所有的功能基本都是靠配置文件的形式来实现
    hadoop/etc/hadoop2.X
    
    配置文件常见后缀名
    	.xml
        .ini
        .conf
    
    常见软件端口号
    	50070  # hadoop hdfs
        8088  # hadoop yarn/mapreduce
        3306  # MySQL
        6379  # redis
        27017  # mongodb
    
  • 完全分布式

    1.多台机器准备
    2.文件拷贝
    	全量拷贝
        	scp 
        增量拷贝
        	rsync
    3.如何高效管理多台机器
    	自定义内容分发脚本(shell语言)
        	1.脚本文件代码格式
            2.修改文件权限chmod
    

今日内容概要

  • 完全分布式环境搭建

    可能会出现你们的机器无法操作的局面
    	不停的使用jps查看 哪个服务停了就去启动
    
  • 配置集群

  • 单点启动

    一台台机器依次启动(效率低下 不推荐)
    
  • ssh配置

    公钥私钥交互
    
  • 群起配置

    一台机器可以操作集群所有机器(实际工作推荐)
    

今日内容详细

完全分布式(开发重点)

1)准备 3台客户机
2)安装 JDK
3)配置环境变量
4)安装 Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置 ssh
9)群起并测试集群

详细:
1)准备 3台客户机(关闭防火墙、静态 ip、主机名称) 
	克隆机器修改主机名和主机IP地址
2)安装 JDK
	利用scp命令拷贝数据文件至三个客户机
  	scp -r /opt/module root@hadoop102:/opt/module
    scp -r /opt/module root@hadoop103:/opt/module
    scp -r /opt/module root@hadoop104:/opt/module
    """
    也可以在A机器将B机器文件拷贝给C机器
    scp -r root@hadoop101:/opt/module root@hadoop103:/opt/module
    """
  # 扩展:拷贝文件的命令有scp(全量拷贝)、rsync(增量拷贝)
  """
  scp(全量拷贝)
  scp    -r       $pdir/$fname       $user@hadoop$host:$pdir/$fname
  命令		递归		要拷贝的文件路径/名称			目的用户@主机:目的路径/名称
  
  rsync(增量拷贝)
  rsync  -rvl     $pdir/$fname	     $user@hadoop$host:$pdir/$fname
  命令	 选项参数	 要拷贝的文件路径/名称		目的用户@主机:目的路径/名称
  参数详解
  	r	递归
  	v	显示复制过程
  	l	拷贝符号连接
  """   
3)配置环境变量
	1.利用scp命令拷贝环境变量文件至三个客户机
  	scp	/etc/profile root@hadoop102:/etc/profile
    scp	/etc/profile root@hadoop103:/etc/profile
    scp	/etc/profile root@hadoop104:/etc/profile
  
  2.source文件配置
  	source /etc/profile
  
  3.验证是否成功
  	java 
4)扩展:集群分发脚本
  复制文件到所有节点的相同目录下
  1.在/usr/local/bin下创建sync文件并填写以下内容
     [jason@hadoop102 ~]$ cd /usr/local/bin
     [jason@hadoop102 bin]$ touch xsync 
     [jason@hadoop102 bin]$ vi xsync
      """
      文件内容
      #!/bin/bash
      #1 获取输入参数个数,如果没有参数,直接退出
      pcount=$#
      if((pcount==0)); then
      echo no args;
      exit;
      fi
      #2 获取文件名称
      p1=$1 fname=`basename $p1` 
      echo fname=$fname
      #3 获取上级目录到绝对路径
      pdir=`cd -P $(dirname $p1); pwd` 
      echo pdir=$pdir
      #4 获取当前用户名称 
      user=`whoami`
      #5 循环
      for((host=103; host<105; host++)); do
      	echo ------------------- hadoop$host --------------
      	rsync -rvl $pdir/$fname $user@hadoop$host:$pdir 
      done
      """
  2.修改权限
  	chmod 777 xsync
  3.测试
  		在当前机器随便找一个其他机器没有的目录
      	xsync test/
  
5)集群配置
	集群部署规划
  hadoop102						hadoop103			 hadoop104
  HDFS	NameNode/DataNode		 DataNode		 SecondaryNameNode/DataNode	
  YARN  NodeManager		ResourceManager/NodeManager    NodeManager
  '''在102上修改,然后用xsync脚本直接同步'''
  1.配置 core-site.xml(修改主机名即可)
  [jason@hadoop102 hadoop]$ vi 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 配置文件
  	1.配置 hadoop-env.sh
     [jason@hadoop102 hadoop]$ vi hadoop-env.sh 
     """内容(有就不用改了)
     export JAVA_HOME=/opt/module/jdk1.8.0_144
     """
     
    2.配置 hdfs-site.xml(将伪分布式配置删除添加下列配置)
     [jason@hadoop102 hadoop]$ vi hdfs-site.xml
      """内容
      <!-- 指定 Hadoop 辅助名称节点主机配置 --> 
      <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:50090</value> 
      </property>
      """
  3.YARN 配置文件
  	1.配置 yarn-env.sh
     [jason@hadoop102 hadoop]$ vi yarn-env.sh 
      """内容(有就不用改了)
      export JAVA_HOME=/opt/module/jdk1.8.0_144
      """
    2.配置 yarn-site.xml(修改主机名即可)
    	[jason@hadoop102 hadoop]$ vi 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 配置文件
  	1.配置 mapred-env.sh
     [jason@hadoop102 hadoop]$ vi mapred-env.sh 
      """内容(伪分布式配了就不用改了)
      export JAVA_HOME=/opt/module/jdk1.8.0_144
      """
    2.配置 mapred-site.xml(伪分布式配了就不用改了)
     [jason@hadoop102 hadoop]$ cp mapred-site.xml.template mapred-site.xml
		 [jason@hadoop102 hadoop]$ vi mapred-site.xml
    	"""内容
      <!-- 指定 MR 运行在 Yarn 上 --> 
      <property>
    		 <name>mapreduce.framework.name</name>
         <value>yarn</value>
    	</property>
      """
    3.在集群上分发配置好的 Hadoop 配置文件
    [jason@hadoop102 etc]$ xsync hadoop/
    4.查看文件分发情况
    [jason@hadoop103 hadoop]$ cat /opt/module/hadoop-
2.7.2/etc/hadoop/core-site.xml

集群单点启动

1.如果集群是第一次启动,需要格式化 NameNode(我们不是 因为前面弄了伪分布式)
	[jason@hadoop102 hadoop-2.7.2]$ hadoop namenode -format
	"""
  如果集群不是第一次启动,需要删除data和logs目录
	[jason@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
  [jason@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/
  [jason@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/
	""" 
  
2.在 hadoop102 上启动 NameNode和DataNode
	[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
  [jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode

3.去103和104启动datanode(namenode就一个)
	[jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
  [jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
  
4.浏览器验证
	hadoop102:50070

集群ssh配置

"""
上述单点启动的方式每次都一个一个节点启动
如果节点数量很多该如何解决
"""
# 公钥私钥工作原理
# 知识补充:查看know_hosts文件(访问过的主机地址)
[jason@hadoop102 ~]$ ll      # 无法查看
[jason@hadoop102 ~]$ ls -al  # 可以查看
[jason@hadoop102 ~]$ cd .ssh
[jason@hadoop102 .ssh]$ ll
[jason@hadoop102 .shh]$ cat known_hosts

# 生成公钥私钥
[jason@hadoop102 .ssh]$ ssh-keygen -t rsa  # 连续回车即可

# 将102公钥拷贝到103和104
[jason@hadoop102 .shh]$ ssh-copy-id hadoop103
[jason@hadoop102 .shh]$ ssh-copy-id hadoop104
"""
hadoop103中的.ssh在拷贝前后文件是有变化的
hadoop104中的.ssh在拷贝前后文件是有变化的
"""

# 免密直接访问103和104
ssh hadoop103/hadoop104

# 自己用ssh访问自己也需要输入密码,可以采用相同措施解决
[jason@hadoop102 .shh]$ ssh-copy-id hadoop102

# 由于hadoop103上有一个resurcemanage所以也需要配置ssh
[jason@hadoop103 .ssh]$ ssh-keygen -t rsa  
[jason@hadoop103 .shh]$ ssh-copy-id hadoop102
[jason@hadoop103 .shh]$ ssh-copy-id hadoop103
[jason@hadoop103 .shh]$ ssh-copy-id hadoop104

集群群起

1.配置 
 文件位置:/opt/module/hadoop-2.7.2/etc/hadoop/slaves
    
[jason@hadoop102 hadoop]$ vi slaves
"""内容(内容清空再添加)
hadoop102
hadoop103
hadoop104
"""
# 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。

2.同步所有节点配置文件
[jason@hadoop102 hadoop]$ xsync slaves

3.将之前单节点启动的datanode、namenode全部退出
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop namenode

[jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode

[jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode

4.启动HDFS
[jason@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh

5.验证每个节点对于启动的服务
jps查看照着之前的表格比较不能出错

6.启动yarn(一定要在hadoop103上启动 因为rm在这里)
"""
这里需要将hadoop03的公钥分别发送给hadoop102、hadoop103、hadoop104
"""
[jason@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh

7.验证每个节点对于启动的服务
jps查看照着之前的表格比较不能出错

集群测试

1.上传文件到集群
	1.小文件
  	[jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wc.input /
  2.大文件
  	[jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz /
  3.浏览器界面测试 

集群启动停止总结

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


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

集群时间同步

时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时 的同步,比如,每隔十分钟,同步一次时间
  
1. 时间服务器配置(必须 root 用户)
(1)检查 ntp 是否安装
	[root@hadoop102 hadoop-2.7.2]# rpm -qa | grep ntp

(2)修改 ntp 配置文件
	[root@hadoop102 hadoop-2.7.2]# vi /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

	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
	c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群 中的其他节点提供时间同步)
    server 127.127.1.0
    fudge 127.127.1.0 stratum 10

(3)修改/etc/sysconfig/ntpd 文件
  [root@hadoop102 hadoop-2.7.2]$ vim /etc/sysconfig/ntpd
  增加内容如下(让硬件时间与系统时间一起同步)
  SYNC_HWCLOCK=yes

(4)重新启动 ntpd 服务
	[root@hadoop102 桌面]$ service ntpd start
  [root@hadoop102 桌面]$ service ntpd status
  

(5)设置 ntpd 服务开机启动
	[root@hadoop102 桌面]$ chkconfig ntpd on

  
2. 其他机器配置(必须 root 用户)
	分 时 日 月 周
(1)在其他机器配置 1 分钟与时间服务器同步一次
  root@hadoop103 hadoop2-7.2]$ crontab -e
  编写定时任务如下:
    */1 * * * * /usr/sbin/ntpdate hadoop102
  
(2)修改任意机器时间
	[root@hadoop103 ~]$ date -s "2020-11-11 11:11:11"

(3)一分钟后查看机器是否与时间服务器同步
	[root@hadoop103 ~]$ date
  # 测试的时候可以将 10 分钟调整为 1 分钟,节省时间。
  
(4)主动同步时间
	[root@hadoop103 root]$ /usr/sbin/ntpdate hadoop102

Hadoop源码编译

"""
我们从apche官网下载的hadoop包是32位的,如果我们需要将其编译成64位
可以在centos64位的环境下编译之后就会是64位并且在编译过程中还可以加入一些额外的功能
"""
1.前期准备工作
	1.1.CentOS 联网
  1.2.jar包准备(hadoop 源码、JDK8、maven、ant 、protobuf)
  	1)hadoop-2.7.2-src.tar.gz 
  	2)jdk-8u144-linux-x64.tar.gz 
  	3)apache-ant-1.9.9-bin.tar.gz(build 工具,打包用的) 
  	4)apache-maven-3.0.5-bin.tar.gz 
  	5)protobuf-2.5.0.tar.gz(序列化的框架)

2.jar包安装
	2.1.JDK解压、配置环境变量 JAVA_HOME 和 PATH,验证 java-version(如下都需要验证是否配置成功)
	 [software] tar -zxf jdk-8u144-linux- x64.tar.gz -C /opt/module/
	 [software] vi /etc/profile 
  		#JAVA_HOME:
  		export JAVA_HOME=/opt/module/jdk1.8.0_144 
			export PATH=$PATH:$JAVA_HOME/bin
   [software] source /etc/profile
  验证命令:java-version
    
	2.2.Maven 解压、配置 MAVEN_HOME 和 PATH
  	[software] tar -zxvf apache-maven-3.0.5- bin.tar.gz -C /opt/module/
		[apache-maven-3.0.5] vi conf/settings.xml
        <mirrors>
         <mirror>
           <id>nexus-aliyun</id>
           <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name>
           <url>http://maven.aliyun.com/nexus/content/groups/public</ur l>
          </mirror>
        </mirrors>
		[apache-maven-3.0.5] vi /etc/profile
    		#MAVEN_HOME
				export MAVEN_HOME=/opt/module/apache-maven-3.0.5 
				export PATH=$PATH:$MAVEN_HOME/bin
    [software] source /etc/profile
    验证命令:mvn -version
    
	2.3.ant 解压、配置 ANT _HOME 和 PATH
  	[software] tar -zxvf apache-ant-1.9.9- bin.tar.gz -C /opt/module/
		[apache-ant-1.9.9] vi /etc/profile
    		#ANT_HOME
				export ANT_HOME=/opt/module/apache-ant-1.9.9 
				export PATH=$PATH:$ANT_HOME/bin
    [software] source /etc/profile
    验证命令:ant -version
      
  2.4.安装 glibc-headers 和 g++ 命令如下
  	[apache-ant-1.9.9] yum install glibc-headers
    [apache-ant-1.9.9] yum install gcc-c++
    
  2.5.安装 make 和 cmake
  	[apache-ant-1.9.9] yum install make
    [apache-ant-1.9.9] yum install cmake
    
  2.6.解压 protobuf ,进入到解压后 protobuf 主目录,/opt/module/protobuf-2.5.0,然后相继执行命令
  	[software] tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
    [opt] cd /opt/module/protobuf-2.5.0/
    [protobuf-2.5.0] ./configure
    [protobuf-2.5.0] make
    [protobuf-2.5.0] make check
    [protobuf-2.5.0] make install
    [protobuf-2.5.0] ldconfig
    [hadoop-dist] vi /etc/profile
    	#LD_LIBRARY_PATH
			export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0 
  		export PATH=$PATH:$LD_LIBRARY_PATH
    [software] source /etc/profile
    验证命令:protoc --version
      
   2.7.安装 openssl 库
  	[software] yum install openssl-devel
    
   2.8.安装 ncurses-devel 库
  	[software] yum install ncurses-devel
    
3.编译源码
	1.解压源码到/opt/目录
  	[software] tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/
  
  2.进入到 hadoop 源码主目录
  	[hadoop-2.7.2-src] pwd /opt/hadoop-2.7.2-src
  
  3.通过 maven 执行编译命令(大概需要30分钟)
  	[hadoop-2.7.2-src] mvn package -Pdist,native - DskipTests -Dtar
  
  4.成功的64位hadoop包在/opt/hadoop-2.7.2-src/hadoop-dist/target下
  	[target] pwd /opt/hadoop-2.7.2-src/hadoop-dist/target
    
	5.编译源码过程中常见的问题及解决方案
  	1.MAVEN install 时候 JVM 内存溢出
      处理方式:在环境配置文件和 maven 的执行文件均可调整 MAVEN_OPT 的 heap 大
  小。(详情查阅 MAVEN 编译 JVM 调优问题,如:http://outofmemory.cn/code- snippet/12652/maven-outofmemoryerror-method)
  	2.编译期间 maven 报错。可能网络阻塞问题导致依赖库下载不完整导致,多次执行命 令(一次通过比较难):
      mvn package -Pdist,nativeN -DskipTests -Dtar
    3.报 ant、protobuf 等错误,插件下载未完整或者插件版本问题,最开始链接有较多特 殊情况,同时推荐
上一篇:解决在jsp中EL表达式不识别的问题


下一篇:《Vim实用技巧(第2版)》学习笔记:技巧77-界定单词的边界