一个人要是长时间一直做一件事,思维容易固化。

就像那些从太空回来的宇航员,吃饭时容易丢开拿在手里的勺子。当勺子掉在地上时,哦,我已经回到地球了^_^。

所以,适当尝试新鲜事物,既是对大脑的放松,也是开阔思路的好机会,好方法。

那这次,博主尝试的新事物是什么呢?我们知道,大、物、移、智、云是近些年比较火的技术,具体来讲就是大数据、物联网、移动5G、人工智能、云计算。每一个都显得高大上。

所以,博主决定在其中选择一个来学习学习。其实,这些技术并不是割裂的,而是有内在的本质联系的,具体可参考博主的另一篇博文

一文将大数据、云计算、物联网、5G(移动网)、人工智能等最新技术串起来_wwwyuewww的专栏-CSDN博客

那么,选择哪一个方向来尝试一下呢?

这不,一年一度的诗词大会又开始了。

 

现在人工智能技术非常火,很多人就想着,要是让AI来写诗,会是什么样的。还有人真的做了这件事。

这里,博主就不尝试那么复杂的了,能力和时间都不允许。我们来个简单的,选择大数据方向,来分析分析唐诗三百首里,各个汉字出现的频率。

需要补充说明一下,就唐诗三百首而言,说实话,还不至于用大数据技术,简单写个程序就可以搞定。但是,如果有更多的数据,那么使用大数据技术,还是可以提升效率的。

好了,闲话少说,我们简单看看怎么做。我们使用Hadoop完成数据分析。

整个过程分为三个部分

第一部分 先作为分布式文件系统来使用

1 下载安装Hadoop。这里,我用了老版本2.8
  因为Hadoop依赖Java,需要准备Java环境,导出Java环境变量

  解压Hadoop安装包,然后在/etc/profile文件中导出Hadoop环境变量

  同时,在Hadoop env中也导出Java环境变量

2 按照官方示例,格式化分布式文件系统,启动HDFS

Hadoop namenode -format
hdfs namenode -format

上述两个命令都可以,不过后续都推荐第二个命令
关停之前的服务
stop dfs  和yarn 
  
重启服务
start dfs 和 yarn
使用jps命令查看java进程
23232 Jps
20977 ResourceManager
20373 NameNode
20806 SecondaryNameNode
21147 NodeManager
20571 DataNode

  为啥要查看java进程呢,因为一个基本的Hadoop集群中的节点主要有:
  NameNode:负责协调集群中的数据存储
  DataNode:存储被拆分的数据块
  JobTracker:协调数据计算任务
  TaskTracker:负责执行由JobTracker指派的任务
  SecondaryNameNode:帮助NameNode收集文件系统运行的状态信息

  要确定上述关键节点进程成功运行,否则,不利于后续错误的排除判断:倒地是程序问题还是环境问题。所以,最好检查一下。
  
  实际中,发现缺少DataNode,将java JDK版本从10切换到8

  删除/root/hadoop目录下的日志和临时文件(目录由配置文件中指定),重新启动服务,问题解决

  但也有说《重新格式化名称节点之前需要清空DFS下的名称和数据文件夹以解决数据节点无法启动的问题。》可能不是JDK版本的问题
  
  相对之前输出,也没有an illegal错误提示了,这个应该是java版本的原因

  但是还是仍然有如下错误

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

  其实把native目录下的库拷贝到上一层lib目录下,即可通过检测

  但是会提示snappy库没有,这个需要下载源代码,编译安装

3 用命令方式,测试HDFS文件系统

查看目录
Hadoop fs -ls /
创建一个新的目录,创建后可以在web界面查看当前操作的结果。web界面的端口为50070
hdfs dfs -mkdir /user

  对于文件系统操作命令,可以用Hadoop fs 和hdfs dfs两个命令,根据网上资料,第一个命令可以操作更多格式的文件系统,不止hdfs文件系统
  
  命令的基本使用可以这样理解,将Hadoop fs看做一个整体,带选项,比如 -ls -mkdir等,然后指定操作目录即可。

  注意,这里的目录是针对的hdfs分布式文件系统,不是电脑本地目录

