专栏首页Hadoop实操如何使用HBase存储文本文件

如何使用HBase存储文本文件

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

Fayson的github:https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1.文档编写目的


Fayson在前面的文章中介绍了《如何在CDH中使用Solr对HDFS中的JSON数据建立全文索引》和《如何使用Flume准实时建立Solr的全文索引》,假如我们有大量的文本文件,我们应该如何保存到Hadoop中,并实现文本文件的全文检索呢。为了介绍如何对文本文件进行全文检索,本文会先介绍如何使用HBase保存文本文件。虽然HDFS中也可以直接保存这种非结构化数据,但是我们知道像这种文本文件,一般都是10KB~1MB的小文件,因为HDFS并不擅长存储大量小文件,所以这里选择HBase来保存。

  • 内容概述

1.文件处理流程

2.准备上传文件的Java代码

3.运行代码

4.Hue中查询验证

  • 测试环境

1.RedHat7.4

2.CM5.14.3

3.CDH5.14.2

4.集群未启用Kerberos

2.文件处理流程


1.如上图所示,Fayson先在本地准备了一堆记事本文件,有中文内容的,英文内容的,有中文名的,也有英文名的。

中文内容示例

英文内容示例

2.然后通过Java程序遍历本地的文件夹所有文本文件入库到HBase,在入库过程中,我们读取文本文件的文件名作为Rowkey,另外将整个文本内容转为bytes存储在HBase表的一个column里。

3.最后可以通过Hue来进行查看文本文件的内容,当然你也可以考虑对接到你自己的查询系统。

3.准备上传文件的Java代码


1.首先是准备Maven文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.cloudera</groupId>
  <artifactId>hbase-exmaple</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>hbase-exmaple</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
<repositories>
    <repository>
      <id>cloudera</id>
      <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
      <name>Cloudera Repositories</name>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
   </repositories>
  <dependencies>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>2.6.0-cdh5.14.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-client</artifactId>
      <version>1.2.0-cdh5.14.2</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

(可左右滑动)

2.准备上传文件到HBase的Java代码

package com.cloudera;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.SequenceFile;
public class Text2HBase {
    // 本地linux磁盘输出路径
    static String inpath = "C:\\Users\\17534\\Desktop\\full-text-index";
    static String outpath = "";
    static SequenceFile.Writer writer = null;
    static HTable htable = null;
    public static void main(String[] args) throws Exception {
        // inpath = args[0];
        // outpath = args[1];
        // String zklist = args[2];
        // HBase入库
        Configuration hbaseConf = HBaseConfiguration.create();
        hbaseConf.set("hbase.zookeeper.property.clientPort", "2181");
        hbaseConf.setStrings("hbase.zookeeper.quorum", "cdh01.gzyh.com");
        // 指定表名
        htable = new HTable(hbaseConf, "TextHbase");
        File inputFile = new File(inpath);
        File[] files = inputFile.listFiles();
        for (File file : files) {
            String rowKey = file.getName();
            // 指定ROWKEY的值
            Put put = new Put(Bytes.toBytes(rowKey));
            // 指定列簇名称、列修饰符、列值 temp.getBytes()
            put.addColumn("textinfo".getBytes(), "content".getBytes(), getSource(file.getAbsolutePath()));
            htable.put(put);
        }
    }
    public static byte[] getSource(String URL) throws IOException {
        File file = new File(new String(URL.getBytes(), "UTF-8"));
        file.length();
        FileInputStream is = new FileInputStream(file);
        byte[] bytes = new byte[(int) file.length()];
        int len = 0;
        while ((len = is.read(bytes)) != -1) {
            is.read(bytes);
        }
        is.close();
        return bytes;
    }
}

(可左右滑动)

4.运行代码


1.首先我们在HBase中建一张表用来保存文本文件

create 'TextHbase',  {NAME=>'textinfo'}

(可左右滑动)

2.配置客户端Windows机器的hosts文件

3.注意修改代码中的配置项,如文本文件所在的目录,集群的Zookeeper地址等。Fayson这里为了使用方便,就不打成jar包到集群运行,直接在Eclipse里运行代码。

4.到HBase中进行查询确认

一共21条,表明全部入库成功

5.Hue中查询验证


1.从Hue中进入HBase的模块

单击某个column,可以查看整个文本内容

2.查询某一个Rowkey进行测试

本文所使用的代码源码GitHub地址:

https://github.com/fayson/cdhproject/blob/master/hbasedemo/src/main/java/com/cloudera/hbase/Text2HBase.java

https://github.com/fayson/cdhproject/tree/master/hbasedemo/full-text-index

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

本文分享自微信公众号 - Hadoop实操(gh_c4c535955d0f),作者:Fayson

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 什么是HDFS透明加密

    数据加密是安全级别要求较高企业所必须的,比如说金融行业,医疗行业或者政府。我们知道HDFS中的数据会以block的形式保存在各台数据节点的本地磁盘中,但这些bl...

    Fayson
  • 如何使用Java调用HBase的 Endpoint Coprocessor

    Fayson
  • 如何使用Phoenix在CDH的HBase中创建二级索引

    Fayson
  • C++核心准则​SL.io.50:避免使用endl

    The endl manipulator is mostly equivalent to '\n' and "\n"; as most commonly use...

    面向对象思考
  • Spring Boot + Spring Cloud 实现权限管理系统

    1. 使用 RestTemplate 进行服务调用,可以通过 Ribbon 注解 RestTemplate 模板,使其拥有负载均衡的功能。

    朝雨忆轻尘
  • SpringCloud基础+基本框架

    SpringCloud极大的简化了分布式系统的开发,实现了微服务的快速部署和灵活应用

    用户3112896
  • LeetCode 205:同构字符串 Isomorphic Strings

    所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

    爱写bug
  • 【UI自动化-1】UI自动化环境搭建与简单示例

    这里有一个坑:注意上图中红框信息,这里要选择自己安装的jdk,不然后续项目中会有莫名其妙的报错。

    云深i不知处
  • Args4j的使用

    项目中使用了Args4J来管理命令行参数.所以我来学习一下,做个Demo,了解其基本使用方式.

    呼延十
  • Linux命令2-实用指令和文件管理

    本文开始总结Linux系统中的常用命令,包含但不限于如下各方面,文档会不断地更新:

    皮大大

扫码关注云+社区

领取腾讯云代金券