美文网首页
HDFS简单实践以及遇到的小问题

HDFS简单实践以及遇到的小问题

作者: e5bda6e7a596 | 来源:发表于2019-05-31 17:35 被阅读0次

    引言

    ​ 哇,好久没更新,最近工作太忙了。记得上次我们简单了解了一下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的注意点:

    【单机、伪分布式】

    1. 把虚拟机的网络设置好(我使用的是NAT)
    2. 下载并上传hadoop3.Xjdk1.8(可下可不下)安装包到你的虚拟机
    3. 获权root
    4. 装好centOS必要的插件rsync
    5. 关闭防火墙,并检查你虚拟机内是否存在jdk,若无请安装、修改系统环境变量
    6. 安装Hadoop,记得要在bin目录下执行指令(你懂的)——老手忽略这一点
    7. 运行伪分布式要记得合理修改配置xml文件,注意ip地址,注意能否ssh免密码登录
    8. 修改完任何配置文件后,都要进行格式化

    【集群】

    1. 网络方面更需要设置好
    2. 创建多个hadoop用户,同时记得赋root权
    3. hosts设置好节点
    4. 在每台机子设置好/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】

    https://blog.csdn.net/daiqinge/article/details/83545443 【2】


    开撸,首先成功启动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 上
    
    

    namenodesdatanodes还有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 worldhello 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仍然是最全面的文档; 这只是一个教程。

    我们先来看看MapperReducer接口。应用程序通常会实现它们以提供mapreduce方法。

    然后我们将讨论其他核心接口,包括JobPartitionerInputFormatOutputFormat等。

    最后,我们将讨论框架的一些有用功能,如DistributedCacheIsolationRunner等。

    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,大家也可以只知道他有助于用户以细粒度的方式实现、配置和调整他们的工作的作用就好了。

    相关文章

      网友评论

          本文标题:HDFS简单实践以及遇到的小问题

          本文链接:https://www.haomeiwen.com/subject/mzgioqtx.html