惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
月光博客
月光博客
IT之家
IT之家
B
Blog RSS Feed
T
Tailwind CSS Blog
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
MyScale Blog
MyScale Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - Franky
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
博客园_首页
B
Blog
V
V2EX
腾讯CDC
Vercel News
Vercel News
量子位
Microsoft Security Blog
Microsoft Security Blog

博客园 - moonz-wu

招聘研发工程师 职业规划:管理vs技术 PacificA中的租约与失效检测解读 可扩展的事件复用技术:epoll和kqueue 面试的,或许用的着 Zero to One读后感 Fourth glance in Go Third glance in Go Second glance in Go First glance in Go 好RESTful API的设计原则 RESTful API的设计与开发 架构风格之比较 所有有意愿成为程序员的人都应该看的文章 马不停蹄的向前走着,却发现羊已经等在了前面-我的2014 看到一篇很有意思的文章,但是我们身边确实有这样的人 如何延长windows评估版的方法 关于技术的选择,作为开发人员你应该看看 新的一年又开始了
Hadoop从伪分布式到真正的分布式
moonz-wu · 2014-11-07 · via 博客园 - moonz-wu

对这两天学习hadoop的一个总结,概念就不提了。直接说部署的事,关于如何部署hadoop网上的资料很多, 比较经典的还是Tim在IBM developworks上的系列文章

可能是大牛在写文章的时候把一些常识性的东西给省略了。使我这样的菜鸟在照猫画虎的时候费了不少周章,下面慢慢说吧。首先是真实分布式系统的架构:

Hadoop 主从节点分解

主从模式的架构是比较常见的。如果要做水平扩展,通过添加从节点就可以实现计算能力与存储能力扩容。但要实现这样的部署模式还需要做几件事:

以下所有的命令和配置都是在Ubuntu上操作的,不同的Linux系统或许有些许的区别

搭建一个伪分布式的hadoop环境,遇到的第一个问题是JAVA_HOME没设置。Hadoop是用Java开发的,所以对Java的环境依赖比较严重。所以需要先配置一下Java。

Oracle JDK和Open JDK都可以。唯一需要注意的是Oracle JDK已经不被Ubuntu的官方repository支持了,安装麻烦些。Open JDK直接执行: sudo apt-get install openjdk-6-jdk

安装完后,要设置JAVA_HOME的环境变量:
sudo gedit /etc/environment
然后添加
CLASSPATH=./:/usr/lib/jvm/java-6-openjdk/lib
JAVA_HOME=/usr/lib/jvm/java-6-openjdk
PATH添加:/usr/lib/jvm/java-6-openjdk
或者
修改hadoop-env.sh文件,添加export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64/

遇到的第二个问题是hadoop运行权限的问题,hadoop默认的namenode服务是不允许以root用户运行的,所以必须新建一个用户来运行。命令:
sudo addgroup hadoopgroup
sudo adduser --ingroup hadoop hadoop
sudo chmod +w /etc/sudoers
sudo vim /etc/sudoers
添加配置:
在root ALL=(ALL) ALL后 hadoop ALL=(ALL) ALL使hadoop用户具有root权限
再运行格式化命令:hadoop-0.20 namenode -format时,又遇到了“Create directory”的错误,
问题是cache目录的权限不对,那么就修改一下权限sudo chown hadoop:hadoopgroup cache

运行 hadoop-0.20 namenode -format,输出成功信息。

接下来运行hadoop-0.20 fs -ls /遇到了第三个问题连接The authenticity of host can't be 
established 这个问题是因为ssh的设置导致的,通过修改/etc/ssh/ssh_config,在文件尾添加:
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

今天遇到了第四个坑,就是重启机器后启动hadoop服务失败。尝试着去重新格式化namenode,也失败。错误信息如下:

Format aborted in /home/hadoop/dfs/name

后来查看了一下网上的解决方案,原来是如果要重新格式化namenode必须先将原来的namenode文件夹删除先。我的路径是/usr/lib/hadoop-0.20/cache/hadoop/。然后,再重新格式化,重新启动服务就可以了。还有就是用户权限的问题,最好的办法就是将所有与hadoop相关的文件夹权限都设置成hadoop用户所有。

第五个坑是wordcount程序哪里找。网上和文章里都没找到大牛的jar文件。经过一番搜索,原来hadoop自带了一个,那就是在hadoop的安装目录下有一个hadoop-examples.jar文件。这个就可以用来统计word。

2. 配置hosts文件,这里就看出了系统的不同之处了。Tim的文章里写的是这样

master 192.168.108.133
slave1 192.168.108.134
slave2 192.168.108.135
但是在Ubuntu里应该是这样:
192.168.108.133   master 
192.168.108.134   slave1 
192.168.108.135   slave2 

3. 配置无密码登陆从master节点到slave节点,做法是先在master节点上生成空密码的key,然后拷贝到slave节点上。
ssh-keygen -t rsa 然后一路回车
cat ~/.ssh/id_rsa.pub >> authorized_keys
拷贝authorized_keys文件到slave机器的~/.ssh/文件夹下。这里要注意的是master节点和slave节点都必须是 同名用户操作,这个用户也是hadoop的服务用户。
然后在slave机器上就该文件权限: chmod 644 ~/.ssh/authorized_keys,否则也是不工作的。如果你发现ssh的认证比较慢,请修改/etc/ssh/ssh_config文件,将GSSAPIAuthentication yes改为no。
4. 修改hadoop的配置文件,这个就不详写的,大牛的文章里也都有。唯一需要注意的是,创建自己的临时目录,并更新到core-site.xml文件中。
<property>
     <name>hadoop.tmp.dir</name>
     <value>/app/hadoop/tmp</value>
</property>
注意,这里的/app/hadoop/tmp目录必须改成hadoop用户的权限。

5. 按照大牛文章里面的步骤,格式namenode,启动hadoop服务。这里要注意的是这些步骤都是在master节点上操作的,因为hadoop是通过可信ssh方式让master与slave沟通的。这也是为什么要配置无密码登陆的目的。如果一切顺利,恭喜你的第一个分布式大数据计算框架已经搭建成功。
注意:
你可能会跟我一样犯二的时候,不小心把core-site.xml里面的"fs.default.name"写错了。那么你就会得到"Invalid URI for NameNode address"的异常信息。

最后要说的是,上面的架构图是hadoop 1.0的。2.0现在已经把job tracker给干掉了,由于性能和单点失效的原因,已经换了架构。不过对于初学者来说,1.0就已经够了。