Hadoop集群快速搭建

一、hadoop开发环境搭建

shell连接,以root用户登录。

1.准备一台虚拟机

① 最小化安装

2.hadoop101(模板机)

① 修改hostname

            vi /etc/hostname

② 固定IP

            vi /etc/sysconfig/network-scripts/ifcfg-ens33

③ 修改hosts

            在windows上,cmd,管理员模式进入,cd /windows/system32/drivers/etc 
            然后start hosts 尾部追加一组服务器IP与主机名映射
            vi /etc/hosts 将windows中追加的映射添加到虚拟机上

④ 关防火墙

            关闭现防火墙:systemctl stop firewalld
            关闭防火墙开机自启:systemctl disable firewalld   
            查看防火墙是否开机自启:systemctl is-enabled firewalld

⑤ Xshell工具链接模板机

为了加快连接速度,可以 vim /etc/ssh/sshd_config
            然后/搜索:  /DNS
            将前面的#去掉,并将yes改为no (小写)

⑥ 通过yum安装方式安装必要的软件

            ###note!!!!需要联网:ping www.baidu.com
            软件1:yum install -y epel-release
            软件2:yum install -y psmiscnc net-tools rsync vim lrzsz ntp libzstd openssl-                   static tree iotop git

⑦ 创建普通户用cxl、提升为root权限

            创建普通用户:useradd cxl
            设置用户密码:passwd 123456
            提升root权限:vim /etc/sudoers   在尾部加上cxl    ALL=(ALL)     NOPASSWD:ALL

⑧ 在opt下创建software、module文件夹,并修改所属主、组

创建software用于保存软件包:mkdir /opt/software
创建module用于保存解压后的软件:mkdir /opt/module
修改software所属主、组:chown cxl:cxl /opt/software
修改module所属主、组:chown cxl:cxl /opt/module

⑨ 重启虚拟机

重启:reboot

3. hadoop102

① 克隆hadoop101

② 修改ip

③ 修改 hostname

4. hadoop102安装jdk

由于Hadoop是java进程,所以需要添加jdk。

① Xshell连接hadoop102

以普通用户cxl登录hadoop102

② 将使用xftp将jdk的安装包上传到 /opt/software 下

③ 将jdk安装到 /opt/module 下

--jdk压缩包解压到module下:tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

5. 配置JDK环境变量

	    ###note1:普通用户cxl,不sudo处理时,只能在/home/cxl 目录下创建文件
		###note2: /etc/profile 文件保存的是系统PATH变量,不可以在内部更改
		###note3:创建一个 my_env.sh文件,写入自己更改的环境变量,文件保存到/etc/profile.d/目录

		创建shell脚本文件my_env.sh:sudo vim /etc/profile.d/my_env.sh
		编辑shell脚本文件my_env.sh:export JAVA_HOME=/opt/module/jdk1.8.0_212
						                     export PATH=$PATH:$JAVA_HOME/bin
		更新profile文件:source /etc/profile
		检测是否可用:任意目录下 java -version  不成功的话就重启:sudo reboot
  ----!!!!note!!!!----
        
        path变量时系统变量,这里声明之后,会去覆盖系统的那个path,所以要先拿到系统的那个path即$path,然后用:拼接自己的添加的环境变量。
        环境变量时为了执行某个命令时,能找到该命令所在路径。
       
        export会将变量提升为全局变量,那样该变量就可以被其他shell脚本(比如hadoop里面启动单项服务的脚本,里面都是用到了HADOOP_HOME这个变量,如果不提升,脚本就没法执行)内部使用。
        全局变量提升是为了,当某些脚本中含有该环境变量时可以使用它的值。
        
        所以环境变量配置+提升全局变量 应该是一体的,都要来做的。

6. hadoop102安装hadoop

① 将hadoop包传输到 /opt/software

② 解压到module

tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

