将Hadoop与Couchbase一起使用

Hadoop和数据处理

Hadoop将许多关键功能结合在一起,最终使它对于将大量数据分解成较小的可用块非常有用。

HDFS文件系统是主要组件,它允许信息在整个群集中分布。 也可以通过称为MapReduce的系统在每个群集节点上分别处理以这种分布式格式存储的信息。 MapReduce进程将存储在HDFS文件系统中的信息转换为更小,更易于处理且更易于管理的块。

由于Hadoop在多个节点上工作,因此它可用于处理大量输入信息并将其简化为更多可用的信息块。 通过使用简单的MapReduce系统来处理此处理。

MapReduce是一种转换输入信息的方法,该输入信息可以是也可以不是结构化格式,并将其转换为更易于使用,查询和处理的结构。

例如,一种典型的用法是处理来自数百个不同应用程序的日志信息,以便您可以识别特定的问题,计数或其他事件。 通过使用MapReduce格式,您可以开始衡量和寻找趋势-将原本将非常大量的信息转换为较小的尺寸。 例如,当查看Web服务器的日志时,您可能希望查看特定页面上特定范围内发生的错误。 您可以编写MapReduce函数以识别各个页面上的特定错误,并在输出中生成该信息。 使用此方法,您可以将日志文件中的许多信息行减少为仅包含错误信息的较小记录集。

了解MapReduce

MapReduce分两个阶段工作。 映射过程将传入的信息映射到标准化格式。 对于某些信息类型,此映射可以是直接的也可以是显式的。 例如,如果您正在处理诸如Web日志之类的输入数据,则将从Web日志的文本中提取一列数据。 对于其他数据,映射可能更复杂。 处理文本信息(例如研究论文)时,您可能正在提取短语或更复杂的数据块。

reduce阶段用于整理和汇总数据。 减少实际上可以以多种不同的方式进行,但是典型的过程是基于来自映射阶段的单个数据执行基本计数,总和或其他统计。

考虑一个简单的示例,例如在Hadoop中用作示例MapReduce的单词计数,映射阶段将原始文本分解以识别单个单词,并为每个单词生成一个输出数据块。 然后reduce函数获取这些映射信息块,并将其减少以增加看到的每个唯一单词的计数。 给定一个100个单词的单个文本文件,映射过程将生成100个数据块,但是reduce阶段将对此进行汇总,以提供每个唯一单词的计数,例如56个单词,并计算次数每个字都出现了。

对于Web日志,地图将获取输入数据,为日志文件中的每个错误创建一条记录,并为每个错误生成一个块,其中包含引起问题的日期,时间和页面。

在Hadoop中,MapReduce阶段在存储各个源信息块的各个节点上进行。 通过允许多个节点同时处理数据,这使Hadoop能够处理如此大的信息数据集。 例如,使用100个节点,您可以同时处理100个日志文件,并比通过单个节点更快地简化许多GB(或TB)的信息。

Hadoop限制

核心Hadoop产品的主要限制之一是无法在数据库中存储和查询信息。 数据已添加到HDFS系统中,但是您不能要求Hadoop返回与特定数据集匹配的所有数据的列表。 这样做的主要原因是Hadoop无法存储,组织或了解HDFS中存储的数据的结构。 这就是为什么需要MapReduce系统将信息解析和处理为更结构化的格式的原因。

但是,我们可以将Hadoop的处理能力与更传统的数据库结合起来,以便我们可以查询Hadoop通过其自己的MapReduce系统生成的数据。 有许多可用的解决方案,包括许多传统SQL数据库,但我们可以使用Couchbase Server保留MapReduce主题,该主题对于大型数据集非常有效。

系统之间数据共享的基本结构如图1所示。

图1.系统之间数据共享的基本结构
系统之间数据共享的基本结构

安装Hadoop

如果您尚未安装Hadoop,最简单的方法是利用其中一种Cloudera安装。 对于Hadoop的,Sqoop和Couchbase之间的兼容性,最好的办法就是要利用CDH3安装(参见相关主题 )。 为此,您将需要使用Ubuntu 10.10至11.10。 后来的Ubuntu版本引入了不兼容性,因为它们不再支持Cloudera Hadoop安装所需的软件包。

在安装之前,请确保已安装Java™虚拟机,并确保已在JAVA_HOME变量中配置了JDK的正确主目录。 请注意,您必须拥有完整的Java开发工具包,而不仅仅是Java运行时环境(JRE),因为Sqoop会编译代码以在Couchbase Server和Hadoop之间导出和导入数据。

要在Ubuntu和类似系统上使用CDH3安装,您需要执行以下操作:

  1. 下载CDH3配置包。 这会将CDH3源文件的配置添加到apt信息库。
  2. 更新您的存储库缓存: $ apt-get update
  3. 安装主要的Hadoop软件包: $ apt-get install hadoop-0.20
  4. 安装Hadoop组件(请参见清单1 )。
    清单1.安装Hadoop组件
    $ for comp in namenode datanode secondarynamenode jobtracker tasktracker
    do
    apt-get install hadoop-0.20-$comp
    done
  5. 编辑配置文件以确保已设置核心组件。
  6. 编辑/etc/hadoop/conf/core-site.xml,如清单2所示。
    清单2.编辑的/etc/hadoop/conf/core-site.xml文件
    <configuration>
      <property>
        <name>fs.default.name</name>
        <value>hdfs://localhost:9000</value>
      </property>
    </configuration>

    这将配置用于存储数据的默认hdfs位置。
    编辑/etc/hadoop/conf/hdfs-site.xml(请参见清单3 )。
    清单3.编辑的/etc/hadoop/conf/hdfs-site.xml文件
    <configuration>
      <property>
        <name>dfs.replication</name>
        <value>1</value>
      </property>
    </configuration>

    这样可以复制存储的数据。
    编辑/etc/hadoop/conf/mapred-site.xml(请参见清单4 )。
    清单4.编辑的/etc/hadoop/conf/mapred-site.xml文件
    <configuration>
      <property>
        <name>mapred.job.tracker</name>
        <value>localhost:9001</value>
      </property>
    </configuration>

    这将启用MapReduce的作业跟踪器。
  7. 最后,编辑Hadoop环境以正确指向/usr/lib/hadoop/conf/hadoop-env.sh中的JDK安装目录。 JAVA_HOME变量将有一条注释行。 您应该取消注释它并将其设置为您的JDK位置。 例如: export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk
  8. 现在,在系统上启动Hadoop。 最简单的方法是使用start-all.sh脚本: $ /usr/lib/hadoop/bin/start-all.sh

假设一切配置正确,您现在应该拥有一个正在运行的Hadoop系统。

Couchbase服务器概述

Couchbase Server是一个基于文档的群集数据库系统,利用缓存层通过将大多数数据存储在RAM中来提供对数据的快速访问。 该系统利用多个节点和一个缓存层,并在整个集群中自动分片。 这具有弹性,因此您可以扩大和缩小群集,以利用更多的RAM或磁盘I / O来帮助提高性能。

Couchbase Server中的所有数据最终都保留在磁盘上,但是最初的写入和更新是通过缓存层进行的,这提供了高性能,在处理Hadoop数据以获取实时信息和查询内容时,我们可以利用它。

Couchbase Server以其基本形式保留为基本文档和基于键/值的存储。 只要知道文档ID,就只能从群集中检索信息。 在Couchbase Server 2.0中,您可以JSON格式存储文档,然后使用视图系统在存储的JSON文档上创建视图 。 视图是对数据库中存储的文档执行的MapReduce组合。 视图的输出是一个索引,与您通过MapReduce函数定义的结构匹配。 索引的存在使您能够查询基础文档数据。

