Hadoop初体验――搭建hadoop简单实现文本数据全局排序

标签: Hadoop | 发表时间:2012-05-15 19:32 | 作者:jrckkyy
出处:http://hi.baidu.com/jrckkyy

http://www.cnblogs.com/vivounicorn/archive/2011/09/20/2182433.html

之前在实现一些机器学习算法时,跑数据量、feature很多的数据集往往要耗费很多时间,尤其是处理大量文本数据时候,单机跑算法的时间让我无法容忍,理论上如果合理的将大数据量分布式并行计算框架(例如hadoop)应用到这些算法上能有效提高算法执行速度(当然,要求算法本身可以全部或部分进行并行化处理),下一步想要学习Mahout( http://mahout.apache.org/),它的目标是: build scalable machine learning libraries,它是基于hadoop的,所以在此之前需要学习一下Hadoop,先从hadoop搭建开始吧。

1、硬件、软件准备

      手头上有三台配置一样的电脑,就不去装虚拟机了,配置如下:

CPU:Intel(R) Pentium(R) Dual  CPU  E2200  @ 2.20GHz

Memory:2001MiB

Network:NetLink BCM5786 Gigabit Ethernet

      三台电脑装有相同的操作系统――Ubuntu 11.04

2、安装过程

      任选一台机器作为master,其他机器作为slaves,所有机器拥有相同的用户、相同的环境变量配置、相同的hadoop目录结构、相同的Java目录结构。

(1)、更改host文件

      master机器:在终端执行:sudo gedit /etc/hosts,添加以下信息:

172.22.9.209    namenode-m

172.22.9.185    datanode-1

172.22.9.220    datanode-2

     slaves机器:处理方式类似。

(2)、安装SSH

      1)、为所有机器安装ssh:在终端运行:sudo apt-get install ssh,查看/leozhang目录下是否有.ssh文件夹(需要View->Show Hidden Files才能看见隐藏文件),如果没有,在终端运行:sudo mkdir .ssh;

      2)、在终端运行:

      cd .ssh

      #生成公钥、私钥密钥对

      ssh-keygen  #一直回车

      #将公钥内容复制到authorized_keys文件
      cp id_rsa.pub authorized_keys

      #设定authorized_keys文件属性为-rw-r--r--,即文件属主拥有读写权限,与文件属主同组的用户拥有读权限,其他人拥有读权限。

      chmod 644 authorized_keys

      #将公钥拷贝到slaves

      scp authorized_keys datanode-1:/home/leozhang/.ssh #这里也可以是scp authorized_keys leozhang@datanode-1:/home/leozhang/.ssh

      scp authorized_keys datanode-2:/home/leozhang/.ssh #同上

      最后测试设置是否成功,如:ssh datanode-1,如果不用输入密码就能登录,说明设置成功。

(3)、下载并配置jdk

      1)、从 http://www.oracle.com/technetwork/java/javase/downloads/java-se-jdk-7-download-432154.html下载 jdk-7-linux-i586.tar.gz,解压后得到文件夹:jdk1.7.0,(例如下载并解压到了:/home/leozhang/Downloads);

      2)、在所有机器上做如下操作:在/usr建立文件夹java:在终端执行:sudo mkdir /usr/java,并将jdk1.7.0拷贝到java文件夹:进入/home/leozhang/Downloads目录,在终端执行sudo mv jdk1.7.0 /usr/java;

      3)、在终端执行:sudo gedit /etc/profile,在文件末尾添加:

JAVA_HOME="/usr/java/jdk1.7.0"

export JAVA_HOME

PATH=$JAVA_HOME/bin:$PATH

export PATH

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH 

export CLASSPATH

      4)、在终端执行:

      cd /usr/java

      scp -r java1.7.0 leozhang@datanode-1:/usr/java

      scp -r java1.7.0 leozhang@datanode-2:/usr/java

(4)、下载并配置hadoop

      hadoop包含三个部分:

Hadoop Common: The common utilities that support the other Hadoop subprojects.

Hadoop Distributed File System (HDFS™): A distributed file system that provides high-throughput access to application data.

Hadoop MapReduce: A software framework for distributed processing of large data sets on compute clusters.

     1)、从 http://labs.renren.com/apache-mirror//hadoop/core/hadoop-0.20.204.0/下载hadoop-0.20.204.0.tar.gz,解压到home/leozhang中并重命名为hadoop;

     2)、在终端执行:sudo gedit /etc/profile,在文件末尾添加:

HADOOP_HOME=/home/leozhang/hadoop

export HADOOP_HOME

export HADOOP=$HADOOP_HOME/bin