7. 配置hadoop环境变量

     export HADOOP_HOME=/opt/module/hadoop-3.1.3
	 export PATH=$PATH:$HADOOP_HOME/bin 
	 			--bin下放的是单点命令
     export PATH=$PATH:$HADOOP_HOME/sbin 
     			--集群命令

8. hadoop目录

bin:存放对Hadoop集群单项服务(HDFS,YARN)操作的脚本

sbin:启停Hadoop相关服务的脚本

etc:Hadoop的配置文件目录,存放Hadoop的配置文件

share:存放Hadoop的依赖jar包、文档、和官方案例

data:

	namenode在默认配置中,指定数据存储在hadoop.tmp.dir/dfs/name中,通过在core-site.xml中指定hadoop.tmp.dir=/opt/module/hadoop-3.1.3/data。

    namenode格式化后自动生成,namenode的数据就默认存储在其下的dfs/name中。有id,如果后续需要重新格式化,需要删除该data

logs:

运行日志,有id,若重新格式化namenode,需要删除该logs。
	--出问题时,一般查200行

9.hadoop103\hadoop104

克隆hadoop102、改ip、改hostname

10.文件传输方式

方式1-scp: 
			scp -r 源路径 登录用户@目的主机:目的路径
方式2-rsync:
			rsync -av  源路径 登录用户@目的主机:目的路径
   
方式3-群发脚本
    
    -- 注意:系统环境变量在用户cxl创建的时候,就加入了home/cxl/bin,但/home/cxl/现在下面是没有bin目录的,mkdir bin ,将要执行的脚本放在bin目录下,该脚本就可以在任何地方执行。
	         
	
	--编脚本:vim xsync.sh
				--内容直接word上找。
	--给权限: chmod 744 xsync.sh
	
	常用于分发环境变量
	sudo /home/cxl/bin/xsync.sh /etc/profile.d/my_env.sh
	--在每台机器上source /etc/profile

二、hadoop完全分布式

1.配置4个xml(必要)

①规划

hadoop102	NameNode	NodeManager	DataNode	
hadoop103	 ResourceManager	NodeManager	DataNode  
hadoop104	SecondaryNameNode	NodeManager	DataNode

②修改配置文件

配置core-site.xml:

      		<!-- 指定NameNode的地址 -->
				    <property>
				        <name>fs.defaultFS</name>
				        <value>hdfs://hadoop102:8020</value>
				   </property>
			<!-- 指定hadoop数据的存储目录 -->
				    <property>
				        <name>hadoop.tmp.dir</name>
    					<value>/opt/module/hadoop-3.1.3/data</value>
				  </property>				  
			<!-- 配置HDFS网页登录使用的静态用户为cxl -->
                   <property>
				        <name>hadoop.http.staticuser.user</name>
				        <value>cxl</value>
				   </property>			   
			<!-- 配置该cxl(superUser)允许通过代理访问的主机节点 -->
                  <property>
				        <name>hadoop.proxyuser.cxl.hosts</name>
				        <value>*</value>
				   </property>
			<!-- 配置该cxl(superUser)允许通过代理用户所属组 -->
				    <property>
				        <name>hadoop.proxyuser.cxl.groups</name>
				        <value>*</value>
				    </property>
			<!-- 配置该cxl(superUser)允许通过代理的用户-->
				    <property>
				        <name>hadoop.proxyuser.cxl.groups</name>
				        <value>*</value>
				   </property> 

