hadoopd的环境搭建
首先在官网下载JDK和Hadoop
登录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是否成功
当出现这样的内容说明我们创建成功了。
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上,多台服务器工作。在企业中大量使用。
创建在Hadoop文件下面创建一个wcinput文件夹
在wcinput文件下创建一个word.txt文件
编辑word.txt文件
?执行此命令,最后程序会创建output
文件夹,并在里面生成两个文件:part-r-00000
、_SUCCESS
。_SUCCESS
是成功标志文件,part-r-00000
是结果文件
wordcount
可以对文档中每个字符串进行出现次数统计?
结果输出文件夹为 output。执行程序前该output文件夹不能存在,程序会自动创建该文件夹,如果存在会抛出异常
准备三台服务器 hadoop102
、hadoop103
、hadoop104
,关闭防火墙、设置静态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 ./? 拉取和复制建议都尝试一下
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/
可以编写一个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
命令和 rsync
命令去连接其他服务器,所以每台服务器都要输入两次密码,比较繁琐,可以配置ssh免密登录。
ssh免密登录原理图:
?如果当前服务器使用ssh
命令连接过其他服务器,那么在该用户家目录下就会生成一个 .ssh
文件夹,里面存有一个 known_hosts
文件,文件中保存的有该用户曾经使用ssh
命令远程连接过的服务器。
配置hadoop2、
hadoop3
、hadoop4免密交互登录。在Hadoop2上
# 选择非对称加密算法为rsa算法
ssh-keygen -t rsa
# 然后一路回车即可
命令执行后,会在用户目录下的 .ssh
文件夹中生成一个公钥文件 id_rsa.pub
、一个私钥文件 id_rsa?
将hadoop102
上的公钥id_rsa.pub
拷贝到hadoop3
、hadoop4
:
进行免密之后,在 hadoop103
、hadoop104
的 .ssh
文件夹中会多一个 authorized_keys
文件,里面记录了允许哪些客户机免密登录自己。authorized_keys
文件中的内容其实就是 hadoop102
的公钥文件 id_rsa.pub
中的内容。另外,还需要对自己设置免密登录,否则 hadoop2
?使用 ssh
连接 hadoop2` 本身时也需要密码。然后在 hadoop3
、 hadoop4
上也执行上述同样的操作,使集群中的几台服务器可以互相免密登录。 下面是配置完之后的测试显示正常:
?
NameNode
和 SecondaryNameNode
不要安装到同一台服务器上?
ResourceManager
也很消耗内存,不要和 NameNode
、SecondaryNameNode
配置在同一台机器上
Hadoop集群 = HDFS集群 + Yarn集
Yarn集群和HDFS集群:逻辑上分离、物理上在一起。
逻辑上,Yarn集群的启动和HDFS集群的启动并没有直接的依赖关系。
物理上,Yarn集群、HDFS集群,都是在同一个安装了Hadoop的集群内。
Hadoop配置文件分为两类:默认配置文件和自定义配置文件。core-site.xml
、hdfs-site.xml
、yarn-site.xml
、mapred-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.xml
:vim 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.xml
:vim?mapred-site.xml?将下表中的内容写<configuration>中
<!-- 指定MapReduce程序运行在Yarn上 -->
<!-- mapred-default.xml中该项默认值是local,即在本地运行 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置完成后,将hadoop102
的这些配置同步分发给hadoop3
、hadoop4
:?
xsync hadoop/
workers内容即为集群中的各台主机,默认的是localhost
。因为我们使用集群方式,所以可以删掉localhost
,然后把几台主机都配置进来。需要在HADOOP-3.3.1/etc/hadoop/workers
中将几台节点都添加进去:该文件将来会作为hadoop集群启动的脚本一部分,所以主机名后面不能有空格、结尾也不能有空行
hadoop2
hadoop3
hadoop4
将works
文件分发给其他服务器:xsync works