mihego 2024-06-06 00:34 采纳率: 100%
浏览 28
已结题

使用HBase Java API把数据从本地导入到HBase中


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List; 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes; 
public class ImportHBase extends Thread {
    public Configuration config;
    public Connection conn;
    public Table table;
    public Admin admin;
    public ImportHBase() {
        config = HBaseConfiguration.create();
//      config.set("hbase.master", "master:60000");
//      config.set("hbase.zookeeper.quorum", "master");
        try {
            conn = ConnectionFactory.createConnection(config);
            admin = conn.getAdmin();
            table = conn.getTable(TableName.valueOf("user_action"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 
    public static void main(String[] args) throws Exception {
        if (args.length == 0) {       //第一个参数是该jar所使用的类,第二个参数是数据集所存放的路径
            throw new Exception("You must set input path!");
        }
        String fileName = args[args.length-1];  //输入的文件路径是最后一个参数
        ImportHBase test = new ImportHBase();
        test.importLocalFileToHBase(fileName);
    }
    public void importLocalFileToHBase(String fileName) {
        long st = System.currentTimeMillis();
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(new FileInputStream(
                    fileName)));
            String line = null;
            int count = 0;
            while ((line = br.readLine()) != null) {
                count++;
                put(line);
                if (count % 10000 == 0)
                    System.out.println(count);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally { 
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                table.close(); // must close the client
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        long en2 = System.currentTimeMillis();
        System.out.println("Total Time: " + (en2 - st) + " ms");
    }
    @SuppressWarnings("deprecation")
    public void put(String line) throws IOException {
        String[] arr = line.split("\t", -1);
        String[] column = {"id","uid","item_id","behavior_type","item_category","date","province"};
        if (arr.length == 7) {
            Put put = new Put(Bytes.toBytes(arr[0]));// rowkey
            for(int i=1;i<arr.length;i++){
                put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes(column[i]),Bytes.toBytes(arr[i]));
            }
            table.put(put); // put to server
        }
    }
}

执行/usr/local/hadoop/bin/hadoop jar /usr/local/bigdatacase/hbase/ImportHBase.jar ImportHBase /usr/local/bigdatacase/dataset/user_action.output后

img

怎么解决啊

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-06 00:34
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在尝试将本地的数据文件导入到HBase中时遇到了TableNotFoundException。这个错误通常表示在指定的表不存在于HBase集群中。为了解决这个问题,你需要确保以下几点:

    1. 检查表名是否正确:在你的代码中,表名为"user_action"(驼峰命名),但在异常堆栈中显示的是"useraction"(无空格的小写)。请确保这两个地方的表名一致。

    2. 确保表已经存在:在尝试写入数据之前,你应该检查表是否存在。如果不存在,可以创建一个新表。以下是添加检查并创建表的代码:

    public void importLocalFileToHBase(String fileName) {
        // ...其他部分保持不变
        
        if (!admin.tableExists(TableName.valueOf("user_action"))) {
            byte[][] splitKeys = new byte[][] {Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c")}; // 分区键示例
            admin.createTable(HTableDescriptorBuilder.newBuilder(TableName.valueOf("user_action"))
                .addFamily(ColumnFamilyDescriptorBuilder.of("f1"))
                .setSplitKeys(splitKeys)
                .build());
        }
    
        // ...继续你的读取和写入操作
    }
    

    这段代码会首先检查表格是否存在,如果不存在,则创建一个新的表格。这里我们设置了三个预定义的分区键(split keys)作为示例,实际使用时可以根据需求调整。

    1. 使用正确的配置信息:确保你的HBase配置(例如master地址、zookeeper quorum等)与集群中的设置匹配。在代码中注释掉的两行配置可能需要启用,如果你的集群确实使用这些配置项:
    config.set("hbase.master", "master:60000");
    config.set("hbase.zookeeper.quorum", "master");
    
    1. 如果你是在分布式环境中运行Hadoop和HBase,你需要将HBase客户端库打包到你的JAR文件中,并且在Hadoop集群上运行。确保你的Hadoop集群有访问HBase的权限,并且你的Hadoop配置文件(core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml)包含了正确的HBase配置。

    2. 运行命令时,确保你的环境变量已设置好Hadoop和HBase的相关路径,例如JAVA_HOME, HADOOP_HOME, HBASE_HOME等。

    3. 重新编译并运行你的程序,看看是否还有相同的错误。如果没有,那么问题可能出在其他地方,比如HBase集群的权限设置或者网络连接问题。

    如果以上步骤都无法解决问题,建议检查HBase集群的日志文件,可能会提供更详细的错误信息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月6日
  • 已采纳回答 6月6日
  • 修改了问题 6月6日
  • 创建了问题 6月6日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见