配置hdfs-site.xml

		   <!-- nn web端访问地址-->
  		 <property>
 		       <name>dfs.namenode.http-address</name>
      		  <value>hadoop102:9870</value>
		    </property>
		   <!-- 2nn web端访问地址-->
 		   <property>
        		<name>dfs.namenode.secondary.http-address</name>
      		  <value>hadoop104:9868</value>
   		 </property>
		
		
		<!-- 
			namenode数据的存储位置配置项:dfs.namenode.name.dir
			datanode数据的存储位置配置项:dfs.datanode.data.dir
			2nn数据的存储位置配置项:dfs.namenode.checkpoint.dir
				 以上三个配置项,都引用了变量hadoop.tmp.dir/来定义将来数据存储的位置,所以在core-site.xml中指定hadoop.tmp.dir的值,而hdfs-site.xml可以指定hadoop.tmp.dir/******中***的值。
			
			块大小配置项:dfs.blocksize
			副本数配置项:dfs.replication						
		-->	

配置yarn-site.xml

		   <!-- 指定MR走shuffle -->
		    <property>
     	   <name>yarn.nodemanager.aux-services</name>
   		   <value>mapreduce_shuffle</value>
		</property>
		<!-- 指定ResourceManager的地址-->
 		   <property>
       		<name>yarn.resourcemanager.hostname</name>
     		  <value>hadoop103</value>
		</property>
		<!-- 环境变量的继承 -->
   		 <property>
      		 <name>yarn.nodemanager.env-whitelist</name>        			<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
		</property>
		<!-- yarn容器允许分配的最大最小内存 -->
   		 <property>
    		<name>yarn.scheduler.minimum-allocation-mb</name>
      		  <value>512</value>
   		 </property>
		    <property>
       		 <name>yarn.scheduler.maximum-allocation-mb</name>
        		<value>4096</value>
			</property>
		<!-- yarn容器允许管理的物理内存大小,结合实际配。 -->
  		  <property>
       		<name>yarn.nodemanager.resource.memory-mb</name>
     		   <value>4096</value>
			</property>
		<!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
  		  <property>
       		 <name>yarn.nodemanager.pmem-check-enabled</name>
      		  <value>false</value>
  		  </property>
    		<property>
      		 <name>yarn.nodemanager.vmem-check-enabled</name>
    		   <value>false</value>
    		</property>

---如果需要配置日志聚集,继续添加配置

  -- 概念:日志是针对 MR 程序运行是所产生的的日志
	    -- 目的:方便后期分析问题 有更好的 执行过过程的依据

		      <!-- 开启日志聚集功能 -->
				<property>
					<name>yarn.log-aggregation-enable</name>
				<value>true</value>
				</property>
				<!-- 设置日志聚集服务器地址 -->
				<property>  
					<name>yarn.log.server.url</name>  
					<value>http://hadoop102:19888/jobhistory/logs</value>
				</property>
				<!-- 设置日志保留时间为7天 -->
				<property>
					<name>yarn.log-aggregation.retain-seconds</name>
					<value>604800</value>
				</property>
				
			-- 重启集群(historyserver  、 yarn集群)		
		    -- 日志聚集后,会在HDFS的 /tmp 目录下存储

配置mapred-site.xml

			   <!-- 指定MapReduce程序运行在Yarn上 -->	
			    <property>
		        <name>mapreduce.framework.name</name>
			        <value>yarn</value>
		    </property>

---如果需要配置历史服务器,继续添加配置

  -- 概念:历史服务器是针对MR程序执行的历史记录,查看所有提交到yarn的job
		        <!-- 历史服务器端地址 -->
				<property>
					<name>mapreduce.jobhistory.address</name>
					<value>hadoop102:10020</value>
				</property>
				<!-- 历史服务器web端地址 -->
			<property>
				<name>mapreduce.jobhistory.webapp.address</name>
				<value>hadoop102:19888</value>
			</property>
			
	   -- 把历史服务器的 启停 操作配置到 自定义的群启群停脚本了

2.配置Workers(必要)

	服务器会读取workers中的内容,如果发现有这台服务器的名字,就会在自己的服务器上部署DataNode。
	为方便起见,只需要在一台服务器上的Workers文件上写上所有部署DataNode的服务器,然后分发给集群中的其余服务器。


在hadoop102上编辑:vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
删除:localhost
添加:hadoop102
     hadoop103
     hadoop104

注意:
1.该文件中添加的内容结尾不允许有空格,文件中不允许有空行。

3.项目经验-配置

3.1.HDFS多目录存储

		
		--NameNode多目录存储:NameNode多目录存储时,要求各个目录中的数据都是一样的,相当于是备份,而将来主要的生产环境是高可用,已经是实现了在不同服务器上有多个namenode,因此再配置多目录已经没有意义了。
		
		--DataNode多目录存储:在现实生产中,一个服务器的磁盘大概10T左右,由多块磁盘构成的,将DataNode可以配置成多个目录,每个目录存储的数据不一样,不同的目录下挂载不同的磁盘,就可以保证磁盘存储均衡。
	
	什么是挂载?	
	Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。纠正一个误区,并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。
	举个例子,我们想通过命令行访问某个U盘中的数据,目前U盘和Linux 系统文件分属两个文件系统,还无法使用命令行找到 U 盘文件,需要将两个文件系统进行挂载,接下来,我们在根目录下新建一个目录 /sdb-u,通过挂载命令将 U 盘文件系统挂载到此目录。
	U盘插入到linux时,系统dev目录下只会记录一下该设备的一些基本信息。
	
在hdfs-site.xml文件中添加如下内容:
		<property>
        <name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value>
		</property>

3.2.集群数据均衡

	一般情况下,namenode会均衡的将数据存储,但是随着集群使用时间增长,删除文件时,可能会导致集群内部的数据不均衡。
	
	--节点和节点之间的数据均衡(2.x):
		start-balance.sh -threshold 10
				10指的是利用率波动范围为10%,可以根据现实生产确定。
	--节点内磁盘和磁盘之间的数据均衡(3.x,应对多块盘的情况):
		step1生成均衡计划:hdfs diskbalancer -plan hadoop102
		step2执行均衡计划:hdfs diskbalancer -execute hadoop102.plan.json
		step3查看均衡状态:hdfs diskbalancer -query hadoop102
		step4停止均衡计划:hdfs diskbalancer -cancel hadoop102.plan.json

3.3.支持LZO压缩配置

3.4.LZO创建索引

3.5.基准测试

3.6.hadoop参数调优

4.分发配置文件(直接分发整个hadoop)

5.免密登录(必要)

  -- 普通用户实现免密访问 hadoop102 hadoop103 hadoop104
		     -- 在hadoop102上生成密钥对
			    ssh-keygen -t rsa   (4下回车)
				
			 -- 在hadoop102上给 hadoop102 hadoop103 hadoop104进行授权
			    ssh-copy-id hadoop102
				ssh-copy-id hadoop103
				ssh-copy-id hadoop104
				
	     	 -- 实现 hadoop103 免密访问 hadoop102 hadoop103 hadoop104
		     (同上操作...)
			 
		 	 -- 实现 hadoop104 免密访问 hadoop102 hadoop103 hadoop104
		     (同上操作...)
	
	--在hadoop102上实现root用户免密登录hadoop102\hadoop103\hadoop104
    		-切换到root用户:su root
    			输入密码:123456
    		--ssh-keygen -t rsa(4下回车)	
    		--ssh-copy-id hadoop102
    		--ssh-copy-id hadoop103
    		--ssh-copy-id hadoop104

	原理:
		step1:在服务器A上:ssh-keygen -t rsa 生成秘钥对:1个公钥+1个私钥
		step2:将公钥拷贝给服务器B:ssh-copy-id,实现授权
		step3:在A服务器上ssh访问B
		step4:B验证A,给A出一道题,并用A的公钥加密发送给A
		step5:A用自己的私钥解密数据,并算出答案,返回给B
		step6:B接受到A发来的数据后,跟自己的答案做一个对比,相同则判定为A,允许登录。

6.一键启停hadoop

启动前先要格式化namenode:hdfs namenode -format

-- 首次搭建后需要对NameNode进行格式化操作
-- 如果集群在后期使用过程需要重新格式化,删除所有机器hadoop-3.1.3目录下的data、logs 目录。

一键启停脚本

  	在hadoop102编写总控开关脚本my_cluster.sh脚本,实现在hadoop102上一键启动hadoop:
	-- 注意:为了省去配置环境变量的步骤,直接在/home/cxl/bin下创建 
   
   --在home/cxl/bin/下:touch my_cluster.sh脚本
	--给my_env.sh脚本执行权限: chmod 744 my_cluster
	--编辑my_rsync.sh脚本:vim my_cluster.sh

脚本内容如下:
#!/bin/bash

		#参数校验
		if [ $# -lt 1 ]
		then
		  echo "参数不能为空!!!"
		  exit
		fi

		#根据参数的值进行 启停 操作
		case $1 in
		"start")
		 #启动操作
		 echo "===============start HDFS================="
		 ssh hadoop102 /opt/module/hadoop-3.1.3/sbin/start-dfs.sh
		 echo "===============start YARN================="
		 ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/start-yarn.sh
		 
		;;

		"stop")
		 #停止操作
		 echo "===============stop HDFS================="
		 ssh hadoop102 /opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
		 echo "===============stop YARN================="
		 ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh

		;; 

		*)
		 echo "ERROR!!!!"
		;;
		esac

7.一键查看集群进程

编脚本:myjps.sh
给权限:chmod 777 myjps.sh	

--脚本内容如下:
#!/bin/bash
for i in hadoop102 hadoop103 hadoop104
do
	echo =====================  $i  =====================
	ssh $i "jps $@ | grep -v Jps"
done

8.一键执行相同操作

编脚本:vim xcall.sh
给权限:chmod 777 xcall.sh
---------------------------------
#! /bin/bash
 
for i in hadoop102 hadoop103 hadoop104
do
    echo --------- $i ----------
    ssh $i "$*"
done
----------------------------------

9.测试

登录HDFS图形化界面:hadoop102:9870

--最右侧utilities 选中browse the file system
--然后可以输入框右侧creat dir是创建目录,upload files是上传文件:	
		创建一个tmp目录,上传一个hello.txt文件,
			--当上传的文件超过128mb时,客户端会进行切块,可以点击文件,查看block0、1、2...
	
--再去Xshell中执行命令:
		hadoop jar jar全路径名 程序名 输入路径 输出路径 
		hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /tmp /final 
		
		------当被执行的文件夹下有多个文件时,会合并输出。
		------fianl是输出文件目录,当HDFS中没有时,会自动生成。
		------final文件夹中,最终会有两个文件:_success文件,part-r-00000文件。
		
		如何结束一个mr程序:
	--在yarn节点hadoop103上:yarn application -list查询到application_xxxxx
	--复制带编号的application: yarn application -kill application application_XXXxxx
		
		-----part指分区,有几个分区就有几个结果文件,最后几位数是分区编号(不一定是线性递增的,有自己的编码规则。)r指的是ruduce,表明结果是reduce阶段的结果(m表示map阶段)
		
--输出文件夹名字要求每次都不一样。

三、hadoop本地模式

没有更改任何配置的hadoop框架,也就是没有指定mr在yarn上跑,默认会运行在local上,就是本地模式相当于既没有启动yarn,也没有使用到hdfs。

测试和调试MapReduce程序较为方便因此,这种模式适宜用在开发阶段

四、启动补充

在关键节点,直接启动单项服务

		-- 注意:
		首次启动HDFS需要对NameNode进行格式化操作,在hadoop102执行::hdfs namenode -format	
		启/停HDFS: start/stop-dfs.sh        (在hadoop102上输入命令,nn所在节点)
		启/停YARN: start/stop-yarn.sh   	 (在hadoop103上输入命令,yarn所在节点)

###一键启停脚本,就是封装了直接启动单项服务的命令。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值