引言
哇,好久没更新,最近工作太忙了。记得上次我们简单了解了一下Hadoop的HDFS吗?今天我们就来简单的搭建一下,非常简单,带大家一起深入看看。本次使用的是虚拟机VM14版本、系统CentOS7 、Hadoop为3.X
。
PS:Hadoop版本不一样,做法可能有差异!
至于如何安装,大家可以在网上自行查找,我认为比较有参考价值的我就粘出来:
1、 https://blog.csdn.net/babyxue/article/details/80970526【VMware安装Centos7超详细过程(图文)】
2、 https://blog.csdn.net/u010476739/article/details/86647585 【centos7.6安装配置hadoop-3.2.0笔记(单机安装、伪分布式安装)】
3、 https://blog.csdn.net/jimuka_liu/article/details/82784313【centos安装hadoop超级详细没有之一】
兄弟们,只能帮你们到这里了
这里就简单总结一下,安装hadoop的注意点:
【单机、伪分布式】
- 把虚拟机的网络设置好(我使用的是NAT)
- 下载并上传
hadoop3.X
和jdk1.8
(可下可不下)安装包到你的虚拟机 - 获权root
- 装好centOS必要的插件 如
rsync
- 关闭防火墙,并检查你虚拟机内是否存在jdk,若无请安装、修改系统环境变量
- 安装Hadoop,记得要在bin目录下执行指令(你懂的)——老手忽略这一点
- 运行伪分布式要记得合理修改配置xml文件,注意ip地址,注意能否ssh免密码登录
- 修改完任何配置文件后,都要进行格式化
【集群】
- 网络方面更需要设置好
- 创建多个hadoop用户,同时记得赋root权
- hosts设置好节点
- 在每台机子设置好/etc/profile的Hadoop环境
这里不做过多解释了,我在上手的过程中,会出现很多小问题,供大家参考解决方案【求大家给出你们遇到的问题和更好的方案共享】
情况一
[hadoop@cenServer bin]$ ./hadoop version
ERROR: JAVA_HOME is not set and could not be found.
回答:明显是你装了java之后没有配置环境变量,记得随时java -version
检查一下。
情况二
[hadoop@cenServer bin]$ ./hadoop version
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /opt/hadoop/hadoop-3.2.0/logs/fairscheduler-statedump.log (权限不够)
回答:看到权限不够
或者Permission denied
字样,应该懂得使用sudo
塞?什么?不想输入密码?参考
https://blog.csdn.net/Z0157/article/details/82079252 【Liunx:sudo命令不在重复输入password,和不再每次都输入sudo】
情况三
[hadoop@cenServer hadoop-3.2.0]$ bin/hdfs namenode -format
ERROR: Unable to write in /opt/hadoop/hadoop-3.2.0/logs. Aborting.
回答:要么你还是sudo
,要么你就chmod -R 777 /opt/hadoop/hadoop-3.2.0/logs
给他赋权呗
情况四
Starting namenodes on [192.xxx.xxx.134]
上一次登录:五 5月 31 10:34:23 CST 2019pts/4 上
192.168.114.134: ssh: connect to host 192.168.114.134 port 22: Connection timed out
Starting datanodes
上一次登录:五 5月 31 10:36:23 CST 2019pts/4 上
Starting secondary namenodes [cenServer]
上一次登录:五 5月 31 10:36:34 CST 2019pts/4 上
cenServer: ssh: Could not resolve hostname censerver: Name or service not known
回答:假如在启动hadoop出现以上的情况,首先可以去logs去查日志,其次就是查看/etc/hosts
内有无设置好ip地址,如上不认识censerver,就需要把censerver给一个localhost,要设置自己正确的ip窝。
情况五
[root@cenServer hadoop-3.2.0]# bin/hdfs dfs -put input input_test
2019-06-03 10:13:33,439 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
put: Cannot create directory /user/root/input_test/input. Name node is in safe mode.
回答:看见Name node is in safe mode.
字样,肯定让其离开安全模式,即可输入hadoop dfsadmin -safemode leave
指令。
情况六
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
回答:由于可能存在依赖包版本过低,看到这种提示,一可以选择忽略,二是可以先排除64位与32位的问题,其次就是查看glibc 版本和输入hadoop checknative -a
指令查看是否出现false字样。
解决方案参考:
https://blog.csdn.net/u010003835/article/details/81127984 【1】
开撸,首先成功启动Hadoop的时候,我们不难发现一些关键词出现在上一篇介绍hdfs的文章,
[root@cenServer hadoop-3.2.0]# sbin/start-dfs.sh
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Starting namenodes on [cenServer]
上一次登录:五 5月 31 10:44:00 CST 2019pts/4 上
cenServer: Warning: Permanently added 'censerver,192.xxx.xxx.130' (ECDSA) to the list of known hosts.
Starting datanodes
上一次登录:五 5月 31 11:09:48 CST 2019pts/4 上
Starting secondary namenodes [cenServer]
上一次登录:五 5月 31 11:09:51 CST 2019pts/4 上
namenodes、datanodes还有secondary namenodes的进程启动,你甚至可以输入jps
去查看这些进程是否启动。
为了不同于链接中的例子,整一个demo演示一波hadoop-mapreduce-examples-3.2.0.jar这个包的作用,以此简单介绍一下map-reduce。
首先当然是创建目录
[root@cenServer hadoop-3.2.0]# mkdir input
[root@cenServer hadoop-3.2.0]# cd input/
再创建两份文件,分别输入内容hello world
和hello hadoop
[root@cenServer input]# touch fileA.txt;echo "hello world" >> fileA.txt
[root@cenServer input]# touch fileB.txt;echo "hello hadoop" >> fileB.txt
将input目录上传到hadoop上命名为input_test,并查看
[root@cenServer hadoop-3.2.0]# bin/hdfs dfs -put input input_test
[root@cenServer hadoop-3.2.0]# bin/hdfs dfs -ls
Found 1 items
drwxr-xr-x - root supergroup 0 2019-05-31 17:26 input_test
运行map-reduce包的wordcount功能,待运行完毕后会生成output文件夹
[root@cenServer hadoop-3.2.0]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jar wordcount input_test output
运行成功的话,打开output文件夹里面的part-r-00000 的文件内容
[root@cenServer hadoop-3.2.0]# bin/hdfs dfs -cat output/part-r-00000
hadoop 1
hello 2
world 1
表面上的确是单词统计的功能,我们先反编译这个jar包看看源码:
加上官方文档的解释
MapReduce - 用户界面
本节提供了MapReduce框架的每个面向用户方面的合理数量的详细信息。这应该有助于用户以细粒度的方式实现,配置和调整他们的工作。但请注意,每个类/接口的javadoc仍然是最全面的文档; 这只是一个教程。
我们先来看看
Mapper
和Reducer
接口。应用程序通常会实现它们以提供map
和reduce
方法。然后我们将讨论其他核心接口,包括
Job
,Partitioner
,InputFormat
,OutputFormat
等。最后,我们将讨论框架的一些有用功能,如
DistributedCache
,IsolationRunner
等。Mapper
Mapper将key/value对映射到一组中间key/value对。
Maps是将输入记录转换为中间记录的各个任务。转换后的中间记录不需要与输入记录的类型相同。给定的输入对可以映射到零个或多个输出对。
Hadoop MapReduce框架为作业的
InputFormat
生成的每个InputSplit
生成一个map任务。``总的来说,Mapper实现通过Job.setMapperClass(Class)方法传递给作业。然后,框架为该任务的
InputSplit
中的每个键/值对调用map(WritableComparable,Writable,Context)。然后,应用程序可以覆盖清理(Context)
方法以执行任何所需的清理。````输出对不需要与输入对具有相同的类型。给定的输入对可以映射到零个或多个输出对。通过调用context.write(WritableComparable,Writable)来收集输出对。
应用程序可以使用
Counter
报告其统计信息。随后将与给定输出键关联的所有中间值按框架分组,并传递给
Reducer
以确定最终输出。用户可以通过Job.setGroupingComparatorClass(Class)指定Comparator
来控制分组。对
Mapper
输出进行排序,然后根据Reducer
进行分区。分区总数与作业的reduce任务数相同。用户可以通过实现自定义分区程序
来控制哪些键(以及记录)转到哪个Reducer
。``用户可以选择通过Job.setCombinerClass(Class)指定
组合器
,以执行中间输出的本地聚合,这有助于减少从Mapper
传输到Reducer
的数据量。````中间排序的输出始终以简单(key-len,key,value-len,value)格式存储。应用程序可以控制是否以及如何压缩中间输出,以及通过
配置
使用CompressionCodec。``有多少Map?
Maps的数量通常由输入的总大小驱动,即输入文件的块总数。
Maps的正确并行度似乎是每个节点大约10-100个maps,尽管已经为非常cpu-light地图任务设置了300个maps。任务设置需要一段时间,因此最好是maps至少需要一分钟才能执行。
因此,如果您期望10TB的输入数据并且块大小为
128MB
,那么除非使用Configuration.set(MRJobConfig.NUM_MAPS
,int)(仅提供框架提示)来设置82,000个映射,否则将使用它来设置它甚至更高。Reducer
Reducer减少了一组中间值,这些中间值与一组较小的值共享一个键。
作业的减少次数由用户通过Job.setNumReduceTasks(int)设置。
总的来说,
Reducer
实现通过Job.setReducerClass(Class)方法传递Job
的作业,并且可以覆盖它以初始化它们自己。然后,框架为分组输入中的每个<key,(list of values)>
对调用reduce(WritableComparable,Iterable ,Context)方法。然后,应用程序可以覆盖清理(Context)
方法以执行任何所需的清理。````
Reducer
有3个主要阶段:shuffle,sort和reduce。
为了更好的解释其作用,我还有以下的图片作为参考
由于时间关系,在这里也不能大篇幅给你们讲解,希望在之后的文章中,以更好的形式(或者分析部分源码)让大家了解到Map-Reduce,大家也可以只知道他有助于用户以细粒度的方式实现、配置和调整他们的工作的作用就好了。