本地和hdfs文件系统中文件相互拷贝命令选项如下:
[-copyFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]

第二部分,作为数据分析平台使用

4 执行一个MapReduce任务

  创建一个input 和output 文件目录
  将Hadoop配置文件拷贝到input目录,作为分析的源文件
  执行grep 任务

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar grep /user/input /user/output 'dfs[a-z.]+'

  提示无法连接8032端口
  
  修改yarn的配置文件,增加如下内容,

<property>  
  <name>yarn.resourcemanager.address</name>  
  <value>master:8032</value>  
</property>  
<property>  
  <name>yarn.resourcemanager.scheduler.address</name>  
  <value>master:8030</value>  
</property>  
<property>  
  <name>yarn.resourcemanager.resource-tracker.address</name>  
  <value>master:8031</value>  
</property>

  提示无法连接master:8032,意思貌似无法解析该地址
  修改配置文件,将master替换为localhost
  再次执行任务,提示
  mapreduce.Job: Task Id : attempt_1578829933099_0001_m_000005_0, Status : FAILED
  
  该问题同样在java版本退回到JDK8后未再出现,map-reduce任务通过。之前许多错误可能是java版本不兼容导致。
  
  通过8088端口可以查看这类任务的执行情况及执行日志
  
  第一次执行提示output目录已存在错误,修改为

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar grep /user/input /user/output/grepresult 'dfs[a-z.]+'

  执行成功。将执行结果拷贝到本地

hdfs dfs -copyToLocal /user/output/ test/

  查看本地中的执行结果,跟在本地单独执行命令检查,结果基本一致

root@ubuntu:/home/work/hadoop-2.8.5/test/output/grepresult# cat part-r-00000 
  1       dfs.replication
  1       dfs.permissions
  1       dfs.name.dir
  1       dfs.data.dir

  本地单独命令执行结果

root@ubuntu:/home/work/hadoop-2.8.5/etc/hadoop# cat hdfs-site.xml | grep dfs[a-z.]
  <name>dfs.name.dir</name>
  <name>dfs.data.dir</name>
  <name>dfs.replication</name>
  <name>dfs.permissions</name>

第三部分,通过Java编程,使用Hadoop提供的接口,执行MapReduce任务,完成古诗分析

5 编写MapReduce任务,分析古诗

  现在可以编写程序,来进行分析统计了。程序很简单,读入古诗的每一个字符,然后统计它们出现的频率。

  我们使用Windows环境的idea来编辑和编译Java库。

  参考网上的例子,主要有三个文件,分别是WordCountDriver.java,WordCountMapper.java以及WordCountReducer.java。


  第一个是框架文件,将后两个管理起来,第二是做Map操作,第三个是做Reduce操作。

  具体统计操作写的很简陋,没有做过多的处理。

  最后编译生成一个jar库HadoopApi.jar。
  
6 上传待分析古诗文件

  我们将从网络下载的含有唐诗三百首的文本文件传到HDFS中。古诗格式如下图所示。


7 执行分析程序,进行分析

hadoop jar /home/share/com/HadoopApi.jar com.xxx.hadoop.Test.WordCountDriver

8 将分析结果从Hadoop的分布式文件系统中拷贝出来

  分析结果是一个文本文件,打开可以看到如下图所示


  
  如前所述,这里没有对结果排序。所以,对这个数据,还需要再处理一次。

  我们将数据拷贝到Excel中,进行一下排序,结果就出来了,如下图所示:

  
  可以看到,最高频字是“不”,其次是“人”,再次是“山”。有没有出乎你的意料?

  如果我们统计所有的古诗,就可以得到古人写诗最喜欢用的字了。
  
后记:

不得不说,兴趣才是最好的老师。当你想要做感兴趣的事情时,主动学习就不是什么困难的事情了。
  
 
  

 

 

 

 

 

 


 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