文章背景
最近由于工作关系变动,需要自己也要去学习大数据相关的知识以被更好的赋能工作,其实作为 QA来说如果可以想对更了解和熟悉大数据相关知识,那么你是比其他QA更具备竞争力的毕竟它是一个垂直且有一定技术门槛的岗位。所以博主在这里也鼓励QA同学一起学习和掌握相关知识。
特别提示:本系列所有学习第一次参考资料都来自于官网:https://hadoop.apache.org/ 大家也可以直接自己在官网学习即可更准确,如有理解错误🙅还请指正修改。
Hadoop由来小故事
Hadoop的由来可以追溯到2004年,Apache Hadoop(以下简称Hadoop)的创始人Doug Cutting和Mike Cafarella受MapReduce编程模型和Google File System等论文的启发(大神就是牛逼根据论文就造出了世界通用的东西,谷歌打死也没想到啊,早知道估计都不发表论文了........),对论文中提及的思想进行了编程实现。
Hadoop的名字来源于Doug Cutting儿子的玩具大象。当时,Cutting的儿子刚刚两岁,正处在咿呀学语的阶段,经常将自己的黄色玩具大象叫做"Hadoop",Cutting灵机一动,将自己的大数据项目以此来命名。
随着时间的推移,Hadoop逐渐发展成为整个大数据领域的先行者和领导者,形成了一套围绕Hadoop的生态系统。如今,Hadoop和它的生态是绝大多数企业首选的大数据解决方案.
环境搭建前的依赖(Linux)
当然 Hadoop 在Winlows 和 Linux 都可以搭建,这里我们使用日常工作接触的Linux 系统。
- java 环境这里推荐 java8 就可以了.. 至于怎么在Linux 安装Java 环境就不用再说了吧( 其他java 和 Hadoop 版本对应参考这里:Hadoop Java Versions - Hadoop - Apache Software Foundation)
- ssh ,因为Hadoop 需要sh 启动所以需要安装相关sshd 服务 :sudo apt-get install ssh
Hadoop 包下载
- 参考地址:Index of /hadoop/common
- hadoop 提供了多种包的安装方式,这里只选择最简单tar 包解压后就可以使用了,非常方便,这里以3.3.1 版本进行学习稳定版:https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
- 展示一下博主的环境(下载放到一个位置,解压即可):
至此Hadoop 基本环境就完事了,是不是简单的难以置信,不得不说牛逼优秀的软件确实优秀且牛逼啊。
伪分布式环境搭建
因为Hadoop 集群环境,单机就不看了,大家自己看官网吧,方便学习直接看伪分布式环境是如何搭建的,此搭建需要修改一些配置文件才可实现。如下:
环境配置
etc/hadoop/core-site.xml:
<configuration>
<property>
// fs.defaultFS: 大数据顾名思义需要分布式存储和计算,此配置是存储配置,默认文件系统名称,默认文件系统
// 决定了认证和方案的实现,uri 的方案决定了文件系统实现类的配置属性,uri的权限通常决定文件系统主机和端口
<name>fs.defaultFS</name>
// 也就是 这里hadoop 是默认的 使用的什么存储文件系统,当然你可以不用hdfs 作为默认,这时候你就需要改成别的了,比如S3,Swift文件系统
<value>hdfs://localhost:9000</value>
</property>
</configuration>
etc/hadoop/hdfs-site.xml:
<configuration>
<property>
// dfs.replication 默认块复制。实际的复制次数可以在创建文件时指定。如果在创建时未指定复制,则使用默认值。
// 参数控制着每个数据块应该被复制的份数。当 dfs.replication 参数的值较小时,可以提高系统的存储效率,但可能会降低数据的冗余性和可靠性。当 dfs.replication 参数的值较大时,可以增加数据的冗余性和可靠性,但会占用更多的存储空间。
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
设置免密登陆
分布式集群需要免密登陆
以下图示意味着成功
如果不成功可以通过如下命令设置
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
执行
以下说明是在本地运行 MapReduce 作业
- 必须格式化文件系统
- bin/hdfs namenode -format
- 启动NameNode守护进程和DataNode守护进程:
- sbin/start-dfs.sh (hadoop 守护进程日志输出写入$HADOOP_LOG_DIR目录(默认为$HADOOP_HOME/logs))
- 浏览NameNode的Web界面;默认情况下,它位于:
- NameNode - http://localhost:9870/
- 将文件复制到文件系统
bin/hdfs dfs -mkdir input bin/hdfs dfs -put etc/hadoop/*.xml input
- 提供一个 hadoop 计算的例子
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar grep input output 'dfs[a-z.]+'
- 检查输出文件,复制output 的文件在分布式文件系统到本地文件系统
bin/hdfs dfs -get output output cat output/*
- 直接查看文件系统中的文件,命令
bin/hdfs dfs -cat output/*
- 停止守护进程
sbin/stop-dfs.sh
通过YARN提交任务
修改配置如下
etc/hadoop/mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
etc/hadoop/yarn-site.xml:
<configuration>
<property>
// 在YARN中,NodeManager是负责管理在集群中运行的各个节点的资源,包括内存、CPU等。辅助服务(aux-services)是运行在NodeManager上的各种服务,用于支持各种不同的任务和工作流程。
// yarn.nodemanager.aux-services配置参数可以用来指定哪些辅助服务应该在NodeManager上运行。这些服务可以是用于数据处理、资源调度、日志管理等功能的自定义服务。
// 配置yarn.nodemanager.aux-services的方式是通过在YARN的配置文件(yarn-site.xml)中添加或修改该参数的值。例如,如果要指定NodeManager上运行一个名为"mapreduce_shuffle"的辅助服务,可以按照以下方式进行配置:
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</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_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
- 启动yarn: sbin/start-yarn.sh
- 查看成功界面:ip:8088
- 提交一个map 任务,同之前提交任务操作一样即可
- 得到yarn 处理过的任务的结果
我遇到的一些问题
- 问题1: 在提交yarn 任务时报错如下:
是因为没有data node 节点启动这时候 jps 看一下必须有data node 才可以如下:、
如果没有全部停止,全部重启从第一步开始重新操作,删除已经生成的data 节点目录。
- 问题2:
修改执行命令: bin/hdfs dfs -mkdir -p input ,加 -p ,递归创建,会自动创建缺失父目录
总结
- hadoop 搭建必须先安装依赖环境
- 重复执行 map 任务时候会报错,
因为:MapReduce不允许同一个目录被多次计算是因为它会尝试将输入目录中的所有文件都映射到单个map任务。如果同一个目录被多次计算,会导致同一个文件被多次映射到不同的map任务中,这会浪费计算资源和时间。
在MapReduce中,每个map任务都会对输入目录中的一部分文件进行独立计算,并将结果输出到临时目录中。如果同一个目录被多次计算,会导致同一个文件的内容被多次写入到不同的临时目录中,这会导致冗余的计算结果和不必要的存储空间浪费。
为了避免这种情况,MapReduce框架会在执行任务之前检查输入目录的状态,如果输入目录已经被计算过,就会直接使用之前计算的结果,而不是重新进行计算。这样可以确保每个文件只被映射到一次map任务中进行计算,避免重复计算和资源浪费。
- 以上就是我搭建Hadoop 得一些基本情况,有问题可以多交流
FROM: 神策数据基础架构QA