linux怎么查看本机内存大小
261
2022-11-16
试玩Hadoop之踩坑日记
引言
下载
在真正的碰Hadoop之前我们首先需要安装一些配置.即SSH和JAVA环境.
sudo apt-get install openssh-server ssh localhost
因为后面的步骤需要输入密码,所以嫌麻烦的朋友可以配置下SSH免密登录,执行以下操作即可:
cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost ssh-keygen -t rsa #会有提示,都按回车就可以,这一步是生成秘钥,出现的那个奇怪的长方形就是 cat ./id_rsa.pub >> ./authorized_keys
这样我们再登录就不必再输入密码了.
至于JAVA环境不必多说,网上的教程很多,这一步我们要做的就是在环境变量中加入JAVA_HOME,这一步非常重要,后面有两个错误都会出在这里,首先抛出一个通用解决方案,后面说最终解决方案.
我们需要在~/.bashrc中加入以下语句:
export JAVA_HOME=JDK安装路径
source ~/.bashrc
然后我们执行echo $JAVA_HOME就可以看到我们的设置了.这里我们上面说到的两个问题就是:
JDK12在执行时会出现一个反射问题,最后使用JDK8解决问题.哪怕这里配置了环境变量后面在配置伪分布式的时候还是会出现找不到环境变量的问题.
然后我们需要解压这个压缩包到我们想要的地方,我因为是随便玩玩,就放在了桌面:
sudo tar -zxf ~/Download/hadoop-2.7.7.tar.gz -C /Desktop/Hadoop cd /Desktop/Hadoop sudo mv ./hadoop-2.7.7/ ./hadoop
执行如下命令可以看看我们的操作是否可用:
cd /Desktop/Hadoop/hadoop ./bin/hadoop version
单机配置
Hadoop自带了很多有意思的小例子,这些在单机模式下不需要任何配置也能跑起来.我们只需要运行这个语句./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar就可以看到所有的小例子:
cd Desktop/Hadoop/hadoop # 进入Hadoop目录 mkdir input # 创建输入 cp ./etc/hadoop/.xml ./input # 把配置文件当做输入 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-.jar wordcount ./input ./output // 运行一个mapreduce程序 cat ./output/* // 这是我们的结果目录
然后就成了,重点在后面.
伪分布式配置
伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml,配置方式如下:
core-site.xml
hdfs-site.xml
这里伪分布式其实只需要配置 fs.defaultFS 和 dfs.replication 就可以运行,但是会默认使用临时目录/tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行,这样就可能会在后面的执行中出现NameNode失败的情况,所以这里指定一个tmp文件.然后我们执行Namenode初始化:
./bin/hdfs namenode -format
然后就是最重要的一步,开启NameNode和DataNode守护进程,即执行:
./sbin/start-dfs.sh
但显然事情不会这么容易,这里我一共遇到了六处错误:
找不到JAVA_NAMEPermission denied (publickey,gssapi-keyex).Permission denied, please try again.错误。The authenticity of host 192.168.0.xxx can’t be established执行./sbin/start-dfs.sh出现反射错误.(解决方案为切换JDK版本)Namenode启动失败.
这就是我出现这个问题的原因,我开始使用的端口是9000,在ss -tanl以后我发现9000我其实用做了其他的事情,至此这个问题也算是解决了.在core-site.xml改下端口就好了.这件事情告诉我们日志是一个非常重要的事情.
然后就是运行这伪为分布式的实例,
./bin/hdfs dfs -mkdir -p /user/hadoop // 在HDFS中创建一个文件夹./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 /user/hadoop/output '[a-z.]+' // 执行mapreduce程序
我们来看看结果:
./bin/hdfs dfs -ls /user/hadoop/output
$ rm -r ./output # 先删除本地的 output 文件夹(如果存在)$ ./bin/hdfs dfs -get /user/hadoop/output ./output # 将 HDFS 上的 output 文件夹拷贝到本机$ cat ./output/*
这里很重要的一点就是Hadoop中ouput文件不能重名,这里的文件名需要我们保证不相同,否则会出现错误.
如果我们想要在执行一次获取相同的结果,则需要:
./bin/hdfs dfs -rm -r output
为什么要这样,其实很好理解,因为真正使用没有像我们这样的使用的,一般来说Hadoop存储在文件中的值要么是一个大任务中的一个重要MapReduce的输出值,要么是一个任务(多个MapReduce组成)的返回值,我们当然不希望值被无声无息的覆盖.
以上.
总结
Hadoop确实是一个很有意思的东西,其对大数据的处理方法确实非常值得一谈,这也是为什么十几年前这东西这么火的原因,但是看过MapReduce论文和DDIA的都知道这个玩意的各个特性确实很适合谷歌,但是不一定完美适合于其他公司,所以我相信各大公司一定有各种这个东西的闭源版本,当然也有很多开源的针对不同场景的优化版本.话虽如此,但是它的设计理念仍值得我们学习,HDFS和MapReduce产生的剧烈反应实在是让人觉得精美,它向上层完美的隐藏了下层的复杂逻辑,单从这个角度它就非常成功.更不必说其借鉴的Unix的设计哲学.总之还是那一句话,学无止境,保持一颗上进于敬畏之心才可.
参考:
博文《好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can’t be established. 的问题》博文《启动hadoop时报root@localhost’s password: localhost: Permission denied, please try again.错误。》博文《普通用户ssh免密登陆完美解决(Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password))》博文《启动hadoop,报错Error JAVA_HOME is not set and could not be found》博文《Mac下Hadoop伪分布式安装及出现的问题(JDK版本,Hadoop本地库编译)》博文《Ubuntu 16.04上安装Hadoop并成功运行》
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~