一文彻底了解Hadoop的来龙去脉( 四 )


我们来看目标 。
我们输入两个文件,file1和file2 。交给hadoop执行之后,会返回file1和file2文件中的单词的计数 。
我们说过,hadoop返回的是<key,value>的键值对的形式 。
所以结果如下:也就是把单词以及单词的个数返回
school 1
hello 3
world 2
...
【一文彻底了解Hadoop的来龙去脉】所以我们首先创建两个文件:
file1和file2 。
随便填点东西在里面,文件中的内容是用来计数 。单词之间用空格分隔,当然这是不一定的,如何区分单词是在后面jar包中的map程序中分辨的 。
我们写好了这两个文件之后,要将文件提交到HDFS中 。如何提交呢?
提交之前,首先要确保hadoop已经运行起来了,查看jps可以看到hadoop的进程 。
首先我们在hadoop的HDFS中创建一个文件夹 。打开cmd,输入
hdfs dfs -mkdir /test这样就可以在HDFS根目录下创建一个input_wordcount的文件夹 。
其实Hadoop的HDFS命令行非常接近Shell,只需要使用hdfs dfs -后面写上shell命令就可以对应执操作HDFS文件系统了 。例如:
hdfs dfs -ls / 查看根目录下的文件 。
创建文件夹之后,我们就可以提交我们写的两个file文件 。
hdfs dfs -put input/* /test如果报错:
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /input/file1.txt._COPYING_ could only be written to 0 of the 1 minReplication nodes. There a0 datanode(s) running and no node(s) are excluded in this operation. at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:2099) at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:287) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2658) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:866) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:550) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)使用命令查看报告:hadoop dfsadmin -report

一文彻底了解Hadoop的来龙去脉

文章插图
 
发现磁盘都是空的,这个问题一般是由于使用hadoop namenode -format 格式化多次,导致spaceID不一致造成的,这语句可不能随便执行的,解决方法如下[1]:
stop-all.cmdhdfs namenode -formatstart-all.cmd发现还是无法解决,然后看到日志窗口有如下异常:
java.io.IOException: Incompatible clusterIDs in D:tmphadoop-Administratordfsdata: namenode clusterID = CID-636ec898-037d-4196-b096-3f53e7d172fb; datanode clusterID = CID-9031b022-9e2e-4e46-9b46-855159d45f53 at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:719) at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadStorageDirectory(DataStorage.java:284) at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadDataStorage(DataStorage.java:397) at org.apache.hadoop.hdfs.server.datanode.DataStorage.addStorageLocation于是删掉 D:tmphadoop-Administrator下面的文件,重新执行方法[1] 。问题还是没解决,查看data目录下面,竟然没有datanode文件夹!最后发现etc下面的文件没有按照上述流程配置好,将没配置好的xml文件按照上述流程配置好之后,清空data目录以及D:tmphadoop-Administrator,然后重新执行方法[1],问题解决:
一文彻底了解Hadoop的来龙去脉

文章插图
 
这里我两个file文件都放在test目录下,所以直接使用正则表达式都提交上去即可,提交到根目录文件夹下 。然后我们查看根目录,查看是否提交完成 。
D:1_Program_Filehadoop-3.0.2sbin>hdfs dfs -ls /The filename, directory name, or volume label syntax is incorrect.Found 3 items-rw-r--r-- 1 Administrator supergroup 23 2019-08-03 13:08 /file1.txt-rw-r--r-- 1 Administrator supergroup 28 2019-08-03 13:08 /file2.txtdrwxr-xr-x - Administrator supergroup 0 2019-08-03 13:10 /test提交成功了 。第一个要求完成了,接下来我们就需要一个程序jar包 。
打开IDE或者myeclipse工具 。创建一个java程序,我在这里创建一个maven项目 。
首先我们需要导入依赖包:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hadoop.demo</groupId> <artifactId>HadoopDemo</artifactId> <version>0.0.1-SNAPSHOT</version><packaging>war</packaging> <dependencies><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --><dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.0</version></dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core --><dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>2.6.0</version></dependency></dependencies> <!-- fastjson --> </project>


推荐阅读