本文主要是介绍Hadoop之wordcount有感,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Hadoop wordcount的实现和一些问题总结
作者在解决问题过程中遇到的很有帮助的一个博客就是来自如下地址,特别放在文首感谢!
http://www.powerxing.com/install-hadoop/
- 文件调整
就上篇hadoop配置而言,由于未认识到hadoop2.x的版本配置方面稍有不同,所以在做wordcount的sample之前先进行了改进。
不同在于mapred-site.xml和yarn-site.xml分别变为了
<configuration> <property><name>mapreduce.framework.name</name> <value>yarn</value> </property>
</configuration>
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property>
</configuration>
- 单机:
这里假设已经安装好了(JDK,SSH,SSH配置,Homebrew,完成了brew install hadoop)
还未进行伪分布式配置(或者配置了过后直接把配置的全部注释掉,即是说core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml里的内容全部注释掉(用 <!−−−−> <script type="math/tex" id="MathJax-Element-1"> </script>)仅留下 <configuration></configuration> )
$ cd {your mac user name}/hadoop-2.7.3 #这里我没有将hadoop-2.7.3改为hadoop,可以改
$ mkdir input #创建input文件夹
$ cp etc/hadoop/*.xml input #把配置文件copy到文件夹中
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+' #将当前目录下的input文件夹作为输入 输出到output文件夹(这就和一开始伪分布式遇到的路径问题相对应了!)
$ cat output/* #可以查看wordcount结果
- 伪分布式:
配置core-site.xml
<configuration><property><name>hadoop.tmp.dir</name><value>file:/Users/{your mac name}/hadoop-2.7.3/tmp</value><description>Abase for other temporary directories.</description></property><property><name>fs.defaultFS</name><value>hdfs://localhost:9000</value></property>
</configuration>
配置hdfs-site.xml
<configuration><property><name>dfs.replication</name><value>1</value></property><property><name>dfs.namenode.name.dir</name><value>file:/Users/{your mac name}/hadoop-2.7.3/tmp/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>file:/Users/{your mac name}/hadoop-2.7.3/tmp/dfs/data</value></property>
</configuration>
重新配置后
$ bin/hdfs namenode -format
$ sbin/start-dfs.sh
jps查看到namenode、datanode、secondarynamenode
$ bin/hdfs dfs -mkdir -p /user/hadoop
$ bin/hdfs dfs -mkdir /user/hadoop/input
$ bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input
$ bin/hdfs dfs -ls /user/hadoop/input
查看到在分布式系统中已经复制完成了
$ bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'
特别注意grep /user/hadoop/input output这才是分布式系统里面的路径
$ bin/hdfs dfs -cat output/*
查看到在分布式系统中的output结果。
伪分布式wordcount至此结束。
- 问题1:无datanode
COPYING could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation.
解决方法如下:
第一步:
sudo rm -R /tmp/*
第二步:
hdfs namenode -format
然后sbin/start-dfs.sh再jps就可以看到datanode。
当然这里建议阅读完整的log文件,查看是没有datanode还是datanode端口被占用(端口应该是50020),如果是后者请点以下链接参照解决 hadoop之端口被占用问题namenode无法启动
- 问题2:路径问题
下一步操作创建分布式系统的路径
$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir /user/{username} #your username
$ sbin/start-yarn.sh
在建立目录后应特别注意下面两个的不同,一个是当前目录下的操作,一个是分布式系统目录下的操作,尤其在以后的文件复制步骤中很容易出错
bin/ -ls
bin/hdfs dfs -ls /user/{username}
例如
bin/hdfs dfs -put etc/hadoop input
可能就会出现put: `input’: No such file or directory,接下来的部分也就无法运行
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'
在各个博客中找到如下解决方法都没有用
- hostname的配置 Connecting to ResourceManager at /0.0.0.0:8032 yarn.resourcemanager.address 127.0.0.1:8032
- 退出安全模式 org.apache.hadoop.ipc.RemoteException (org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot delete bin/hadoop dfsadmin -safemode leave
其实忽略了真正出错的地方
org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist
由于命令实在分布式系统中执行的,所以grep input output针对的是分布式系统的input和output文档,这里没有input路径需要建立路径(user后面的用户请填自己的)
bin/hdfs dfs -mkdir /user/hadoop/input
bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input
这篇关于Hadoop之wordcount有感的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!