HADOOP 保姆级环境搭建及知识总结

发布时间:2024年01月11日

hadoopd的环境搭建

首先在官网下载JDK和Hadoop

Index of /dist/hadoop/common/hadoop-3.3.1 (apache.org)icon-default.png?t=N7T8https://archive.apache.org/dist/hadoop/common/hadoop-3.3.1/

Java Archive Downloads - Java SE 8u211 and later (oracle.com)icon-default.png?t=N7T8https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html

登录Linux到root用户下,创建两个文件目录,例如:module,software两个文件目录,通过FinalShell将两下载好的两个文件上传到module目录下,通过命令将两个文件解压到创建的另外一个目录中去

tar -zxvf jdk-8u271-linux-x64.tar.gz -C /opt/module/?

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

解压完两个文件之后,配置环境变量。

sudo vim /etc/profile.d/my_env.sh

配置完上面的两个路径,执行:source /etc/profile? 刷新一下我们配置的文件,分别写Java查看配置jdk是否成功,Hadoop查看配置Hadoop是否成功

当出现这样的内容说明我们创建成功了。

?Hadoop的文件目录

bin:存放Hadoop 的命令,常用命令: hadoop、hdfs、mapred、yarn等,用户可以使用这些脚本管理和使用Hadopop.
etc:存放着大量的配置文件
nclude:对外提供的编程库的.h头文件(具体动态库和静态库在lib目录中),常用于C++程序访问HDFS或者编写MapReduce程序
lib / native:对外native存放的是本地动态链接库
libexec:各个服务对外用的shell配置文件所在目录,可用于配置日志输出、启动参数等基本信息
sbin:存放一些集群相关的命令,例如:start-dfs.sh、start-yarn.sh
share:说明文档、各个模块编译后的jar包、官方写的java调用hadoop示例程序

工作模式

本地模式(Local/Standalone Mode):单台服务器,数据存储在本地。用来演示案例

伪分布式模式(Pseudo-Distributed Mode)单台服务器,数据存储在HDFS上。用于测试生产环境

完全分布式模式(Fully-Distributed Mode):多台服务器组成集群,数据存储在HDFS上,多台服务器工作。在企业中大量使用。

本地模式(WordCount)

创建在Hadoop文件下面创建一个wcinput文件夹
在wcinput文件下创建一个word.txt文件
编辑word.txt文件

?执行此命令,最后程序会创建output文件夹,并在里面生成两个文件:part-r-00000_SUCCESS_SUCCESS是成功标志文件,part-r-00000是结果文件

wordcount可以对文档中每个字符串进行出现次数统计?

结果输出文件夹为 output。执行程序前该output文件夹不能存在,程序会自动创建该文件夹,如果存在会抛出异常

集群搭建

准备三台服务器 hadoop102hadoop103hadoop104,关闭防火墙、设置静态IP、配置主机名称和主机映射。安装JDK、Hadoop,配置环境变量 (前面已经完成)

? ?配置集群

hadoop102上已经搭建好了 jdk、hadoop,所以可以直接复制到其他服务器上:

scp 可以实现服务器与服务器之间的数据拷贝

Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).lost connection当出现这种错误,说明权限不够。编辑 /etc/ssh/sshd_config? 将PasswordAuthentication 前的的#去掉,保存退出后重启ssh:systemctl restart sshd.service 并改成开机自启systemctl enable sshd.service


成功将两个文件复制到Hadoop3?

在hadoop4上使用scp从hadoop2上拉取:scp -r root@hadoop2:/opt/module/hadoop-3.3.1 ./

scp -r root@hadoop2:/opt/module/jdk1.8.0_271 ./? 拉取和复制建议都尝试一下

rsync远程同步工具

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

rsync -av  要拷贝的文件路径/名称  目的用户@主机:目的路径/名称
# -a :归档拷贝
# -v :显示复制过程
# --delete 当目的路径文件或文件夹比源路径多(源路径删除了文件),删除目的路径的文件

例如:删除Hadoop3中/opt/hadoop-3.3.1/wcinput?

但是在执行的时候发现报错如下:rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]? 发现是没有权限 通过chomd 777赋权和升级了rsync,执行命令还是报错。最后用pwd 查看当前路径以及去hadoop3里也查看了路径。选择粘贴路径才成功? 。问题处在路径上(我使用了绝对路径,相对路径出错解决不了)

chmod 777 /opt/module/hadoop-3.3.1
yum -install rsync 

 rsync -av /opt/module/hadoop-3.3.1 root@hadoop3:/opt/module/hadoop-3.3.1/

xsync

可以编写一个shell脚本调用 rsync 命令,将文件同步到所有服务器的相同目录下。?在/bin中新建一个shell脚本文件 xsync,内容如下:

#!/bin/bash

