分享

远程创建hbase表同样的代码在不同的java文件中有时成功有时报错?

ashiny 发表于 2015-4-23 15:35:52 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 7 18907
代码如下:
HBaseConfiguration conf ;
HBaseAdmin admin;
//HTable table;
Configuration cnf = new Configuration();
cnf.set("hbase.zookeeper.quorum", "192.168.100.63,192.168.100.62,192.168.100.61,192.168.100.60");
cnf.set("hbase.zookeeper.property.clientPort", "2181");
conf = new HBaseConfiguration(cnf);
try {
admin = new HBaseAdmin(conf);
String newtable=String.valueOf(System.currentTimeMillis());
System.out.println(newtable);
HTableDescriptor tableDesc = new HTableDescriptor(newtable);
tableDesc.addFamily(new HColumnDescriptor("cf1"));
admin.createTable(tableDesc);
//table = new HTable(conf, Bytes.toBytes(tablename));
//table.setAutoFlush(false);
} catch (MasterNotRunningException e) {
e.printStackTrace();
} catch (ZooKeeperConnectionException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
直接写在main函数里是可以正常生成的,但是另写一个create函数然后在其他函数中使用就会报错,报错如下:
java.io.IOException: java.lang.reflect.InvocationTargetException
at org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:459)
at org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:436)
at org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:317)
at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:194)
at Stream.MonitorUpload$Listener.fileCreated(MonitorUpload.java:81)
at net.contentobjects.jnotify.win32.JNotifyAdapterWin32.notifyChangeEvent(Unknown Source)
at net.contentobjects.jnotify.win32.JNotifyAdapterWin32$1.notifyChange(Unknown Source)
at net.contentobjects.jnotify.win32.JNotify_win32.callbackProcessEvent(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:457)
... 7 more
Caused by: java.util.ServiceConfigurationError: org.apache.hadoop.fs.FileSystem: Provider org.apache.hadoop.fs.LocalFileSystem not found
at java.util.ServiceLoader.fail(Unknown Source)
at java.util.ServiceLoader.access$300(Unknown Source)
at java.util.ServiceLoader$LazyIterator.next(Unknown Source)
at java.util.ServiceLoader$1.next(Unknown Source)
at org.apache.hadoop.fs.FileSystem.loadFileSystems(FileSystem.java:2400)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2411)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2428)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:88)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2467)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2449)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:367)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:166)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:351)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:287)
at org.apache.hadoop.hbase.util.DynamicClassLoader.<init>(DynamicClassLoader.java:104)
at org.apache.hadoop.hbase.protobuf.ProtobufUtil.<clinit>(ProtobufUtil.java:204)
at org.apache.hadoop.hbase.ClusterId.parseFrom(ClusterId.java:64)
at org.apache.hadoop.hbase.zookeeper.ZKClusterId.readClusterIdZNode(ZKClusterId.java:69)
at org.apache.hadoop.hbase.client.ZooKeeperRegistry.getClusterId(ZooKeeperRegistry.java:83)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.retrieveClusterId(HConnectionManager.java:907)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.<init>(HConnectionManager.java:701)
... 12 more
报错的java代码中,首先实现了文件夹实时监测,当有新文件是调用create函数对新文件进行操作。求各位大神指导!~~~~毕业设计啊要毕不了业了!!!

已有(7)人评论

跳转到指定楼层
ashiny 发表于 2015-4-23 16:43:14
yuwenge 发表于 2015-4-23 16:14
楼主的代码有些小问题

参考这两篇吧


已经参照这两篇改了一下,不过还是一样的报错,而且代码单独运行是可以的,在main函数里直接调用也是可以的,但是我这里用了一个JNotify的Listener类,再调用时就出问题了。
而且我单步调试了一下,貌似问题出现在admin = new HBaseAdmin(cnf);这一句,执行完这一句就直接转到catch (IOException e) {e.printStackTrace();}了。
不知道您知不知道这是什么问题?谢啦~~
回复

使用道具 举报

yuwenge 发表于 2015-4-23 16:54:48
ashiny 发表于 2015-4-23 16:43
已经参照这两篇改了一下,不过还是一样的报错,而且代码单独运行是可以的,在main函数里直接调用也是可 ...

条用了其他类,记得让开发环境和集群环境保持一致。
自己添加的第三方类,或则jar包,确保都能够引用到。
回复

使用道具 举报

ashiny 发表于 2015-4-23 17:15:58
yuwenge 发表于 2015-4-23 16:54
条用了其他类,记得让开发环境和集群环境保持一致。
自己添加的第三方类,或则jar包,确保都能够引用到 ...

添加的JNotify的jar包和文件夹监听程序都测试过是可以正常使用的,但是在listener类里面加上这个函数就报错。。。把listener类也贴进来吧:
public class MonitorUpload {
        public static void main(String[] args) {
        String monitedPath = "F:/nextstep";
        int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
        // 是否监视子目录
        boolean watchSubtree = true;
        try {
            int watchID = JNotify.addWatch(monitedPath, mask, watchSubtree, new Listener());
            Thread.sleep(1000000);
            boolean res = JNotify.removeWatch(watchID);
            if (!res) {
                // invalid
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static class Listener implements JNotifyListener {

        public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
            print("renamed " + rootPath + " : " + oldName + " -> " + newName);
        }

        public void fileModified(int wd, String rootPath, String name) {
            print("modified " + rootPath + " : " + name);
        }

        public void fileDeleted(int wd, String rootPath, String name) {
            print("deleted " + rootPath + " : " + name);
        }

        public void fileCreated(int wd, String rootPath, String name) {
            print("created " + rootPath + " : " + name);
            try{
                    String newtable = String.valueOf(System.currentTimeMillis());

                create(newtable,"cf");
                    insert(newtable,name);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }

因为做毕设才接触的hadoop、hbase什么的,现在还是新手,遇到问题感觉完全无从下手,感谢啦!~~~
回复

使用道具 举报

yuwenge 发表于 2015-4-23 17:31:31
ashiny 发表于 2015-4-23 17:15
添加的JNotify的jar包和文件夹监听程序都测试过是可以正常使用的,但是在listener类里面加上这个函数就报 ...

描述还是不清楚,加的哪个函数,为什么想加这个函数,加了这个函数是否适合分布式,监听,主要的监听的是什么
楼主先把这些问题搞清楚
回复

使用道具 举报

ashiny 发表于 2015-4-23 17:53:13
yuwenge 发表于 2015-4-23 17:31
描述还是不清楚,加的哪个函数,为什么想加这个函数,加了这个函数是否适合分布式,监听,主要的监听的是 ...

整个代码结构如图 360截图20150423174856707.jpg
create函数是我自己增加用来在hbase里面新建表的,insert函数是我自己增加用来向建的表里面添加数据的。
整个代码的功能就是listner继承JNotify里面的类实现对我指定文件夹的监听,一旦检测到新添加的文件就执行fileCreated函数,而fileCreated函数里面就调用了我的create函数和insert函数来执行相应操作。
回复

使用道具 举报

jixianqiuxue 发表于 2015-4-23 18:03:34
ashiny 发表于 2015-4-23 17:53
整个代码结构如图
create函数是我自己增加用来在hbase里面新建表的,insert函数是我自己增加用来向建的 ...

个人认为楼主可能玩错了


对于监听的含义没有没有搞清楚。
对于一个程序来讲,你只要顺序执行就可以了。
比如创建完文件夹之后,我接着完成什么事情。这个不需要监听的。

那么什么需要监听。比如像你说的监听文件夹。
这个跟hbase没有关系,而是你对Linux操作系统文件夹的监控。

所以在思路上就是存在问题的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条