共计 9837 个字符,预计需要花费 25 分钟才能阅读完成。
1. 硬件环境
共有 3 台机器, 均使用的 linux 系统,Java 使用的是 jdk1.6.0。配置如下:
Hadoop1.example.com:192.168.2.1(NameNode)
hadoop2.example.com:192.168.2.2(DataNode)
hadoop3.example.com:192.168.2.3 (DataNode)
hadoop4.example.com:192.168.2.4
主机与 IP 之间有正确解析
对于 Hadoop 来说, 在 HDFS 看来, 节点分为 Namenode 和 Datanode, 其中 Namenode 只有一个, Datanode 可以是很多; 在 MapReduce 看来, 节点又分为 Jobtracker 和 Tasktracker, 其中 Jobtracker 只有一个,Tasktracker 可以是很多。我是将 namenode 和 jobtracker 部署在 hadoop1 上, hadoop2, hadoop3 作为 datanode 和 tasktracker。当然你也可以将 namenode ,datanode ,jobtracker,tasktracker 全部部署在一台机器上(这样就是伪分布式)。
2. 目录结构
由于 Hadoop 要求所有机器上 hadoop 的部署目录结构要相同, 并且都有一个相同的用户名的帐户。
我 的 三 台 机 器 上 是 这 样 的 : 都 有 一 个 hadoop 的 帐 户 , 主 目 录是 /home/hadoop。
添加用户 hadoop
#userad -u 800 hadoop
下载 hadop-1.2.1.tar.gz
解压 #tar zxf hadop-1.2.1.tar.gz
#ln -s hadoop-1.2.1 hadoop
#mv hadoop-1.2.1 /home/hadoop/
#cd /home/hadoop
#chown -R hadoop.hadoop hadoop-1.2.1/
#passwd hadoop 给用户 hadoop 创建密码
下载 jdk-6u32-linux-x64.bin
sh jdk-6u32-linux-x64.bin
cd ~
mv jdk1.6.0_32 hadoop-1.2.1/
cd hadoop-1.2.1/
创建软链接,以便与日后的更新、升级
ln -s jdk jdk1.6.0_32
————————————– 分割线 ————————————–
Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
————————————– 分割线 ————————————–
3.SSH 设置
在 Hadoop 启动以后,Namenode 是通过 SSH(Secure Shell) 来启动和停止各个节点上的各种守护进程的, 这就需要在节点之间执行指令的时候是不需要输入密码的方式, 故我们需要配置 SSH 使用无密码公钥认证的方式。
首先要保证每台机器上都装了 SSH 服务器, 且都正常启动。实际中我们用的都是 OpenSSH, 这是 SSH 协议的一个免费开源实现。
以本文中的 3 台机器为例, 现在 hadoop1 是主节点, 它需要主动发起 SSH 连接到 hadoop2 , 对于 SSH 服务来说, hadoop1 就是 SSH 客户端, 而 hadoop2,hadoop3 则是 SSH 服务端, 因此在 hadoop2,hadoop3 上需要确定 sshd 服务已经启动。简单的说, 在 hadoop1 上需要生成一个密钥对, 即一个私钥, 一个公钥。将公钥拷贝到 hadoop2 上, 这样, 比如当 hadoop1 向 hadoop2 发起 ssh 连接的时候,hadoop2 上就会生成一个随机数并用 hadoop1 的公钥对这个随机数进行加密并发送给 hadoop1,hadoop1 收到这个加密的数以后用私钥进行解密, 并将解密后的数发送回 hadoop2,hadoop2 确认解密的数无误后就允许 hadoop1 进行连接了。这就完成了一次公钥认证过程。
对于本文中的 3 台机器, 首先在 hadoop1 上生成密钥对:
#su – hadoop
$ssh-keygen
这个命令将为 hadoop1 上的用户 hadoop 生成其密钥对。生成的密钥对 id_rsa,id_rsa.pub, 在 /home/hadoop/.ssh 目录下。
$ssh-copy-id localhost
$ssh-copy-id 192.168.2.2
$ssh-copy-id 192.168.2.3
发布密钥到你本地和 hadoop2、hadoop3
试着登录本地和 hadoop2、hadoop3 看是否有密码验证,无密码即验证成功
下载 jdk-6u32-linux-x64.bin
sh jdk-6u32-linux-x64.bin
cd ~
mv jdk1.6.0_32 hadoop-1.2.1/
cd hadoop-1.2.1/
创建软链接
ln -s jdk jdk1.6.0_32
4. 环境变量
在 ~/hadoop-1.2.1/conf/ 目 录 下 的 hadoop-env.sh 中 设 置 Hadoop 需 要 的 环 境 变 量 , 其 中 JAVA_HOME 是 必 须 设 定 的 变 量。HADOOP_HOME 变量可以设定也可以不设定, 如果不设定, HADOOP_HOME 默认的是 bin 目录的父目录, 即本文中的 /home/hadoop/hadoop。
vim~/hadoop-1.2.1/conf/hadoop-env.sh
export JAVA_HOME=/home/hadoop/hadoop/jdk
先进行简单测试:
$cd /home/hadoop/hadoop/
$mkdir input
$cp conf/* input/
$bin/hadoop jar hadoop-examples-1.2.1.jar
$bin/hadoop jar hadoop-examples-1.2.1.jar grep input output ‘dfs[a-z.]+’
$cd output
$cat *
统计文件中的单词:
$bin/hadoop jar hadoop-examples-1.2.1.jar
$bin/hadoop jar hadoop-examples-1.2.1.jar wordcount input test
$cd test/
$cat *
5.hadoop 配置文件
$cd /home/hadoop/hadoop/conf
conf/core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop1.example.com:9000</value>
</property></configuration>
conf/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property></configuration>
conf/mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hadoop1.example.com:9001</value>
</property></configuration>
伪分布式测试:
$mkdir ~/bin
$ln -s /home/hadoop/hadoop/jdk/bin/jps ~/bin/
$cd /home/hadoop/hadoop/
$bin/hadoop namenode -format 先进行初始化
$bin/start-all.sh
web 测试 192.168.2.1:50070
192.168.2.1:50030
$rm -fr input/ output/ test/
$bin/hadoop fs -mkdir input
$bin/hadoop fs -put conf input
$bin/hadoop fs -lsr
192.168.2.1:50075 下查看 /usr/hadoop/input 是否有变化
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-07/104795p2.htm
6. 部署 Hadoop
前面讲的这么多 Hadoop 的环境变量和配置文件都是在 hadoop1 这台机器上的, 现在需要将 hadoop 部署到其他的机器上, 保证目录结构一致。
$scp -r /home/hadoop/hadoop hadoop2.example.com:/home/hadoop/
$scp -r /home/hadoop/hadoop hadoop3.example.com:/home/hadoop/
$scp -r .ssh/ hadoop2:
$scp -r .ssh/ hadoop3:
注意还要修改以下文件:
$cd /home/hadoop/hadoop/conf
conf/masters
hadoop1.example.com
conf/slaves
hadoop2.example.comhadoop3.example.com
$ln -s hadoop-1.2.1/ hadoop
$mkdir ~/bin
$ln -s ~/hadoop/jdk/bin/jps ~/bin
至此, 可以说,Hadoop 已经在各个机器上部署完毕了, 下面就让我们开始启动 Hadoop 吧。
7. 启动 Hadoop
启动之前, 我们先要格式化 namenode, 先进入~/hadoop/ 目录, 执行下面的命令:
$bin/hadoop namenode –format
不出意外, 应该会提示格式化成功。如果不成功, 就去 hadoop/logs/ 目录下去查看日志文件。
下面就该正式启动 hadoop 啦, 在 bin/ 下面有很多启动脚本, 可以根据自己的需要来启动。
* start-all.sh 启动所有的 Hadoop 守护。包括 namenode, datanode, jobtracker,tasktrack
* stop-all.sh 停止所有的 Hadoop
* start-mapred.sh 启动 Map/Reduce 守护。包括 Jobtracker 和 Tasktrack
* stop-mapred.sh 停止 Map/Reduce 守护
* start-dfs.sh 启动 Hadoop DFS 守护.Namenode 和 Datanode
* stop-dfs.sh 停止 DFS 守护
在这里, 简单启动所有守护:
[hadoop@hadoop1:hadoop]$bin/start-all.sh
$jps
查看 JobTracker,Jps,SecondaryNameNode,NameNode 是否启动成功。
同样, 如果要停止 hadoop, 则
[hadoop@hadoop1:hadoop]$bin/stop-all.sh
8. HDFS 操作
运行 bin/ 目录的 hadoop 命令, 可以查看 Haoop 所有支持的操作及其用法, 这里以几个简单的操作为例。
建立目录:
[hadoop@hadoop1 hadoop]$bin/hadoop dfs -mkdir testdir
在 HDFS 中建立一个名为 testdir 的目录, 复制文件:
[hadoop@hadoop1 hadoop]$bin/hadoop dfs -put /home/large.zip testfile.zip
把 本 地 文 件 large.zip 拷 贝 到 HDFS 的 根 目 录 /user/hadoop/ 下 , 文 件 名 为 testfile.zip, 查看现有文件:
[hadoop@hadoop1 hadoop]$bin/hadoop dfs -ls
9.hadoop 在线更新节点:
新增节点:
1). 在新增节点上安装 jdk, 并创建相同的 hadoop 用户,uid 等保持一致
2). 在 conf/slaves 文件中添加新增节点的 ip
3). 同步 master 上 hadoop 所有数据到新增节点上, 路径保持一致
4). 在新增节点上启动服务:
$ bin/hadoop-daemon.sh start datanode
$ bin/hadoop-daemon.sh start tasktracker
5). 均衡数据:
$ bin/start-balancer.sh
(1) 如果不执行均衡, 那么 cluster 会把新的数据都存放在新的 datanode 上, 这样会降低 mapred 的工作效率
(2) 设置平衡阈值, 默认是 10%, 值越低各节点越平衡, 但消耗时间也更长
$ bin/start-balancer.sh -threshold 5
在线删除 datanode 节点:
1). 在 master 上修改 conf/mapred-site.xml
<property>
<name>dfs.hosts.exclude</name>
<value>/home/hadoop/hadoop-1.2.1/conf/datanode-excludes</value>
</property>
2). 创建 datanode-excludes 文件, 并添加需要删除的主机, 一行一个
192.168.2.4
3). 在 master 上在线刷新节点
$ bin/hadoop dfsadmin -refreshNodes
此操作会在后台迁移数据, 等此节点的状态显示为 Decommissioned, 就可以安全关闭了。
4). 你可以通过以下命令查看 datanode 状态
$ bin/hadoop dfsadmin -report
在做数据迁移时, 此节点不要参与 tasktracker, 否则会出现异常。
在线删除 tasktracker 节点:
1). 在 master 上修改 conf/mapred-site.xml
<property>
<name>mapred.hosts.exclude</name>
<value>/home/hadoop/hadoop-1.2.1/conf/tasktracker-excludes</value>
</property>
2. 创建 tasktracker-excludes 文件, 并添加需要删除的主机名, 一行一个
hadoop4.example.com
3. 在 master 上在线刷新节点
$ bin/hadoop mradmin -refreshNodes
4. 登录 jobtracker 的网络接口, 进行查看。
更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13
1. 硬件环境
共有 3 台机器, 均使用的 linux 系统,Java 使用的是 jdk1.6.0。配置如下:
Hadoop1.example.com:192.168.2.1(NameNode)
hadoop2.example.com:192.168.2.2(DataNode)
hadoop3.example.com:192.168.2.3 (DataNode)
hadoop4.example.com:192.168.2.4
主机与 IP 之间有正确解析
对于 Hadoop 来说, 在 HDFS 看来, 节点分为 Namenode 和 Datanode, 其中 Namenode 只有一个, Datanode 可以是很多; 在 MapReduce 看来, 节点又分为 Jobtracker 和 Tasktracker, 其中 Jobtracker 只有一个,Tasktracker 可以是很多。我是将 namenode 和 jobtracker 部署在 hadoop1 上, hadoop2, hadoop3 作为 datanode 和 tasktracker。当然你也可以将 namenode ,datanode ,jobtracker,tasktracker 全部部署在一台机器上(这样就是伪分布式)。
2. 目录结构
由于 Hadoop 要求所有机器上 hadoop 的部署目录结构要相同, 并且都有一个相同的用户名的帐户。
我 的 三 台 机 器 上 是 这 样 的 : 都 有 一 个 hadoop 的 帐 户 , 主 目 录是 /home/hadoop。
添加用户 hadoop
#userad -u 800 hadoop
下载 hadop-1.2.1.tar.gz
解压 #tar zxf hadop-1.2.1.tar.gz
#ln -s hadoop-1.2.1 hadoop
#mv hadoop-1.2.1 /home/hadoop/
#cd /home/hadoop
#chown -R hadoop.hadoop hadoop-1.2.1/
#passwd hadoop 给用户 hadoop 创建密码
下载 jdk-6u32-linux-x64.bin
sh jdk-6u32-linux-x64.bin
cd ~
mv jdk1.6.0_32 hadoop-1.2.1/
cd hadoop-1.2.1/
创建软链接,以便与日后的更新、升级
ln -s jdk jdk1.6.0_32
————————————– 分割线 ————————————–
Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
————————————– 分割线 ————————————–
3.SSH 设置
在 Hadoop 启动以后,Namenode 是通过 SSH(Secure Shell) 来启动和停止各个节点上的各种守护进程的, 这就需要在节点之间执行指令的时候是不需要输入密码的方式, 故我们需要配置 SSH 使用无密码公钥认证的方式。
首先要保证每台机器上都装了 SSH 服务器, 且都正常启动。实际中我们用的都是 OpenSSH, 这是 SSH 协议的一个免费开源实现。
以本文中的 3 台机器为例, 现在 hadoop1 是主节点, 它需要主动发起 SSH 连接到 hadoop2 , 对于 SSH 服务来说, hadoop1 就是 SSH 客户端, 而 hadoop2,hadoop3 则是 SSH 服务端, 因此在 hadoop2,hadoop3 上需要确定 sshd 服务已经启动。简单的说, 在 hadoop1 上需要生成一个密钥对, 即一个私钥, 一个公钥。将公钥拷贝到 hadoop2 上, 这样, 比如当 hadoop1 向 hadoop2 发起 ssh 连接的时候,hadoop2 上就会生成一个随机数并用 hadoop1 的公钥对这个随机数进行加密并发送给 hadoop1,hadoop1 收到这个加密的数以后用私钥进行解密, 并将解密后的数发送回 hadoop2,hadoop2 确认解密的数无误后就允许 hadoop1 进行连接了。这就完成了一次公钥认证过程。
对于本文中的 3 台机器, 首先在 hadoop1 上生成密钥对:
#su – hadoop
$ssh-keygen
这个命令将为 hadoop1 上的用户 hadoop 生成其密钥对。生成的密钥对 id_rsa,id_rsa.pub, 在 /home/hadoop/.ssh 目录下。
$ssh-copy-id localhost
$ssh-copy-id 192.168.2.2
$ssh-copy-id 192.168.2.3
发布密钥到你本地和 hadoop2、hadoop3
试着登录本地和 hadoop2、hadoop3 看是否有密码验证,无密码即验证成功
下载 jdk-6u32-linux-x64.bin
sh jdk-6u32-linux-x64.bin
cd ~
mv jdk1.6.0_32 hadoop-1.2.1/
cd hadoop-1.2.1/
创建软链接
ln -s jdk jdk1.6.0_32
4. 环境变量
在 ~/hadoop-1.2.1/conf/ 目 录 下 的 hadoop-env.sh 中 设 置 Hadoop 需 要 的 环 境 变 量 , 其 中 JAVA_HOME 是 必 须 设 定 的 变 量。HADOOP_HOME 变量可以设定也可以不设定, 如果不设定, HADOOP_HOME 默认的是 bin 目录的父目录, 即本文中的 /home/hadoop/hadoop。
vim~/hadoop-1.2.1/conf/hadoop-env.sh
export JAVA_HOME=/home/hadoop/hadoop/jdk
先进行简单测试:
$cd /home/hadoop/hadoop/
$mkdir input
$cp conf/* input/
$bin/hadoop jar hadoop-examples-1.2.1.jar
$bin/hadoop jar hadoop-examples-1.2.1.jar grep input output ‘dfs[a-z.]+’
$cd output
$cat *
统计文件中的单词:
$bin/hadoop jar hadoop-examples-1.2.1.jar
$bin/hadoop jar hadoop-examples-1.2.1.jar wordcount input test
$cd test/
$cat *
5.hadoop 配置文件
$cd /home/hadoop/hadoop/conf
conf/core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop1.example.com:9000</value>
</property></configuration>
conf/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property></configuration>
conf/mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hadoop1.example.com:9001</value>
</property></configuration>
伪分布式测试:
$mkdir ~/bin
$ln -s /home/hadoop/hadoop/jdk/bin/jps ~/bin/
$cd /home/hadoop/hadoop/
$bin/hadoop namenode -format 先进行初始化
$bin/start-all.sh
web 测试 192.168.2.1:50070
192.168.2.1:50030
$rm -fr input/ output/ test/
$bin/hadoop fs -mkdir input
$bin/hadoop fs -put conf input
$bin/hadoop fs -lsr
192.168.2.1:50075 下查看 /usr/hadoop/input 是否有变化
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-07/104795p2.htm