# 1. 判断参数个数
if [ $# -lt 1 ]
then
  echo Not Enough Argument
  exit
fi

# 2. 遍历集群所有机器
for host in hadoop2 hadoop3 hadoop4
do
  echo ================== $host =====================
  # 3. 遍历所有目录,逐个发送
  for file in $@
  do
    # 4. 判断文件是否存在
    if [ -e $file ]
      then
        # 5. 获取父目录
        # -P 如果cd后面是一个软链接,-P可以进入软链接指向的真正文件夹
        pdir=$(cd -P $(dirname $file); pwd)
        # 6. 获取当前文件名称
        fname=$(basename $file)
        # -p 如果存在则不创建,如果不存在则创建
        ssh $host "mkdir -p $pdir"
        rsync -av $pdir/$fname $host:$pdir
      else
        echo $file does not exists!
    fi
  done
done

?比如环境变量配置文件 /etc/profile.d/my_env.sh,可以使用sudo进行同步:这样Hadoop3,Hadoop4 都能找到

此外个别使用sudo时,因为xsync不在root的命令列表,所以需要使用./进行调用
sudo ./bin/xsync /etc/profile.d/my_env.sh

ssh免密登录

因为脚本中使用了 ssh 命令和 rsync命令去连接其他服务器,所以每台服务器都要输入两次密码,比较繁琐,可以配置ssh免密登录。

ssh免密登录原理图:

?如果当前服务器使用ssh命令连接过其他服务器,那么在该用户家目录下就会生成一个 .ssh文件夹,里面存有一个 known_hosts 文件,文件中保存的有该用户曾经使用ssh命令远程连接过的服务器。

配置hadoop2、hadoop3hadoop4免密交互登录。在Hadoop2上

# 选择非对称加密算法为rsa算法
ssh-keygen -t rsa
# 然后一路回车即可

命令执行后,会在用户目录下的 .ssh文件夹中生成一个公钥文件 id_rsa.pub、一个私钥文件 id_rsa?hadoop102上的公钥id_rsa.pub拷贝到hadoop3hadoop4

进行免密之后,在 hadoop103hadoop104.ssh 文件夹中会多一个 authorized_keys文件,里面记录了允许哪些客户机免密登录自己。authorized_keys文件中的内容其实就是 hadoop102的公钥文件 id_rsa.pub中的内容。另外,还需要对自己设置免密登录,否则 hadoop2?使用 ssh 连接 hadoop2` 本身时也需要密码。然后在 hadoop3hadoop4上也执行上述同样的操作,使集群中的几台服务器可以互相免密登录。 下面是配置完之后的测试显示正常:

?

配置文件配置

NameNodeSecondaryNameNode 不要安装到同一台服务器上?

ResourceManager 也很消耗内存,不要和 NameNodeSecondaryNameNode配置在同一台机器上

Hadoop集群 = HDFS集群 + Yarn集

Yarn集群和HDFS集群:逻辑上分离、物理上在一起。

逻辑上,Yarn集群的启动和HDFS集群的启动并没有直接的依赖关系。

物理上,Yarn集群、HDFS集群,都是在同一个安装了Hadoop的集群内。

Hadoop配置文件分为两类:默认配置文件和自定义配置文件。core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xml四个配置文件存放在 hadoop-3.3.1/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。

配置核心文件 core-site.xml:vim?core-site.xml 将下表中的内容写在<configuration>中

 <!-- 指定NameNode的地址 -->
  <!-- core-defualt.xml中该项默认值为本地Linux路径,因为我们集群要用HDFS,所以要改成HDFS路径  -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop2:8020</value>
  </property>

  <!-- 指定hadoop数据的存储目录 -->
  <!-- core-default.xml中该项默认值为 /tmp/hadoop-${user.name},因为 /tmp在Linux中是临时目录,一段时间(默认一个月)会删除,所以要调整为自定义目录 -->
  <!-- 我们指定的data文件夹如果不存在,hadoop会自动进行创建 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/module/hadoop-3.2.3/data</value>
  </property>

  <!-- 配置HDFS网页登录使用的静态用户为tengyer(即hdfs中的用户) -->
  <!-- 如果不配置,那么在浏览器中默认的是Mr.who,该用户删除hdfs文件时,会提示无权限。-->
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>tengyer</value>
  </property>

配置HDFS的hdfs-site.xml:vim??hdfs-site.xml?将下表中的内容写在<configuration>中

  <!-- NameNode对外暴露的Web端访问地址 -->
  <property>
    <name>dfs.namenode.http-address</name>
    <value>hadoop2:9870</value>
  </property>

  <!-- 2NN 对外暴露的Web端访问地址(2NN安装在hadoop104上) -->
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop4:9868</value>
  </property>

配置Yarn的yarn-site.xmlvim yarn-site.xml?将下表中的内容写在<configuration>中

<!-- 指定MR走shuffle -->
  <!-- 在yarn-default.xml中该项默认值为空,但是官方推荐使用mapreduce_shuffle -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>

  <!-- 指定ResourceManager的地址(ResourceManager安装在hadoop103) -->
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop103</value>
  </property>

  <!-- 环境变量的继承 -->
  <!-- Hadoop3.1.x需要配置,因为yarn-default.xml中该项默认值缺少了HADOOP_MAPRED_HOME -->
  <!-- 到了Hadoop3.2.x就不需要再配置该项了,可以直接使用yarn-default.xml中的默认值 -->
  <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>

配置MapReduce的mapred-site.xmlvim?mapred-site.xml?将下表中的内容写<configuration>中

 <!-- 指定MapReduce程序运行在Yarn上 -->
  <!-- mapred-default.xml中该项默认值是local,即在本地运行 -->
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>

配置完成后,将hadoop102的这些配置同步分发给hadoop3hadoop4:?

xsync hadoop/
配置workers

workers内容即为集群中的各台主机,默认的是localhost。因为我们使用集群方式,所以可以删掉localhost,然后把几台主机都配置进来。需要在HADOOP-3.3.1/etc/hadoop/workers中将几台节点都添加进去:该文件将来会作为hadoop集群启动的脚本一部分,所以主机名后面不能有空格、结尾也不能有空行

hadoop2
hadoop3
hadoop4

works文件分发给其他服务器:xsync works

文章来源:https://blog.csdn.net/weixin_45837583/article/details/135490962
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。