Hbase踩過的坑(使用idea呼叫JavaAPI)
一把辛酸淚啊,各種問題,網上都沒有搜到一個非常完美的解決辦法,幾個小時候終於解決了,其實想想也挺簡單的,只是沒有對症下藥,關鍵點沒有找到,那下面我分享一下我的配置步驟。
我的錯誤:
前言:
我們在windows上用Idea除錯我們的hadoop或者hbase程式時,我們windows下面也要配置好hadoop環境,並且要注意版本一致(Maven/我們安裝的版本)
1.window安裝hadoop環境
注意:版本和伺服器上的版本一致
winutils.exe很多地方都有下,github等,如果找不到可以留下QQ郵箱
百度雲:連結:https://pan.baidu.com/s/1QDSsRrMAxd9n_MS3HxMIzw 密碼:312a
/**
* 在Windows下直接執行該程式是需要Hadoop客戶端環境的。
* 下載Hadoop安裝到Win下,配置環境變數
* HADOOP_HOME=Hadoop的安裝目錄
* PATH=在原有的path的最後新增
* “;%HADOOP_HOME%\bin;%HADOOP_HOME%\sbin”
* HADOOP_USER_NAME=cxx
* 將winutils.exe檔案放到Hadoop安裝目錄的bin目錄下。
*/
ok,到這裡第一個問題,完美解決了,哈哈哈。
第二個問題:
[email protected]:~/bigdata$ sudo ufw disable
Firewall stopped and disabled on system startup
[email protected]:~/bigdata$
centos
關閉防火牆:sudo systemctl stop firewalld.service
關閉開機啟動:sudo systemctl disable firewalld.service
我把windows,和伺服器上的防火牆關了之後,果然好了。
注意問題:
1.版本問題,Maven中版本要和自己伺服器上一致
2.防火牆問題
3.resource下有配置檔案
4.配置好?Winutils不會立刻生效,可以重啟,也有簡單的辦法
System.setProperty("hadoop.home.dir", "E:\\hadoop-2.8.3");
附上我的Hbase在Idea上測試程式碼:
需要的jar包,pom.xml
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-protocol</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
hbase-site.xml
<?xml version="1.0"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master</value>
</property>
</configuration>
log4j.properties 方便檢視日誌
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
package com.hbase;
import java.io.IOException;
import java.util.Iterator;
import java.util.NavigableMap;
import java.util.Set;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.exceptions.DeserializationException;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseDemo{
private Connection conn;
private Table table;
private Admin admin;
public HBaseDemo() throws IOException{
System.setProperty("hadoop.home.dir", "E:\\hadoop-2.8.3");
String home = System.getProperty("hadoop.home.dir");
// 0.先獲取HadoopAPI中的Configuration物件
Configuration hconf=new Configuration();
// 1.獲取HBaseConfiguration物件
Configuration conf=
HBaseConfiguration.create(hconf);
// 2.獲取Connection物件
conn=ConnectionFactory.createConnection(conf);
// 3.獲取Admin物件
admin=conn.getAdmin();
}
public HBaseDemo(String tbl) throws IOException{
this();
// 4.獲取Table物件
table=conn.getTable(TableName.valueOf(tbl));
}
// 1.建立名稱空間
public void createNS(String ns) throws IOException{
// 建立名稱空間描述器物件
NamespaceDescriptor nsDesc=
NamespaceDescriptor.
create(ns).build();
admin.createNamespace(nsDesc);
}
/**
* 2.建立表
* @param ns 名稱空間
* @param tbl 表名
* @param cf 列族名
* @param vers 某一列的版本數
* @param nums 對該表進行分割槽的個數
* @param sk Region的行鍵的起始值
* @param ek Region的行鍵的結束值
*/
public void createTbl(
String ns,
String tbl,
String cf,
int vers,
String sk,
String ek,
int nums) throws IOException{
// 構建表描述器
HTableDescriptor tblDesc=
new HTableDescriptor(
TableName.valueOf(
ns==null||"".equals(ns)?
tbl:ns+":"+tbl));
// 在建立表的時候需要傳遞列族,建立HColumnDescriptor
HColumnDescriptor hcolDesc=
new HColumnDescriptor(cf);
// 使用HTableDescriptor物件的addFamily方法,
// 將列族新增到表上
tblDesc.addFamily(hcolDesc);
// 給某一列設定版本數
hcolDesc.setMaxVersions(vers>1?vers:1);
// 建立表
admin.createTable(
tblDesc,
Bytes.toBytes(sk),
Bytes.toBytes(ek),
nums);
}
/**
*
* @param ns 名稱空間
* @param tbl 表名
* @param rk 行鍵
* @param cf 列族名
* @param col 列名
* @param val 要插入的值
*/
public void put(
String ns,String tbl,String rk,
String cf,String col,String val) throws IOException{
// 獲取表物件
Table table=getTbl(ns,tbl);
// 構建Put物件,引數是行鍵 RowKey
Put put=new Put(Bytes.toBytes(rk));
put.addColumn(
Bytes.toBytes(cf), // 列族
Bytes.toBytes(col), // 列名
Bytes.toBytes(val)); // 值
// 插入資料
table.put(put);
}
public void put(
String ns,String tbl,String rk,
String cf,String col,String val,int max) throws IOException{
// 獲取表物件
Table table=getTbl(ns,tbl);
for(int x=0;x<max;x++){
// 構建Put物件,引數是行鍵 RowKey
Put put=new Put(Bytes.toBytes(rk+x));
put.addColumn(
Bytes.toBytes(cf), // 列族
Bytes.toBytes(col), // 列名
Bytes.toBytes(val+x)); // 值
// 插入資料
table.put(put);
}
}
// 3.獲取值
public void get(String ns,String tbl,String rk) throws IOException{
// 獲取表物件
Table table=getTbl(ns,tbl);
// 獲取值
Get get=new Get(Bytes.toBytes(rk));
Result result=
table.get(get);
showResult(result);
}
// 4.掃描表
public void scan(String ns,String tbl) throws IOException{
// 獲取表物件
Table table=getTbl(ns,tbl);
// 獲取Scanner物件
Scan scan=new Scan();
// 通過Scan物件獲取Scanner物件
ResultScanner scanner=table.getScanner(scan);
// 獲取迭代器物件
Iterator<Result> iterator=
scanner.iterator();
// 進行迭代,拿到Result物件
while(iterator.hasNext()){
Result result=iterator.next();
showResult(result);
}
}
public void scan(String ns,String tbl,Filter filter) throws IOException{
Table table=getTbl(ns,tbl);
// 獲取Scan物件,並且加入過濾器,
Scan scan=new Scan();
scan.setFilter(filter);
Iterator<Result> iterator=
table.getScanner(scan).iterator();
while(iterator.hasNext()){
showResult(iterator.next());
}
}
public void showResult(Result result){
// 通過Result物件獲取行鍵
byte[] row=result.getRow();
// 獲取Map物件
NavigableMap<byte[],
NavigableMap<byte[],
NavigableMap<Long,byte[]>>>
map=result.getMap();
// map中的鍵是什麼? --> 列族
// map中的值是什麼? --> 某個列族對應的值
// 遍歷map
Set<byte[]> cfs=map.keySet();
for(byte[] cf : cfs){
NavigableMap<byte[],
NavigableMap<Long,byte[]>>
map1=map.get(cf);
// map1中的鍵是什麼? --> 列名
// map1中的值是什麼? --> 某個列對應的值
// 遍歷map1
Set<byte[]> cols=map1.keySet();
for(byte[] col : cols){
NavigableMap<Long,byte[]>
map2=map1.get(col);
// map2中的鍵是什麼? --> Timestamp
// map2中的值是什麼? --> 值
// 遍歷map2
Set<Long> tss=map2.keySet();
for(Long ts : tss){
byte[] val=map2.get(ts);
System.out.println(
"行鍵:"+new String(row)+
"\t列族:"+new String(cf)+
"\t列名:"+new String(col)+
"\t時間戳:"+ts+
"\t值:"+new String(val));
}
}
}
}
// 封裝方法,用來獲取表物件
public Table getTbl(String ns,String tbl) throws IOException{
return conn.getTable(
TableName.valueOf(
ns==null||"".equals(ns)?
tbl:ns+":"+tbl));
}
public static void main(String[] args) throws IOException, DeserializationException{
HBaseDemo demo=new HBaseDemo();
//demo.createNS("test2");
//demo.createTbl("test2","teacher","baseinfo",5,"100000","909090",5);
//demo.put("test2","teacher","222222","baseinfo","name","Kevin",1000);
//demo.get("test2","teacher","222222999","baseinfo","name");
//demo.scan("test2","teacher");
//demo.scan("test2","teacher",new KeyOnlyFilter(true));
//demo.scan("test2","teacher",new RowFilter(CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes("222222100"))));
// 測試協處理器
demo.get("test2","teacher","222222950");
}
public Connection getConn(){
return conn;
}
public void setConn(Connection conn){
this.conn=conn;
}
public Table getTable(){
return table;
}
public void setTable(Table table){
this.table=table;
}
public Admin getAdmin(){
return admin;
}
public void setAdmin(Admin admin){
this.admin=admin;
}
}
原始碼:連結:https://pan.baidu.com/s/16EPBuE6_IDILr8ylwIjLCg 密碼:t9f9
相關推薦
Hbase踩過的坑(使用idea呼叫JavaAPI)
一把辛酸淚啊,各種問題,網上都沒有搜到一個非常完美的解決辦法,幾個小時候終於解決了,其實想想也挺簡單的,只是沒有對症下藥,關鍵點沒有找到,那下面我分享一下我的配置步驟。我的錯誤:前言:我們在windows上用Idea除錯我們的hadoop或者hbase程式時,我們window
使用JQ、BootStrap時,踩過的坑(不定期更新)
(此文用於記錄程式設計過程過程中,遇到的那些令人頭皮發麻的坑,以及它們的解決方法) 一、使用bootstrap-select、JQ 日前,要做一個需求,有一個輸入框,可以multiple輸入,輸入的東西還要到資料庫判斷,其是否存在?後臺還要根據這些資訊一條一條查詢別的表資料,我想這個邏輯
Kali Linux / centOS 7 SSH踩過得坑(不定期更新)
0x00: 最近學習kali linux,聞之初是三年前了。隨已不是從前計劃中的自己,但也盡力去突破新的自己。 環境:kali-linux 2018-2amd64映象 0x01:關於ssh輸入密碼無法登陸的坑 cause :一開始好好的,開機後就連線不上了。
Nginx Sticky的使用及踩過的坑(nginx-sticky-module)
#什麼是Sticky?# 為了理解Sticky的工作原理,我們可以先考慮一個問題:負載均衡怎麼做? DNS解析,在域名解析時分配給不同的伺服器IP; IP Hash,根據客戶端的IP,將請求分配到不同的伺服器上; cookie,伺服器給客戶端下發一個cookie,具
27.Spring-Boot中攔截器中靜態資源的處理(踩過坑)以及Spring mvc configuring拓展介紹
一.springboot中對靜態資源的處理 預設情況下,springboot提供存放放置靜態資源的資料夾: /static /public /resources /META-INF/resources 對於maven專案即就是存在src/main/re
EclipseSpring外掛不顯示問題,我踩過坑,分享下
網上最多的說法是版本不相容(spring外掛和eclipse),但是其實大家都不是傻子,都會看對應版本。 所以最多情況還是版本都對的情況下出現外掛不顯示等問題,下面貼出穩穩的安裝外掛和顯示方法; 1、先確定環境,比如eclipse+jdk+spring外掛, 這裡4.5版本的eclipse最好搭
jenkins構建踩的坑(docker構建的映象容器)
1.構建時提示依賴包沒有找到的,可以在goal時加上-e,-X引數,如下圖可以看到更加詳細的日誌資訊,從而知道倉庫是否搞錯了,把缺失的依賴包手動匯入倉庫。2.啟動指令碼報錯:解決辦法如下:在執行docker run命令的時候增加一個-u引數,如下改進後的命令,docker r
idea搭建SSM框架遇到的坑(包含完整過程)
首先說明這是我一個不熟悉idea和SSM框架的新手小白遇到的坑,適合用idea搭建SSM框架的小夥伴看一看,老鳥就不用看了。以下為詳細步驟(傻瓜教程,超級細節)搭建SSM框架的前提當然是我們已經準備好一下環境安裝好的intellige idea, java環境,tomcat伺
程式設計師,Mybatis你踩過坑嗎?
摘自:https://yq.aliyun.com/roundtable/49835?&utm_campaign=sys&utm_medium=market&utm_source=edm_email&msctype=email&msca
微信小程序踩坑(不定時更新)
變化 .net 需要 我們 應該 重聲明 比較 abcd 不一定 emmmm,覺得自己小程序太薄弱了,所以還是找個東西練手,不過還是要感謝某大神提供的“扒小程序”的方法,雖然不是說拿下來就能用,但是作為仿小程序來說,我要的圖片素材,頁面名稱都有了.
記一個在js中使用setTimeout方法踩的坑(箭頭函式與function定義的區別)
今天寫程式碼時遇到了一個問題,程式碼如下 this.timer = setTimeout(function() { const result = [] for (let i in this.cities) { this.cities[
【洛谷】P1052 過河(狀壓dp)
ron mic ont 由於 不同 amp 整數 輸入輸出格式 pac 題目描述 在河上有一座獨木橋,一只青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數
MongoDB中的一些坑(最好不要用)
ODB 關系 有一種 徹底 是把 shard 內存數據庫 完整 發的 MongoDB 是目前炙手可熱的 NoSQL 文檔型數據庫,它提供的一些特性很棒:如自動 failover 機制,自動 sharding,無模式 schemaless,大部分情況下性能也很棒。但是薄荷在深
vue-router傳參的坑(query和params)
name router png 不能 頁面 efi def .com 對象 1.query方式傳參和接收參數 傳參: this.$router.push({ path:‘/xxx‘ query:{ id:id
實現SpringBoot的熱部署方法(IDEA上操作)
熱部署原理: 配置檔案中用了spring-boot-devtools主要是因為這是一個為開發者服務的一個模組,其中最重要的功能就是自動應用程式碼更改到最新的App上面去。原理是在發現程式碼有更改之後,重新啟動應用,但是速度比手動停止後再啟動更快。其深層原理是使用了兩個ClassLoader,
P1052 過河(離散化+dp)
P1052 過河 dp不難,重點是要想到離散化。 石子個數$<=100$意味著有大量空間空置,我們可以縮掉這些空間。 實現的話自己yy下就差不多了。 #include<iostream> #include<cstdio> #include<cstring&
SVM用python手動實現(非呼叫包)
廢話不多說,總而言之就是下面幾步: 1 計算所有的 Ei 2 尋找第一個違反KKT的變數 3尋找第二個Ei差值的變數 4更新alpha和b,並重新計算所有的Ei 下面舉個詳細的例子,首先這是樣本的分佈圖,非線性 其次這是識別後的圖以及正確率(正確率這個需要調參,太麻煩了,所以我就這樣了)
列印功能(JS 呼叫瀏覽器)
1.呼叫瀏覽器,完成列印功能(IE,Google都支援【當前時間截點】) 列印當前頁面,可以運用css做排版處理,隱藏一些不需要出現的東西 /*列印 */ function printDiv(value) { &n
Spark開發環境搭建(IDEA、Maven)
在搭建開發環境之前,請先安裝好scala開發環境和spark: scala:https://blog.csdn.net/qq_39429714/article/details/84332869 spark:https://blog.csdn.net/qq_39429714/article/d
Maven打包時跳過測試(maven-surefire-plugin)
1、在pom檔案新增 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <