查看“利用Cloudera实现Hadoop”的源代码
来自Ubuntu中文
←
利用Cloudera实现Hadoop
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
== 利用 Cloudera 部署 Hadoop<br> == === 前言<br> === Hadoop 是一个实现了 MapReduce 计算模型的开源分布式并行编程框架。MapReduce的概念来源于Google实验室,它是一个简化并行计算的编程模型,适用于大规模集群上的海量数据处理,目前最成功的应用是分布式搜索引擎。随着2007年底该模式Java开源实现项目Apache Hadoop的出现,使得程序员可以轻松地编写分布式并行程序,并将其运行于计算机集群上,完成海量数据的计算。近两年尤其是今年国内外采用MapReduce模型的应用也逐渐丰富起来,如像NTT KDDI和中国移动这类的电信公司采用该模型分析用户信息,优化网络配置;美国供电局采用该模型来分析电网现状;包括VISA和JP摩根在内的金融公司采用该模型来分析股票数据;包括Amazon和ebay在内的零售商和电子商务公司也开始采用该模型;甚至部分生物公司也采用该模型来进行DNA测序和分析。然而Hadoop安装、部署、管理的难度非常大,这使用很多用户对Hadoop望而却步,好在这种情况不久就得到了改善,Cloudera提供了非常简单的Hadoop的发布版本,能够十分方便地对Hadoop进行安装、部署和管理,这导致目前大约有75%的Hadoop新用户使用Cloudera。<br> === 规划<br> === ==== 运行模式 ==== Hadoop有三种运行模式:单机(非分布)运行模式、伪分布运行模式和分布式运行模式。其中前两种运行模式体现不了 Hadoop 分布式计算的优势,并没有什么实际意义(当然它们对程序的测试及调试还是很有帮助的),因此在这里还是采用实际环境中使用的分布式运行模式来部署。<br> ==== 主机规划 ==== <pre>在这里拟采用三台主机搭建Hadoop环境,由于后期还需要测试增删主机及跨网段主机对Hadoop环境的影响,特将Hadoop主机规划如下: Hadoop-01 10.137.253.201 Hadoop-02 10.137.253.202 Hadoop-03 10.137.253.203 准备后期加入的测试主机 Hadoop-04 10.137.253.204 Firehare-303 10.10.3.30 准备后期加入的跨网段测试主机 </pre> ==== Hadoop环境规划<br> ==== 对于Hadoop来说,最主要的是两个内容,一是分布式文件系统HDFS,一是MapReduce计算模型。在分布式文件系统HDFS看来,节点分为NameNode 和DataNode,其中NameNode只有一个,DataNode可以是很多;在MapReduce计算模型看来,节点又可分为JobTracker和 TaskTracker,其中JobTracker只有一个,TaskTracker可以是很多。因此在实际的Hadoop环境中通常有两台主节点,一台作为NameNode(I/O节点??),一台作为JobTracker(管理节点??),剩下的都是从节点,同时当做DataNode和TaskTracker使用。当然也可以将NameNode和JobTracker安装在一台主节点上。由于测试机数量有限,所以在这里是让Hadoop-01做为Namenode和Jobtracker,其它主机则作为DataNode和TaskTracker(如果Hadoop环境中主机数量很多的话,还是建议将Namenode和JobTracker部署到不同的主机,以提高计算的性能)。具体规划如下:<br> <pre>HDFS: Hadoop-01 NameNode Hadoop-02 DataNode Hadoop-03 DataNode Hadoop-04 DataNode Firehare-303 DataNode MapReduce: Hadoop-01 JobTracker Hadoop-02 TaskTracker Hadoop-03 TaskTracker Hadoop-04 TaskTracker Firehare-303 TaskTracker </pre> === 安装 === 规划好了就开始安装Hadoop,如前言中所说使用Cloudera的Hadoop发布版安装Hadoop是十分方便的,首先当然是在每台主机上一个干净的操作系统(我用的是Ubuntu 8.04,用户设为Hadoop,其它的版本应该差不多),然后就是安装Hadoop了(这样安装的是Hadoop-0.20,也可以安装Hadoop-0.18的版本,反正安装步骤都差不多。注意,不能同时启用Hadoop-0.20和Hadoop-0.18)。由于每台机器安装步骤都一样,这里就写出了一台主机的安装步骤,主要分为以下几个步骤:<br> ==== 设置Cloudera的源 ==== *生成Cloudera源文件(这里采用的是Hadoop-0.20版本,源信息可能过时,最新信息请参见官方文档:http://archive.cloudera.com/docs/_apt.html ): <pre>sudo vi /etc/apt/sources.list.d/cloudera.list #稳定版(Hadoop-0.18) #deb http://archive.cloudera.com/debian hardy-stable contrib #deb-src http://archive.cloudera.com/debian hardy-stable contrib #测试版(Hadoop-0.20) deb http://archive.cloudera.com/debian hardy-testing contrib deb-src http://archive.cloudera.com/debian hardy-testing contrib </pre> *生成源的密钥: <pre>sudo apt-get install curl curl -s http://archive.cloudera.com/debian/archive.key | sudo apt-key add - </pre> ==== 安装Hadoop ==== *更新源包索引: <pre>sudo apt-get update sudo apt-get dist-upgrade </pre> *安装Hadoop: <pre>sudo apt-get install hadoop-0.20 hadoop-0.20-conf-pseudo </pre> === 部署 === 安装好这几台主机的Hadoop环境之后,就要对它们进行分布式运行模式的部署了,首先是设置它们之间的互联。<br> ==== 主机互联<br> ==== Hadoop环境中的互联是指各主机之间网络畅通,机器名与IP地址之间解析正常,可以从任一主机ping通其它主机的主机名。注意,这里指的是主机名,即在Hadoop-01主机上可以通过命令ping Hadoop-02来ping通Hadoop-02主机(同理,要求这几台主机都能相互Ping通各自的主机名)。可以通过在各主机的/etc/hosts文件来实现,具体设置如下:<br> <pre>sudo vi /etc/hosts 127.0.0.1 localhost 10.x.253.201 hadoop-01 hadoop-01 10.x.253.202 hadoop-02 hadoop-02 10.x.253.203 hadoop-03 hadoop-03 10.x.253.204 hadoop-04 hadoop-04 10.x.3.30 firehare-303 firehare-303</pre> 将每个主机的hosts文件都改成上述设置,这样就实现了主机间使用主机名互联的要求。<br> <br> 注:如果深究起来,并不是所有的主机都需要知道Hadoop环境中其它主机主机名的。其实只是作为主节点的主机(如NameNode、JobTracker),需要在该主节点hosts文件中加上Hadoop环境中所有机器的IP地址及其对应的主机名,如果该台机器作Datanode用,则只需要在hosts文件中加上本机和主节点机器的IP地址与主机名即可(至于JobTracker主机是否也要同NameNode主机一样加上所有机器的IP和主机名,本人由于没有环境,不敢妄言,但猜想是要加的,如果哪位兄弟有兴趣,倒是不妨一试)。在这里只是由于要作测试,作为主节点的主机可能会改变,加上本人比较懒,所以就全加上了。:) 注意2:ubuntu 原有的 /etc/hosts 文件中有将本机计算机名解析为 127.0.1.1 的字段,例如: <pre> 127.0.1.1 hadoop-01 </pre> 请务必删除,否则会由于绑定 ip 不正确导致namenode和jobtracker无法连接的问题。 ===== 主机互联的可选方法(配置复杂并不推荐)<br> ===== 如果各个主机使用 dhcp 动态分配地址且不具有网络管理员权限,或者由于 /etc/hosts 文件的修改量过大,对于<b>同一子网</b>中的主机可以同过架设一个 WINS 服务或使用网络中有的 WINS 服务来解决互联问题。相关的包可以通过运行 tasksel 命令,安装 samba client 包获得,安装之后还需要修改 /etc/samba/smb.conf 架设或设置 WINS 服务,并修改 /etc/nsswitch.conf 添加机器名的解析方式。 ==== 计算帐号设置 ==== Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同用户名的帐户。由于这里采用的是Cloudera发布的Hadoop包,所以并不需要这方面的设置,大家了解一下即可。 ==== SSH设置 ==== 在 Hadoop 分布式环境中,主节点(NameNode、JobTracker) 需要通过 SSH 来启动和停止从节点(DataNode、TeskTracker)上的各类进程。因此需要保证环境中的各台机器均可以通过 SSH 登录访问,并且主节点用 SSH 登录从节点时,不需要输入密码,这样主节点才能在后台自如地控制其它结点。可以将各台机器上的 SSH 配置为使用无密码公钥认证方式来实现。 Ubuntu上的SSH协议的开源实现是OpenSSH, 缺省状态下是没有安装的,如需使用需要进行安装。<br> ===== 安装OpenSSH ===== 安装OpenSSH很简单,只需要下列命令就可以把openssh-client和openssh-server给安装好: <pre>sudo apt-get install ssh </pre> ===== 设置OpenSSH的无密码公钥认证<br> ===== 首先在Hadoop-01机器上执行以下命令:<br> <pre>hadoop@hadoop-01:~$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): Enter passphrase (empty for no passphrase):(在这里直接回车) Enter same passphrase again:(在这里直接回车) Your identification has been saved in /home/hadoop/.ssh/id_rsa. Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub. The key fingerprint is: 9d:42:04:26:00:51:c7:4e:2f:7e:38:dd:93:1c:a2:d6 hadoop@hadoop-01</pre> 上述命令将为主机hadoops-01上的当前用户hadoop生成其密钥对,该密钥对被保存在/home/hadoop/.ssh/id_rsa文件中,同时命令所生成的证书以及公钥也保存在该文件所在的目录中(在这里是:/home/hadoop/.ssh),并形成两个文件 id_rsa,id_rsa.pub。然后将 id_rsa.pub 文件的内容复制到每台主机(其中包括本机hadoop-01)的/home/hadoop/.ssh/authorized_keys文件的尾部,如果该文件不存在,可手工创建一个。 '''注意:id_rsa.pub 文件的内容是长长的一行,复制时不要遗漏字符或混入了多余换行符。'''<br> ===== 无密码公钥SSH的连接测试<br> ===== 从 hadoop-01 分别向 hadoop-01, hadoop-04, firehare-303 发起 SSH 连接请求,确保不需要输入密码就能 SSH 连接成功。注意第一次 SSH 连接时会出现类似如下提示的信息: <pre>The authenticity of host [hadoop-01] can't be established. The key fingerprint is: c8:c2:b2:d0:29:29:1a:e3:ec:d9:4a:47:98:29:b4:48 Are you sure you want to continue connecting (yes/no)? </pre> 请输入 yes, 这样 OpenSSH 会把连接过来的这台主机的信息自动加到 /home/hadoop/.ssh/know_hosts 文件中去,第二次再连接时,就不会有这样的提示信息了。 <br> ==== 设置主节点的Hadoop<br> ==== ===== 设置JAVA_HOME<br> ===== Hadoop的JAVA_HOME是在文件/etc/hadoop/conf/hadoop-env.sh中设置,具体设置如下:<br> <pre>sudo vi /etc/hadoop/conf/hadoop-env.sh export JAVA_HOME="/usr/lib/jvm/java-6-sun" </pre> ===== Hadoop的核心配置<br> ===== Hadoop的核心配置文件是/etc/hadoop/conf/core-site.xml,具体配置如下:<br> <pre><?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>fs.default.name</name> <!-- <value>hdfs://localhost:8020</value> --> <value>hdfs://hadoop-01:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/var/lib/hadoop-0.20/cache/${user.name}</value> </property> </configuration> </pre> ===== 设置Hadoop的分布式存储环境<br> ===== Hadoop的分布式环境设置主要是通过文件/etc/hadoop/conf/hdfs-site.xml来实现的,具体配置如下:<br> <pre><?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>dfs.replication</name> <!-- <value>1</value> --> <value>3</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <!-- specify this so that running 'hadoop namenode -format' formats the right dir --> <name>dfs.name.dir</name> <value>/var/lib/hadoop-0.20/cache/hadoop/dfs/name</value> </property> </configuration> </pre> ===== 设置Hadoop的分布式计算环境<br> ===== Hadoop的分布式计算是采用了Map/Reduce算法,该算法环境的设置主要是通过文件/etc/hadoop/conf/mapred-site.xml来实现的,具体配置如下: <pre><?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>mapred.job.tracker</name> <!-- <value>localhost:8021</value> --> <value>hadoop-01:8021</value> </property> </configuration> </pre> ===== 设置Hadoop的主从节点<br> ===== 首先设置主节点,编辑/etc/hadoop/conf/masters文件,如下所示:<br> <pre>hadoop-01 </pre> 然后是设置从节点,编辑/etc/hadoop/conf/slaves文件,如下所示:<br> <pre>hadoop-02 hadoop-03 hadoop-04 firehare-303 </pre> ==== 设置从节点上的Hadoop<br> ==== 从节点上的Hadoop设置很简单,只需要将主节点上的Hadoop设置,复制一份到从节点上即可。<br> <pre>scp -r /etc/hadoop/conf hadoop-02:/etc/hadoop scp -r /etc/hadoop/conf hadoop-03:/etc/hadoop scp -r /etc/hadoop/conf hadoop-04:/etc/hadoop scp -r /etc/hadoop/conf firehare-303:/etc/hadoop </pre> === 启动Hadoop<br> === ==== 格式化分布式文件系统 ==== 在启动Hadoop之前还要做最后一个准备工作,那就是格式化分布式文件系统,这个只需要在主节点做就行了,具体如下: <br> <pre>/usr/lib/hadoop-0.20/bin/hadoop namenode -format </pre> ==== 启动Hadoop服务<br> ==== 启动Hadoop可以通过以下命令来实现: <pre>/usr/lib/hadoop-0.20/bin/start-all.sh</pre> 注意:该命令是没有加sudo的,如果加了sudo就会提示出错信息的,因为root用户并没有做无验证ssh设置。以下是输出信息,注意hadoop-03是故意没接的,所以出现No route to host信息。<br> <pre>hadoop@hadoop-01:~$ /usr/lib/hadoop-0.20/bin/start-all.sh namenode running as process 4836. Stop it first. hadoop-02: starting datanode, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-datanode-hadoop-02.out hadoop-04: starting datanode, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-datanode-hadoop-04.out firehare-303: starting datanode, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-datanode-usvr-303b.out hadoop-03: ssh: connect to host hadoop-03 port 22: No route to host hadoop-01: secondarynamenode running as process 4891. Stop it first. jobtracker running as process 4787. Stop it first. hadoop-02: starting tasktracker, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-tasktracker-hadoop-02.out hadoop-04: starting tasktracker, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-tasktracker-hadoop-04.out firehare-303: starting tasktracker, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-tasktracker-usvr-303b.out hadoop-03: ssh: connect to host hadoop-03 port 22: No route to host </pre> 这样Hadoop就正常启动了!<br> 正常启动之后,可以在 master 主机上通过以下网址检视 hadoop 运行状况:<br> http://localhost:50070/ , 检视分布式文件系统状况,其中 Live Nodes 字段应当显示为正常运行并连接到 namenode 服务器的 datanode 个数。<br> http://localhost:50030/ , 检视集群运转状况,其中 Nodes 字段应当显示正常运行并连接到 jobtracker 的 task tracker 个数。 ==== 通过 cloudera 提供的服务包实现服务的自启动(可选) ==== 通过安装 cloudera 提供的服务包,可以实现每次开机之后,hadoop 服务自动启动。<br> 首先,在 master 对应的机器上安装 hadoop-0.20-jobtracker 和 hadoop-0.20-namenode 包。 <pre> sudo apt-get install hadoop-0.20-jobtracker hadoop-0.20-namenode </pre> 在 slave 对应机器上安装 hadoop-0.20-tasktracker 和 hadoop-0.20-datanode 包 <pre> sudo apt-get install hadoop-0.20-tasktracker hadoop-0.20-datanode </pre> 重新启动这些机器,可以通过上节提到的两个网址检视系统运行状况。 === 测试Hadoop<br> === Hadoop架设好了,接下来就是要对其进行测试,看看它是否能正常工作,具体代码如下: <pre>hadoop@hadoop-01:~$ hadoop-0.20 fs -mkdir input hadoop@hadoop-01:~$ hadoop-0.20 fs -put /etc/hadoop-0.20/conf/*.xml input hadoop@hadoop-01:~$ hadoop-0.20 fs -ls input Found 6 items -rw-r--r-- 3 hadoop supergroup 3936 2010-03-11 08:55 /user/hadoop/input/capacity-scheduler.xml -rw-r--r-- 3 hadoop supergroup 400 2010-03-11 08:55 /user/hadoop/input/core-site.xml -rw-r--r-- 3 hadoop supergroup 3032 2010-03-11 08:55 /user/hadoop/input/fair-scheduler.xml -rw-r--r-- 3 hadoop supergroup 4190 2010-03-11 08:55 /user/hadoop/input/hadoop-policy.xml -rw-r--r-- 3 hadoop supergroup 536 2010-03-11 08:55 /user/hadoop/input/hdfs-site.xml -rw-r--r-- 3 hadoop supergroup 266 2010-03-11 08:55 /user/hadoop/input/mapred-site.xml hadoop@hadoop-01:~$ hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-*-examples.jar grep input output 'dfs[a-z.]+' 10/03/11 14:35:57 INFO mapred.FileInputFormat: Total input paths to process : 6 10/03/11 14:35:58 INFO mapred.JobClient: Running job: job_201003111431_0001 10/03/11 14:35:59 INFO mapred.JobClient: map 0% reduce 0% 10/03/11 14:36:14 INFO mapred.JobClient: map 33% reduce 0% 10/03/11 14:36:20 INFO mapred.JobClient: map 66% reduce 0% 10/03/11 14:36:26 INFO mapred.JobClient: map 66% reduce 22% 10/03/11 14:36:36 INFO mapred.JobClient: map 100% reduce 22% 10/03/11 14:36:44 INFO mapred.JobClient: map 100% reduce 100% 10/03/11 14:36:46 INFO mapred.JobClient: Job complete: job_201003111431_0001 10/03/11 14:36:46 INFO mapred.JobClient: Counters: 19 10/03/11 14:36:46 INFO mapred.JobClient: Job Counters 10/03/11 14:36:46 INFO mapred.JobClient: Launched reduce tasks=1 10/03/11 14:36:46 INFO mapred.JobClient: Rack-local map tasks=4 10/03/11 14:36:46 INFO mapred.JobClient: Launched map tasks=6 10/03/11 14:36:46 INFO mapred.JobClient: Data-local map tasks=2 10/03/11 14:36:46 INFO mapred.JobClient: FileSystemCounters 10/03/11 14:36:46 INFO mapred.JobClient: FILE_BYTES_READ=100 10/03/11 14:36:46 INFO mapred.JobClient: HDFS_BYTES_READ=12360 10/03/11 14:36:46 INFO mapred.JobClient: FILE_BYTES_WRITTEN=422 10/03/11 14:36:46 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=204 10/03/11 14:36:46 INFO mapred.JobClient: Map-Reduce Framework 10/03/11 14:36:46 INFO mapred.JobClient: Reduce input groups=4 10/03/11 14:36:46 INFO mapred.JobClient: Combine output records=4 10/03/11 14:36:46 INFO mapred.JobClient: Map input records=315 10/03/11 14:36:46 INFO mapred.JobClient: Reduce shuffle bytes=124 10/03/11 14:36:46 INFO mapred.JobClient: Reduce output records=4 10/03/11 14:36:46 INFO mapred.JobClient: Spilled Records=8 10/03/11 14:36:46 INFO mapred.JobClient: Map output bytes=86 10/03/11 14:36:46 INFO mapred.JobClient: Map input bytes=12360 10/03/11 14:36:46 INFO mapred.JobClient: Combine input records=4 10/03/11 14:36:46 INFO mapred.JobClient: Map output records=4 10/03/11 14:36:46 INFO mapred.JobClient: Reduce input records=4 10/03/11 14:36:46 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 10/03/11 14:36:46 INFO mapred.FileInputFormat: Total input paths to process : 1 10/03/11 14:36:46 INFO mapred.JobClient: Running job: job_201003111431_0002 10/03/11 14:36:47 INFO mapred.JobClient: map 0% reduce 0% 10/03/11 14:36:56 INFO mapred.JobClient: map 100% reduce 0% 10/03/11 14:37:08 INFO mapred.JobClient: map 100% reduce 100% 10/03/11 14:37:10 INFO mapred.JobClient: Job complete: job_201003111431_0002 10/03/11 14:37:11 INFO mapred.JobClient: Counters: 18 10/03/11 14:37:11 INFO mapred.JobClient: Job Counters 10/03/11 14:37:11 INFO mapred.JobClient: Launched reduce tasks=1 10/03/11 14:37:11 INFO mapred.JobClient: Launched map tasks=1 10/03/11 14:37:11 INFO mapred.JobClient: Data-local map tasks=1 10/03/11 14:37:11 INFO mapred.JobClient: FileSystemCounters 10/03/11 14:37:11 INFO mapred.JobClient: FILE_BYTES_READ=100 10/03/11 14:37:11 INFO mapred.JobClient: HDFS_BYTES_READ=204 10/03/11 14:37:11 INFO mapred.JobClient: FILE_BYTES_WRITTEN=232 10/03/11 14:37:11 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=62 10/03/11 14:37:11 INFO mapred.JobClient: Map-Reduce Framework 10/03/11 14:37:11 INFO mapred.JobClient: Reduce input groups=1 10/03/11 14:37:11 INFO mapred.JobClient: Combine output records=0 10/03/11 14:37:11 INFO mapred.JobClient: Map input records=4 10/03/11 14:37:11 INFO mapred.JobClient: Reduce shuffle bytes=0 10/03/11 14:37:11 INFO mapred.JobClient: Reduce output records=4 10/03/11 14:37:11 INFO mapred.JobClient: Spilled Records=8 10/03/11 14:37:11 INFO mapred.JobClient: Map output bytes=86 10/03/11 14:37:11 INFO mapred.JobClient: Map input bytes=118 10/03/11 14:37:11 INFO mapred.JobClient: Combine input records=0 10/03/11 14:37:11 INFO mapred.JobClient: Map output records=4 10/03/11 14:37:11 INFO mapred.JobClient: Reduce input records=4 </pre> 不难看出,上述测试已经成功,这说明Hadoop部署成功,能够在上面进行Map/Reduce分布性计算了。 === 开发环境<br> === ==== 使用 netbeans 及其 hadoop 插件==== 安装 netbeans: <pre> sudo apt-get install netbeans </pre> 安装并配置 hadoop 插件可以参见:http://www.hadoopstudio.org/docs/tutorials/nb-tutorial-installation.html
返回
利用Cloudera实现Hadoop
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
登录
导航
首页
最近更改
随机页面
页面分类
帮助
搜索
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息