我们可以使用此功能从Hadoop中获取处理后的数据,将该信息存储在Couchbase Server中,然后将其用作查询该数据的基础。 方便地,Couchbase Server使用MapReduce系统来处理文档和创建索引。 这为处理数据的方法提供了一定程度的兼容性和一致性。

安装Couchbase服务器

安装Couchbase Server很容易。 请从Couchbase网站平台的Couchbase Server 2.0的版本(见相关信息 ),并使用dpkg或RPM安装包(根据您的平台)。

安装后,Couchbase Server将自动启动。 要对其进行配置,请打开Web浏览器并将其指向计算机上的localhost:8091(或使用计算机的IP地址远程访问它)。

请按照屏幕上的配置说明进行操作。 您可以使用安装期间提供的大多数默认设置,但是最重要的设置是写入数据库的数据的数据文件的位置,以及分配给Couchbase Server的RAM数量。

使Couchbase Server与Hadoop连接器对话

Couchbase Server使用Sqoop连接器来通信您的Hadoop集群。 Sqoop提供了一个连接,可在Hadoop和Couchbase Server之间批量传输数据。

从技术上讲,Sqoop是一个旨在在结构化数据库和Hadoop之间转换信息的应用程序。 名称Sqoop实际上是从SQL和Hadoop派生的。

安装Sqoop

如果使用CDH3安装,则可以使用软件包管理器安装sqoop: $ sudo apt-get install sqoop

这会将sqoop安装在/ usr / lib / sqoop中。

注意:Sqoop中的最新错误表示有时会尝试传输错误的数据集。 该修补程序是Sqoop版本1.4.2的一部分。 如果遇到问题,请尝试使用V1.4.2或更高版本。

安装Couchbase Hadoop连接器

Couchbase Hadoop连接器是Java jar文件的集合,这些文件支持Sqoop和Couchbase之间的连接。 请从Couchbase网站Hadoop的连接器(参见相关主题 )。 该文件打包为zip文件。 解压缩它,然后在其中运行install.sh脚本,提供Sqoop系统的位置。 例如: $ sudo bash install.sh /usr/lib/sqoop

这将安装所有必需的库和配置文件。 现在我们可以开始在两个系统之间交换信息。

将数据从Couchbase服务器导入到Hadoop

尽管不是我们将在此处直接处理的方案,但值得注意的是,我们可以将数据从Couchbase Server导出到Hadoop。 如果您已在Couchbase Server中加载了大量数据,并且想利用Hadoop进行处理和简化,这可能会很有用。 为此,您可以使用以下命令将整个数据集从Couchbase服务器加载到HDFS中的Hadoop文件中: $ sqoop import --connect http://192.168.0.71:8091/pools --table cbdata

此处提供的URL是Couchbase Server存储桶池的位置。 此处指定的表实际上是HDFS中将存储数据的目录的名称。

数据本身存储为来自Couchbase Server的信息的键/值转储。 在Couchbase Server 2.0中,这意味着将使用唯一的文档ID来写出数据,并包含记录的JSON值。

在Hadoop MapReduce中编写JSON数据

为了在Hadoop和Couchbase Server之间交换信息,我们需要说一种通用语言-在这种情况下为JSON(请参见清单5 )。

清单5.在Hadoop MapReduce中输出JSON
package org.mcslp;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;
import com.google.gson.*;

public class WordCount {

    public static class Map extends MapReduceBase implements Mapper<LongWritable, 
Text, Text, IntWritable> {
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(LongWritable key, Text value, OutputCollector<Text, 
IntWritable> output, Reporter reporter) throws IOException {
            String line = value.toString();
            StringTokenizer tokenizer = new StringTokenizer(line);
            while (tokenizer.hasMoreTokens()) {
                word.set(tokenizer.nextToken());
                output.collect(word, one);
            }
        }
    }