export PATH=$HADOOP:$PATH

     3)、hadoop配置文件

     在hadoop文件夹中有一个conf文件夹,里面是hadoop所需的配置文件,主要关注的有以下几个:

     ●hadoop-env.sh

      需要改动的只有一处,设置JAVA_HOME。

# The java implementation to use.  Required.
export JAVA_HOME=/usr/java/jdk1.7.0

     ●core-site.xml

     fs.default.name指出NameNode所在的地址,NameNode要跑在master机器上。

<configuration>
     <property>
         <name>fs.default.name</name>
         <value>hdfs://172.22.9.209:9000</value>
     </property>

     <property>
      <name>hadoop.logfile.size</name>
      <value>10000000</value>
      <description>The max size of each log file</description>
     </property>

     <property>
      <name>hadoop.logfile.count</name>
      <value>10</value>
      <description>The max number of log files</description>
     </property>

</configuration>

     ●hdfs-site.xml

      dfs.replication默认是3,如果DataNode个数小于3会报错。

<configuration>
     <property>
         <name>dfs.replication</name>
         <value>2</value>
     </property>
</configuration>

     ●mapred-site.xml

      mapred.job.tracker指出jobtracker所在地址,其它项不去配置则都为默认值。

<configuration>
     <property>
         <name>mapred.job.tracker</name>
         <value>172.22.9.209:9001</value>
     </property>
</configuration>

     关于配置文件的详细信息可以在 http://hadoop.apache.org/common/docs/stable/cluster_setup.html中找到。

     ●masters

        172.22.9.209

     ●slaves

        172.22.9.185
        172.22.9.220

      4)、在终端执行:

      cd /home/leozhang

      scp -r hadoop leozhang@datanode-1:/home/leozhang

      scp -r hadoop leozhang@datanode-2:/home/leozhang


      5)、在终端执行:source /etc/profile,如果不管用就注销然后重新登录。

3、数据全局排序 

(1)、工具准备

      需要下载eclipse,地址是 http://www.eclipse.org/downloads/,也可以在终端运行sudo apt-get install eclipse,可以装个mapreduce的插件,方便在单机调试代码,那个插件在下载的hadoop的目录里,如 :/home/leozhang/hadoop/contrib/eclipse-plugin/hadoop-eclipse-plugin-0.20.204.0.jar,把它拷贝到eclipse安装目录的plugins文件夹中即可。

(2)、启动hadoop

      第一次使用需要初始化NameNode,在master机器的终端上执行: hadoop namenode -format

      在master机器的终端上执行: start-all.sh,可以用jps来查看本机的java进程,在master上启动了3个进程:JobTracker、SecondaryNameNode、NameNode,而slaves机器上有2个进程:TaskTracker、DataNode;需要停止进程,只要在master机器的终端上执行: stop-all.sh

      在 http://localhost:50070/可以看到NameNode的详细信息,如:

      在 http://localhost:50030可以看到作业的详细信息,如:


(3)、关于mapreduce

      mapreduce很适合数据之间相关性较低且数据量庞大的情况,map操作将原始数据经过特定操作打散后输出,作为中间结果,hadoop通过shuffle操作对中间结果排序,之后,reduce操作接收中间结果并进行汇总操作,最后将结果输出到文件中,从这里也可以看到在hadoop中,hdfs是mapreduce的基石。可以用下面这幅图描述map和reduce的过程:

 

       有人用这么一句话解释mapreduce:

       We want to count all the books in the library. You count up shelf #1, I count up shelf #2. That's map. The more people we get, the faster it goes.
我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就更快。

Now we get together and add our individual counts. That's reduce.
现在我们到一起,把所有人的统计数加在一起。这就是“Reduce”。

(4)、数据准备

      将待排序文本上传到hdfs上并放在input文件夹中,在终端执行: hadoop dfs �mkdir input

      假设数据文件data.txt放在本地磁盘的/home/leozhang/testdata中,在终端执行:cd /home/leozhang/testdata; hadoop dfs �put data input/

(5)、排序思路

      借鉴快速排序的思路:假设为升序排序,那么每完成一次partition,pivot左边所有元素的值都小于等于pivot,而pivot右边的所有元素的值都大于等于pivot,如果现在有N个pivot,那么数据就被map成了N+1个区间,让reducer个数等于N+1,将不同区间的数据发送到相应区间的reducer;hadoop利用shuffle操作将这N+1份数据自动排序,reduce操作只需要接收中间结果后直接输出到文件即可。

由此归纳出用hadoop对大量数据排序的步骤:

1)、对待排序数据进行抽样;