    public static class Reduce extends MapReduceBase implements Reducer<Text, 
IntWritable, Text, Text> {

        class wordRecord {
            private String word;
            private int count;
            wordRecord() {
            }
        }

        public void reduce(Text key,
                           Iterator<IntWritable> values,
                           OutputCollector<Text, Text> output,
                           Reporter reporter) throws IOException {
            int sum = 0;
            while (values.hasNext()) {
                sum += values.next().get();
            }

            wordRecord word = new wordRecord();
            word.word = key.toString();;
            word.count = sum;

            Gson json = new Gson();
            System.out.println(json.toJson(word));
            output.collect(key, new Text(json.toJson(word)));
        }
    }

    public static void main(String[] args) throws Exception {
        JobConf conf = new JobConf(WordCount.class);
        conf.setJobName("wordcount");

        conf.setOutputKeyClass(Text.class);
        conf.setOutputValueClass(IntWritable.class);

        conf.setMapperClass(Map.class);
        conf.setReducerClass(Reduce.class);

        conf.setInputFormat(TextInputFormat.class);
        conf.setOutputFormat(TextOutputFormat.class);

        FileInputFormat.setInputPaths(conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(conf, new Path(args[1]));

        JobClient.runJob(conf);
    }
}

该代码是Hadoop发行版随附的单词计数示例的修改。

此版本使用Google Gson库从处理的简化阶段写入JSON信息。 为方便起见,使用了一个新类(wordRecord),该类由Gson转换为JSON记录,这是我们在逐个文档的基础上需要Couchbase Server处理和解析内容的格式。

请注意,我们没有为Hadoop定义Combiner类。 这将防止Hadoop尝试重新缩减信息,因为我们的reduce接受单词和一位数字并输出JSON值,因此使用当前代码将失败。 对于次要的reduce / combine阶段,我们将需要解析JSON输入或定义一个新的Combiner类,以输出信息的JSON版本。 这稍微简化了定义。

要在Hadoop中使用此功能,首先需要将Google Gson库复制到Hadoop目录(/ usr / lib / hadoop / lib)。 然后重新启动Hadoop,以确保该库已被Hadoop正确识别。

接下来,将代码编译到目录中: $ javac -classpath ${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar:./google-gson-2.2.1/gson-2.2.1.jar -d wordcount_classes WordCount.java

现在,创建您的库的jar: $ jar -cvf wordcount.jar -C wordcount_classes/

完成此操作后,您可以将多个文本文件复制到目录中,然后使用此jar将文本文件处理为单个单词的计数,并包含包含该单词的JSON记录和计数。 例如,要在一些Gutenberg项目文本上处理此数据: $ hadoop jar wordcount.jar org.mcslp.WordCount /user/mc/gutenberg /user/mc/gutenberg-output

这将生成out目录中的单词列表,该列表已由Hadoop中的MapReduce函数计算。

将数据从Hadoop导出到Couchbase Server

要从Hadoop取回数据并将其返回到Couchbase Server,我们需要使用Sqoop来将数据导出回: $ sqoop export --connect http://10.2.1.55:8091/pools --table ignored --export-dir gutenberg-output

在此示例中,-- --table参数被忽略,但是--export-dir是要导出的信息所在的目录的名称。

在Couchbase服务器中编写MapReduce

在Hadoop中,MapReduce函数是使用Java编写的。 在Couchbase Server中,MapReduce功能使用Javascript编写。 作为一种解释型语言,这意味着您无需编译视图,并且可以编辑和完善MapReduce结构。

要在Couchbase Server中创建视图,请打开管理控制台(在http:// localhost:8091上),然后单击“ 查看”按钮。 视图收集在设计文档中。 您可以在一个设计文档中创建多个视图,也可以创建多个设计文档。 为了提高服务器的整体性能,系统还支持可以编辑的开发视图和不能编辑的生产视图。 无法编辑生产视图,因为这样做会使视图索引无效并导致索引需要重建。

单击创建开发视图按钮,然后命名您的设计文档和视图。

在Couchbase Server中,有两个相同的功能: mapreducemap函数用于将输入数据(JSON文档)映射到表。 然后,使用reduce函数来进行汇总和归约。 Reduce函数是可选的,并且对于索引功能不是必需的,因此出于本文的目的,我们将忽略reduce函数。

对于map函数,该函数的格式如清单6所示。

清单6. map函数的格式
map(doc) { 

}

参数doc是每个存储的JSON文档。 Couchbase Server的存储格式是JSON文档,并且视图使用Javascript编写,因此我们可以使用doc.count访问JSON中名为count的字段。

要从我们的map函数中发出信息,请调用emit()函数。 emit()函数带有两个参数,第一个是键,用于选择和查询信息,第二个参数是对应的值。 因此,我们可以创建一个map函数,该函数使用清单7中的代码输出单词和计数。

清单7.输出单词和计数的map函数
function (doc) {
  if (doc.word) {
  	emit(doc.word,doc.count);
  }
}

这将为每个输入文档输出一行数据,其中包含文档ID(实际上是我们的单词),该单词作为键以及该单词在源文本中的出现次数。 您可以在清单8中看到原始的JSON输出。

清单8.原始JSON输出
{"total_rows":113,"rows":[
{"id":"acceptance","key":"acceptance","value":2},
{"id":"accompagner","key":"accompagner","value":1},
{"id":"achieve","key":"achieve","value":1},
{"id":"adulteration","key":"adulteration","value":1},
{"id":"arsenic","key":"arsenic","value":2},
{"id":"attainder","key":"attainder","value":1},
{"id":"beerpull","key":"beerpull","value":2},
{"id":"beware","key":"beware","value":5},
{"id":"breeze","key":"breeze","value":2},
{"id":"brighteyed","key":"brighteyed","value":1}
]
}

在输出中,id是文档ID,key是您在emit语句中指定的键,value是在emit语句中指定的值。

获取实时数据

现在,我们已经在Hadoop中处理了信息,将其导入到Couchbase Server中,并在Couchbase Server中创建了关于该数据的视图,我们可以开始查询已处理和存储的信息。 使用类似REST的API来访问视图,或者如果您使用的是Couchbase Server SDK之一,则通过相应的视图查询功能进行访问。

可以通过三个主要选择进行查询:

  • 个人密钥 。 例如,显示与特定键(例如'unkind'匹配的信息。
  • 键列表 。 您可以提供键值数组,这将返回所有视图键与提供的值之一匹配的记录。 例如, ['unkind','kind']将返回与任一单词匹配的记录。
  • 按键范围 。 您可以指定开始和结束键。

例如,要查找指定单词的计数,请对视图使用key参数:

http://192.168.0.71:8092/words/_design/dev_words/_view/byword?connection_timeout=
            60000&limit=10&skip=0&key=%22breeze%22

Couchbase Server自然以UTF-8排序方式输出MapReduce的结果,并按指定的键排序。 这意味着您可以通过指定起始值和结束值来获得一系列值。 例如,要获取“风”和“种类”之间的所有单词:

http://192.168.0.71:8092/words/_design/dev_words/_view/byword?connection_timeout=
            60000&limit=10&skip=0&startkey=%22breeze%22&endkey=%22kind%22

查询很简单,但是功能非常强大,尤其是当您意识到可以将其与灵活的视图系统结合以生成所需格式的数据时,尤其如此。

结论

Hadoop本身提供了一个强大的处理平台,但是没有一种方法可以从处理的数据中实际提取有用的信息。 通过将Hadoop连接到另一个系统,您可以使用它来查询和提取信息。 由于Hadoop使用MapReduce进行处理,因此您可以通过Couchbase Server中的MapReduce系统利用MapReduce的知识来提供查询平台。 使用此方法,您将在Hadoop中进行处理,作为JSON文档从Hadoop导出到Couchbase Server中,然后在Couchbase Server中使用MapReduce查询已处理的信息。


翻译自: https://www.ibm.com/developerworks/opensource/library/ba-hadoop-couchbase/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值