2)、对抽样数据进行 排序,产生pivot(例如得到的pivot为:3,9,11);

3)、Map对输入的每条数据计算其处于哪两个pivot之间,之后将数据发给相应的reduce(例如区间划分为:<3、[3,9)、>=9,分别对应reducer0、reducer1、reducer2);

4)、Reduce将获得数据直接输出。

阅读全文
类别: Hadoop  查看评论

相关 [hadoop 初体验 hadoop] 推荐:

Hadoop初体验――搭建hadoop简单实现文本数据全局排序

- - 学着站在巨人的肩膀上
      手头上有三台配置一样的电脑,就不去装虚拟机了,配置如下:.       三台电脑装有相同的操作系统――Ubuntu 11.04.       任选一台机器作为master,其他机器作为slaves,所有机器拥有相同的用户、相同的环境变量配置、相同的hadoop目录结构、相同的Java目录结构.

Hadoop Streaming 编程

- - 学着站在巨人的肩膀上
Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如:. 采用shell脚本语言中的一些命令作为mapper和reducer(cat作为mapper,wc作为reducer). 本文安排如下,第二节介绍Hadoop Streaming的原理,第三节介绍Hadoop Streaming的使用方法,第四节介绍Hadoop Streaming的程序编写方法,在这一节中,用C++、C、shell脚本 和python实现了WordCount作业,第五节总结了常见的问题.

Hadoop使用(一)

- Pei - 博客园-首页原创精华区
Hadoop使用主/从(Master/Slave)架构,主要角色有NameNode,DataNode,secondary NameNode,JobTracker,TaskTracker组成. 其中NameNode,secondary NameNode,JobTracker运行在Master节点上,DataNode和TaskTracker运行在Slave节点上.

Hadoop MapReduce技巧

- - 简单文本
我在使用Hadoop编写MapReduce程序时,遇到了一些问题,通过在Google上查询资料,并结合自己对Hadoop的理解,逐一解决了这些问题. Hadoop对MapReduce中Key与Value的类型是有要求的,简单说来,这些类型必须支持Hadoop的序列化. 为了提高序列化的性能,Hadoop还为Java中常见的基本类型提供了相应地支持序列化的类型,如IntWritable,LongWritable,并为String类型提供了Text类型.

Hadoop TaskScheduler浅析

- - kouu&#39;s home
TaskScheduler,顾名思义,就是MapReduce中的任务调度器. 在MapReduce中,JobTracker接收JobClient提交的Job,将它们按InputFormat的划分以及其他相关配置,生成若干个Map和Reduce任务. 然后,当一个TaskTracker通过心跳告知JobTracker自己还有空闲的任务Slot时,JobTracker就会向其分派任务.

HADOOP安装

- - OracleDBA Blog---三少个人自留地
最近有时间看看hadoop的一些东西,而且在测试的环境上做了一些搭建的工作. 首先,安装前需要做一些准备工作. 使用一台pcserver作为测试服务器,同时使用Oracle VM VirtualBox来作为虚拟机的服务器. 新建了三个虚拟机以后,安装linux,我安装的linux的版本是redhat linux 5.4 x64版本.

Hadoop Corona介绍

- - 董的博客
Dong | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及 版权声明. 网址: http://dongxicheng.org/hadoop-corona/hadoop-corona/. Hadoop Corona是facebook开源的下一代MapReduce框架. 其基本设计动机和Apache的YARN一致,在此不再重复,读者可参考我的这篇文章 “下一代Apache Hadoop MapReduce框架的架构”.

Hadoop RPC机制

- - 企业架构 - ITeye博客
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. Hadoop底层的交互都是通过 rpc进行的. 例如:datanode和namenode 、tasktracker和jobtracker、secondary namenode和namenode之间的通信都是通过rpc实现的.

Hadoop Rumen介绍

- - 董的博客
Dong | 新浪微博: 西成懂 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及 版权声明. 网址: http://dongxicheng.org/mapreduce/hadoop-rumen-introduction/. 什么是Hadoop Rumen?. Hadoop Rumen是为Hadoop MapReduce设计的日志解析和分析工具,它能够将JobHistory 日志解析成有意义的数据并格式化存储.

Hadoop contrib介绍

- - 董的博客
Dong | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及 版权声明. 网址: http://dongxicheng.org/mapreduce/hadoop-contrib/. Hadoop Contrib是Hadoop代码中第三方公司贡献的工具包,一般作为Hadoop kernel的扩展功能,它包含多个非常有用的扩展包,本文以Hadoop 1.0为例对Hadoop Contrib中的各个工具包进行介绍.