《大數據技術原理與應用》實驗報告三 熟悉HBase常用操作

目? 錄

一、實驗目的

二、實驗環境

三、實驗內容與完成情況

3.1 用Hadoop提供的HBase Shell命令完成以下任務

3.2 現有以下關系型數據庫中的表和數據,要求將其轉換為適合于HBase存儲的表并插入數據:

四、問題和解決方法

五、心得體會


一、實驗目的

????????1. 理解HBase在Hadoop體系結構中的角色。

????????2. 熟悉使用HBase操作常用的Shell命令。

????????3. 數據HBase操作常用的Java API。


二、實驗環境

????????1. 硬件要求:筆記本電腦一臺

????????2. 軟件要求:VMWare虛擬機、Ubuntu 18.04 64、JDK1.8、Hadoop-3.1.3、HBase-2.2.2、Windows11操作系統、Eclipse


三、實驗內容與完成情況

3.1 用Hadoop提供的HBase Shell命令完成以下任務

????????(1)列出HBase所有表的相關信息,如表名、創建時間等。

????????①使用以下Shell命令列出HBase所有的表的相關信息,如表名、創建時間等:

list

????????②利用Eclipse軟件在HBase類中創建listTables方法列出HBase所有的表的相關信息,如表名、創建時間等:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import java.io.IOException;
import java.util.List;public class HBaseExample {private static Configuration configuration;private static Connection connection;private static Admin admin;public static void main(String[] args) throws IOException {// 初始化連接init();// 列出所有表格listTables();// 關閉連接close();}// 列出所有表格public static void listTables() throws IOException {// 獲取所有表格的描述符List<TableDescriptor> tableDescriptors = admin.listTableDescriptors();// 打印每個表的名稱for (TableDescriptor tableDescriptor : tableDescriptors) {TableName tableName = tableDescriptor.getTableName();System.out.println("Table: " + tableName);}}// 初始化連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {System.err.println("Failed to initialize connection: " + e.getMessage());e.printStackTrace();}}// 關閉連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {System.err.println("Failed to close connection: " + e.getMessage());e.printStackTrace();}}
}

????????(2)在終端輸出指定表的所有記錄數據。

????????①使用以下Shell命令在終端輸出指定表的所有記錄數據:

scan 's1'

????????②利用Eclipse軟件在HBase類中創建getData和printRecoder方法實現輸出指定表的所有記錄數據:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import java.io.IOException;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.TableName;
import java.util.List;public class HBaseExample {private static Configuration configuration;private static Connection connection;private static Admin admin;public static void main(String[] args) throws IOException {// 初始化連接init();// 獲取并打印指定表的數據getData("Student");// 關閉連接close();}// 獲取并打印指定表的數據public static void getData(String tableName) throws IOException {// 使用 try-with-resources 來確保自動關閉資源try (Table table = connection.getTable(TableName.valueOf(tableName));ResultScanner scanner = table.getScanner(new Scan())) {for (Result result : scanner) {printRecord(result);}} catch (IOException e) {System.err.println("Error retrieving data from table: " + tableName);e.printStackTrace();}}// 打印一條記錄的詳細信息public static void printRecord(Result result) {for (Cell cell : result.rawCells()) {String row = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());String family = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());String qualifier = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());long timestamp = cell.getTimestamp();System.out.println("Row: " + row);System.out.println("Column Family: " + family);System.out.println("Column: " + qualifier);System.out.println("Value: " + value);System.out.println("Timestamp: " + timestamp);System.out.println("---------------------------");}}// 初始化連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {System.err.println("Error initializing HBase connection.");e.printStackTrace();}}// 關閉連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {System.err.println("Error closing HBase connection.");e.printStackTrace();}}
}

????????(3)向已經創建好的表添加和刪除指定的列族或列。

????????①使用以下Shell命令創建表s1:

?create 's1','score'

????????②使用以下Shell命令在s1中添加數據:

put 's1','zhangsan','score:Math','69'

????????③使用以下Shell命令在s1中刪除指定的列:

delete 's1','zhangsan','score:Math'

????????④利用Eclipse軟件在HBase類中創建insterRow和deleRow方法實現添加和刪除指定的列族或列:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.TableName;public class HBaseExample {private static Configuration configuration;private static Connection connection;private static Admin admin;public static void main(String[] args) throws IOException {// 初始化連接init();// 向表插入數據insertRow("Student", "s1", "info", "name", "zhangsan");insertRow("Student", "s1", "score", "Math", "69");// 刪除指定的數據deleteRow("Student", "s1", "score", "Math");// 關閉連接close();}// 向表中插入數據public static void insertRow(String tableName, String rowKey, String colFamily, String col, String val) throws IOException {try (Table table = connection.getTable(TableName.valueOf(tableName))) {Put put = new Put(rowKey.getBytes());put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());table.put(put);} catch (IOException e) {System.err.println("Error inserting row into table " + tableName);e.printStackTrace();}}// 刪除指定的數據public static void deleteRow(String tableName, String rowKey, String colFamily, String col) throws IOException {try (Table table = connection.getTable(TableName.valueOf(tableName))) {Delete delete = new Delete(rowKey.getBytes());// 刪除指定列族delete.addFamily(Bytes.toBytes(colFamily));// 刪除指定列delete.addColumn(Bytes.toBytes(colFamily), Bytes.toBytes(col));table.delete(delete);} catch (IOException e) {System.err.println("Error deleting row from table " + tableName);e.printStackTrace();}}// 初始化連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {System.err.println("Error initializing HBase connection.");e.printStackTrace();}}// 關閉連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {System.err.println("Error closing HBase connection.");e.printStackTrace();}}
}

????????(4)清空指定的表的所有記錄數據。

????????①使用以下Shell命令清空指定的表的所有記錄數據:

truncate 's1'

????????②利用Eclipse軟件在HBase類中創建clearRows方法實現清空指定的表的所有記錄數據:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.TableName;public class HBaseExample {private static Configuration configuration;private static Connection connection;private static Admin admin;public static void main(String[] args) throws IOException {// 初始化連接init();// 清空指定表的數據clearRows("Student");// 關閉連接close();}// 清空指定表的數據public static void clearRows(String tableName) throws IOException {try (Table table = connection.getTable(TableName.valueOf(tableName))) {Scan scan = new Scan();ResultScanner scanner = table.getScanner(scan);for (Result result : scanner) {Delete delete = new Delete(result.getRow());table.delete(delete);}} catch (IOException e) {System.err.println("Error clearing rows in table: " + tableName);e.printStackTrace();}}// 初始化連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {System.err.println("Error initializing HBase connection.");e.printStackTrace();}}// 關閉連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {System.err.println("Error closing HBase connection.");e.printStackTrace();}}
}

????????(5)統計表的行數。

????????①使用以下Shell命令統計表的行數:

count 's1'

????????②利用Eclipse軟件在HBase類中創建countRows方法實現統計表的行數:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;public class HBaseExample {private static Configuration configuration;private static Connection connection;private static Admin admin;public static void main(String[] args) throws IOException {// 初始化連接init();// 統計指定表的行數countRows("Student");// 關閉連接close();}// 統計表的行數public static void countRows(String tableName) throws IOException {try (Table table = connection.getTable(TableName.valueOf(tableName));ResultScanner scanner = table.getScanner(new Scan())) {int num = 0;for (Result result : scanner) {num++;}System.out.println("行數: " + num);} catch (IOException e) {System.err.println("Error counting rows in table: " + tableName);e.printStackTrace();}}// 初始化連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {System.err.println("Error initializing HBase connection.");e.printStackTrace();}}// 關閉連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {System.err.println("Error closing HBase connection.");e.printStackTrace();}}
}

3.2 現有以下關系型數據庫中的表和數據,要求將其轉換為適合于HBase存儲的表并插入數據:

????????(1)使用Shell命令將學生表、課程表、選課表的數據信息添加到對應的數據表中。

????????①使用以下Shell命令創建學生表:

create 'Student','S_No','S_Name','S_Sex','S_Age'

????????②使用以下Shell命令在學生表中插入對應的數據信息:

put 'Student','s001','S_No','2015001'

put 'Student','s001','S_Name','Zhangsan'

put 'Student','s001','S_Sex','male'

put 'Student','s001','S_Age','23'

put 'Student','s002','S_No','2015002'

put 'Student','s002','S_Name','Mary'

put 'Student','s002','S_Sex','female'

put 'Student','s002','S_Age','22'

put 'Student','s003','S_No','2015003'

put 'Student','s003','S_Name','Lisi'

put 'Student','s003','S_Sex','male'

put 'Student','s003','S_Age','24'

????????③使用以下Shell命令創建課程表:

create 'Course','C_No','C_Name','C_Credit'

????????④使用以下Shell命令在課程表中插入對應的數據信息:

put 'Course','c001','C_No','123001'

put 'Course','c001','C_Name','Math'

put 'Course','c001','C_Credit','2.0'

put 'Course','c002','C_No','123002'

put 'Course','c002','C_Name','Computer'

put 'Course','c002','C_Credit','5.0'

put 'Course','c003','C_No','123003'

put 'Course','c003','C_Name','English'

put 'Course','c003','C_Credit','3.0'

????????⑤使用以下Shell命令創建選課表:

create 'SC','SC_Sno','SC_Cno','SC_Score'

????????⑥使用以下Shell命令在選課表中插入對應的數據信息:

put 'SC','sc001','SC_Sno','2015001'

put 'SC','sc001','SC_Cno','123001'

put 'SC','sc001','SC_Score','86'

put 'SC','sc002','SC_Sno','2015001'

put 'SC','sc002','SC_Cno','123003'

put 'SC','sc002','SC_Score','69'

put 'SC','sc003','SC_Sno','2015002'

put 'SC','sc003','SC_Cno','123002'

put 'SC','sc003','SC_Score','77'

put 'SC','sc004','SC_Sno','2015002'

put 'SC','sc004','SC_Cno','123003'

put 'SC','sc004','SC_Score','99'

put 'SC','sc005','SC_Sno','2015003'

put 'SC','sc005','SC_Cno','123001'

put 'SC','sc005','SC_Score','98'

????????(2)請編程實現 createTable(String tableName, String[] fields)

????????創建表,參數 tableName 為表的名稱,字符串數組 fields 為存儲記錄各個字段名稱的數組。要求當 HBase 已經存在名為 tableName 的表的時候,先刪除原有的表,然后再創建新的表。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.TableName;
import java.util.List;public class HBaseExample {public static Configuration configuration;public static Connection connection;public static Admin admin;public static void main(String[] args) throws IOException {init();String a = "score";createTable("s1", new String[]{a});close();}// 創建表,字段數組對應列族public static void createTable(String tableName, String[] fields) throws IOException {TableName tablename = TableName.valueOf(tableName);// 如果表已經存在,則刪除原有表if (admin.tableExists(tablename)) {System.out.println("數據表已經存在!");admin.disableTable(tablename);admin.deleteTable(tablename); // 刪除原來的表}// 構建表描述符TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tablename);// 設置列族for (String field : fields) {tableDescriptorBuilder.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(field)).build());}// 創建表admin.createTable(tableDescriptorBuilder.build());System.out.println("表創建成功: " + tableName);}// 初始化連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {System.err.println("Error initializing HBase connection.");e.printStackTrace();}}// 關閉連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {System.err.println("Error closing HBase connection.");e.printStackTrace();}}
}

????????(3)請編程實現 addRecord(String tableName, String row, String[] fields, String[] values)向表 tableName 、行 row (用 S_Name 表示)和字符串數組 fields 指定的單元格中添加 對應的數據 values 。其中, fields 中每個元素如果對應的列族下還有相應的列限定符的話, 用“ columnFamily:column ”表示。例如,同時向“ Math ”、“ Computer Science ”、“ English ” 三 列添 加 成 績 時 , 字 符 串 數 組 fields 為 {“Score:Math”, ”Score:Computer Science”, ”Score:English”} ,數組 values 存儲這三門課的成績。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.TableName;
import java.util.List;public class HBaseExample {public static Configuration configuration;public static Connection connection;public static Admin admin;public static void main(String[] args) throws IOException {init();String[] fields = {"score:Math", "score:Chinese"};String[] values = {"58", "77"};addRecord("s1", "1", fields, values);close();}// 向表添加記錄public static void addRecord(String tableName, String row, String[] fields, String[] values) throws IOException {Table table = connection.getTable(TableName.valueOf(tableName));try {for (int i = 0; i < fields.length; i++) {Put put = new Put(row.getBytes());String[] cols = fields[i].split(":");if (cols.length == 2) {put.addColumn(cols[0].getBytes(), cols[1].getBytes(), values[i].getBytes());table.put(put);} else {System.out.println("字段格式不正確,應該為列族:列名 格式。");}}} catch (IOException e) {System.err.println("Error while adding record: " + e.getMessage());throw e;  // Rethrow to allow the caller to handle it as needed} finally {table.close();}}// 初始化 HBase 連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {System.err.println("Error initializing HBase connection: " + e.getMessage());e.printStackTrace();}}// 關閉 HBase 連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {System.err.println("Error closing HBase connection: " + e.getMessage());e.printStackTrace();}}
}

(4)請編程實現 scanColumn(String tableName, String column)瀏覽表 tableName 某一列的數據,如果某一行記錄中該列數據不存在,則返回 null 。要 求當參數 column 為某一列族名稱時,如果底下有若干個列限定符,則要列出每個列限定符代表的列的數據;當參數 column 為某一列具體名稱(例如“ Score:Math ”)時,只需要列出該列的數據。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.TableName;import java.io.IOException;
import org.apache.hadoop.hbase.Cell;public class HBaseExample {public static Configuration configuration;public static Connection connection;public static Admin admin;public static void main(String[] args) throws IOException {init();scanColumn("s1", "score");close();}// 掃描指定列族并打印結果public static void scanColumn(String tableName, String column) throws IOException {Table table = connection.getTable(TableName.valueOf(tableName));Scan scan = new Scan();scan.addFamily(Bytes.toBytes(column)); // 掃描指定列族try (ResultScanner scanner = table.getScanner(scan)) {for (Result result : scanner) {showCell(result); // 打印每一行的內容}}}// 格式化輸出結果public static void showCell(Result result) {for (Cell cell : result.rawCells()) {String rowName = new String(Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()));String columnFamily = new String(Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()));String columnName = new String(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));String value = new String(Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));long timestamp = cell.getTimestamp();System.out.println("Row Name: " + rowName);System.out.println("Timestamp: " + timestamp);System.out.println("Column Family: " + columnFamily);System.out.println("Column: " + columnName);System.out.println("Value: " + value);System.out.println("--------------------------------");}}// 初始化連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {System.err.println("Error initializing HBase connection: " + e.getMessage());e.printStackTrace();}}// 關閉連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {System.err.println("Error closing HBase connection: " + e.getMessage());e.printStackTrace();}}
}

????????(5)請編程實現 modifyData(String tableName, String row, String column)修改表 tableName ,行 row (可以用學生姓名 S_Name 表示),列 column 指定的單元格的數據。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.TableName;public class HBase {public static Configuration configuration;public static Connection connection;public static Admin admin;public static void main(String[] args) throws IOException {init();modifyData("s1", "Math", "score", "1");close();}// 修改數據public static void modifyData(String tableName, String columnFamily, String column, String val) throws IOException {init();Table table = connection.getTable(TableName.valueOf(tableName));// 創建Put操作,指定row keyPut put = new Put("1".getBytes()); // 這里使用 "1" 作為row key// 將數據添加到指定的列族和列名put.addColumn(columnFamily.getBytes(), column.getBytes(), val.getBytes());// 執行Put操作table.put(put);table.close();}// 初始化連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {e.printStackTrace();}}// 關閉連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {e.printStackTrace();}}
}

????????(6)請編程實現 deleteRow(String tableName, String row)刪除表 tableName 中 row 指定的行的記錄。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.TableName;public class HBase {public static Configuration configuration;public static Connection connection;public static Admin admin;public static void main(String[] args) throws IOException {init();deleteRow("s1", "1");  // 刪除表 "s1" 中行鍵為 "1" 的數據close();}// 刪除指定的行數據public static void deleteRow(String tableName, String row) throws IOException {init();Table table = connection.getTable(TableName.valueOf(tableName));// 創建一個Delete對象,傳入要刪除的rowKeyDelete delete = new Delete(row.getBytes());// 如果只想刪除特定列的數據,可以使用以下方式:// delete.addColumn(Bytes.toBytes("score"), Bytes.toBytes("Math"));// 刪除整行數據table.delete(delete);table.close();}// 初始化HBase連接public static void init() {configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://localhost:9000/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {e.printStackTrace();}}// 關閉HBase連接public static void close() {try {if (admin != null) {admin.close();}if (connection != null) {connection.close();}} catch (IOException e) {e.printStackTrace();}}
}


四、問題和解決方法

????????1. 實驗問題:Hadoop無法啟動或啟動失敗。

解決方法:檢查Hadoop配置文件中的路徑和參數設置,確保正確設置以及文件的可訪問性,對配置文件進行修改后對應問題得到解決。

????????2. 實驗問題:Hadoop的任務無法運行或失敗。

解決方法:檢查任務配置文件中的輸入輸出路徑是否正確,并確保輸入數據存在,更改輸入輸出路徑后問題得到解決。

????????3. 實驗問題:執行命令時提示"命令未找到"。

解決方法:確保命令拼寫正確,并檢查命令是否安裝在系統路徑中。可以使用which命令來確定命令的路徑,并將其添加到系統路徑中。

????????4. 實驗問題:沒有足夠的權限執行某個命令。

解決方法:嘗試使用sudo命令以管理員權限運行命令,或者聯系系統管理員賦予所需的權限。

????????5. 實驗問題:在連接 HBase 時,出現連接異常。

解決方法:檢查 HBase 的配置文件是否正確,并確保 HBase 服務已啟動。

????????6. 實驗問題:在創建表時,出現表已存在的錯誤。

解決方法:在創建表之前,先判斷表是否已存在,如果存在則先刪除表再創建。

????????7. 實驗問題:在創建表時,指定的列族不存在。

解決方法:在創建表時,需要指定表的列族,如果指定的列族不存在,則先創建列族。

????????8. 實驗問題:在插入數據時,出現數據格式錯誤。

解決方法:檢查插入的數據是否符合 HBase 的數據類型要求,如字符串需要使用 Bytes.toBytes()方法轉換為字節數組。

????????9. 實驗問題:在查詢數據時,出現空指針異常。

解決方法:在查詢數據之前,先判斷表是否存在,如果不存在則先創建表。

????????10. 實驗問題:在刪除表時,出現表不存在的錯誤。

解決方法:在刪除表之前,先判斷表是否存在,如果不存在則不進行刪除操作。

????????11. 實驗問題:在刪除表時,出現表被禁用的錯誤。

解決方法:在刪除表之前,先判斷表是否被禁用,如果被禁用則先啟用表再刪除。

????????12. 實驗問題:在清空表數據時,出現數據仍存在的錯誤。

解決方法:在清空表數據之前,先判斷表是否存在,如果不存在則不進行清空操作。

????????13. 實驗問題:在統計表行數時,出現表不存在的錯誤。

解決方法:在統計表行數之前,先判斷表是否存在,如果不存在則不進行統計操作。

????????14. 實驗問題:在創建表時,出現權限不足的錯誤。

解決方法:使用具有足夠權限的用戶執行創建表操作。

????????15. 實驗問題:在插入數據時,出現連接超時的錯誤。

解決方法:檢查網絡連接是否正常,并增加連接超時時間。

????????16. 實驗問題:在查詢數據時,出現查詢速度慢的問題。

解決方法:優化查詢語句,盡量減少全表掃描的情況,可以使用過濾器或者二級索引來提高查詢效率。

????????17. 實驗問題:在查詢數據時,出現數據丟失的問題。

解決方法:檢查數據是否正確插入,并確保查詢語句正確。

????????18. 實驗問題:在創建表時,出現表名不合法的錯誤。

解決方法:檢查表名是否符合 HBase 的命名規范,如只能包含字母、數字和下劃線。

????????19. 實驗問題:在插入數據時,出現主鍵重復的錯誤。

解決方法:檢查插入的數據是否已存在,如果存在則更新數據。

????????20. 實驗問題:壓縮或解壓縮文件。

解決方法:使用tar命令進行文件壓縮和解壓縮。例如,使用tar -czvf archive.tar.gz directory可以將一個目錄壓縮為.tar.gz文件。

????????21. 實驗問題:在刪除表時,出現刪除失敗的錯誤。

解決方法:檢查表是否已被其他操作占用,如禁用狀態、正在進行的寫操作等。

????????22. 實驗問題:快速訪問最近使用的命令。

解決方法:使用命令歷史和快捷鍵。按下上箭頭鍵可以在命令歷史中向上導航,并按下回車鍵執行選中的命令。使用Ctrl + R可以進行反向搜索并執行最近使用的命令。

????????23. 實驗問題:在清空表數據時,出現清空失敗的錯誤。

解決方法:檢查表是否已被其他操作占用,如禁用狀態、正在進行的寫操作等。

????????24. 實驗問題:應用程序崩潰或卡死。

解決方法:由于庫依賴錯誤、磁盤空間不足、損壞的配置文件導致的。重裝應用程序后問題得到解決。

????????25. 實驗問題:在Eclipse集成開發環境中編寫代碼時字體太小不利于觀察。

解決方法:點擊Window->Preferences->在搜索欄中輸入font->General-> Appearance->Colors and Fonts->Basic->Text Font->點擊Edit進行字體的設置->點擊確認即完成了字體大小的設置。

????????26. 實驗問題:編寫Java代碼進行中文輸出時出現了亂碼現象。

解決方法:鼠標右擊->Run As->Run Configurations->Common->在Other后填寫gbk然后點擊Run進行運行后中文可以正常輸出。

????????27. 實驗問題:建立類后無法運行,顯示沒有主程序。

解決方法:填寫主類運行信息語句public static void main(String[] args)或者繼續在包內新建一個主類,通過類組合的形式進行類的運行。

????????28. 實驗問題:在調用一些類的成員變量的時候顯示錯誤。

解決方法:所調用的類成員變量為私有類型,私有類型只能在類內訪問,類外無法對其直接進行訪問,在類內構造公有函數形成一個對外接口,在其他類內直接通過調用這個函數來訪問其類內部的私有成員即可。

????????29. 實驗問題:在查詢數據時,出現查詢結果不準確的問題。

解決方法:檢查查詢語句是否正確,并確保數據已正確插入。


五、心得體會

????????1、在操作HBase之前,應先判斷表是否存在,避免空指針異常。

????????2、刪除表前應先判斷表是否存在,避免表不存在的錯誤。

????????3、合理使用權限管理命令,可以確保系統的安全性。

????????4、通過使用>、>>和|等操作符,我可以將命令的輸出導入到文件中,或者將多個命令連接起來以實現更復雜的數據流操作。

????????5、刪除表前應先判斷表是否被禁用,避免表被禁用的錯誤。

????????6、清空表數據前應先判斷表是否存在,避免數據仍存在的錯誤。

????????7、統計表行數前應先判斷表是否存在,避免表不存在的錯誤。

????????8、創建表時需使用具有足夠權限的用戶,避免權限不足的錯誤。

????????9、在使用單引號和雙引號的時候要特別注意,輸出單個字符時可以使用單引號,如果同時輸出多個字符時只能使用雙引號進行輸出,不然會報錯。

????????10、在使用一些標點符號的時候要特別注意,代碼內的標點符號均為英文,所以在注釋和寫代碼切換的時候要特別的注意。

????????11、插入數據時需檢查網絡連接是否正常,避免連接超時的錯誤。

????????12、查詢數據時應優化查詢語句,減少全表掃描,提高查詢速度。

????????13、查詢數據時需確保數據正確插入,避免數據丟失的問題。

????????14、創建表時需檢查表名是否合法,符合HBase命名規范。

????????15、插入數據時需檢查數據是否已存在,避免主鍵重復的錯誤。

????????16、刪除表時需檢查表是否被其他操作占用,避免刪除失敗的錯誤。

????????17、清空表數據時需檢查表是否被其他操作占用,避免清空失敗的錯誤。

????????18、統計表行數時需檢查表是否被其他操作占用,避免統計失敗的錯誤。

????????19、查詢數據時需確保查詢語句正確,避免查詢結果不準確的問題。

????????20、HBase表名只能包含字母、數字和下劃線,不合法的表名會導致創建失敗。

????????21、HBase支持使用過濾器和二級索引來提高查詢效率,HBase使用Bytes()方法將數據轉換為字節數組進行存儲。

????????22、在操作HBase時,應注意數據的正確插入和更新,避免數據不一致的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88839.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88839.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88839.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微服務初步入門

服務拆分原則 單一職責原則 單一職責原則原本是面向對象設計的一個基本原則&#xff0c;是指一個類應該專注于單一的功能&#xff0c;不要存在多于一個導致類變更的原因 在微服務架構中&#xff0c;是指一個微服務只負責一個功能或者業務領域&#xff0c;每個服務應該由清晰的定…

Liunx操作系統筆記5

用戶管理命令&#xff1a; useradd命令&#xff1a; useradd命令的功能是創建并設置用戶信息。使用useradd命令可以自動完成用戶信息、基本組、家目錄等的創建工作&#xff0c;并在創建過程中對用戶初始信息進行定制。語法格式:useradd 參數 用戶名常用參數: -M 不建立用…

spring-ai-alibaba 接入Tushare查詢股票行情

最近spring-ai-alibaba主干分支新增了對Tushare的支持&#xff0c;一起來看看如何使用簡單樣例老樣子&#xff0c;分三步進行&#xff1a;第一步&#xff1a;添加依賴<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-aliba…

Java使用Langchai4j接入AI大模型的簡單使用(一)

一、LangChain4j 簡介 LangChain4j 是 Java 生態中的 LangChain 實現&#xff0c;是一個用于構建大語言模型(LLM)應用程序的框架。它提供了與各種LLM服務集成的能力&#xff0c;并簡化了構建復雜AI應用的過程。 LangChain4j官方文檔&#xff1a;Integrations | LangChain4j …

Linux —— A / 基礎指令

建議學習路徑&#xff1a;Linux系統與系統編程 ? Linux網絡和網絡編程 ? MySQL一、初識shell命令 1.1、關于 Linux 桌面很多同學的 Linux 啟動進?圖形化的桌?. 這個東西?家以后就可以忘記了。以后的工作中沒有機會使用圖形界面。思考: 為什么不使用圖形界面? 1.2、下…

[論文閱讀] 人工智能 + 軟件工程 | 用大語言模型+排名機制,讓代碼評論自動更新更靠譜

LLMCup&#xff1a;用大語言模型排名機制&#xff0c;讓代碼評論自動更新更靠譜 LLMCup: Ranking-Enhanced Comment Updating with LLMsarXiv:2507.08671 LLMCup: Ranking-Enhanced Comment Updating with LLMs Hua Ge, Juan Zhai, Minxue Pan, Fusen He, Ziyue Tan Comments: …

悲觀鎖 樂觀鎖

悲觀鎖 樂觀鎖 在沒有加鎖的秒殺場景下 每秒打進來的請求是巨大的 高并發場景下 我們發現不僅異常率高的可怕 庫存竟然還變成了負數 這產生的結果肯定是很大損失的 那為什么會出現超賣問題呢 我們假設有下面兩個線程線程1查詢庫存&#xff0c;發現庫存充足&#xff0c;創建訂單…

如何使用Cisco DevNet提供的免費ACI學習實驗室(Learning Labs)?(Grok3 回答)

Cisco DevNet 提供的免費 ACI&#xff08;Application Centric Infrastructure&#xff09;學習實驗室&#xff08;Learning Labs&#xff09;是幫助用戶學習和實踐 Cisco ACI 技術&#xff08;包括 APIC 控制器&#xff09;的優秀資源&#xff0c;適合網絡工程師、開發者和準備…

Combine的介紹與使用

目錄一、Combine 框架介紹二、核心概念三、基礎使用示例3.1、創建 Publisher & 訂閱3.2、操作符鏈式調用3.3、Subject 使用&#xff08;手動發送值&#xff09;3.4、網絡請求處理3.5、組合多個 Publisher3.6、錯誤處理四、核心操作符速查表 Operator五、UIKit 綁定示例六、…

【Java筆記】七大排序

目錄1. 直接插入排序2. 希爾排序3. 選擇排序4. 堆排序(重要)5. 冒泡排序6. 快速排序&#xff08;重要&#xff09;6.1 Hoare 法6.1.1 Hoare 法優化6.2 挖坑法&#xff08;重點&#xff09;6.3 快速排序的非遞歸寫法7. 歸并排序海量數據的排序問題8. 總結1. 直接插入排序 時間復…

H.264編解碼(NAL)

在我們的日常生活中&#xff0c;比如有緩存電影或者是發送視頻的需求。如果沒有視頻壓縮&#xff0c;一部手機只能存幾分鐘視頻&#xff0c;1TB 硬盤也裝不下幾部電影&#xff0c;用 4G 網絡發一段 1 分鐘視頻&#xff0c;可能需要幾十分鐘&#xff08;甚至傳不完&#xff09;&…

新手向:Python自動化辦公批量重命名與整理文件系統

本文將詳細介紹如何使用Python實現一個強大的文件批量重命名與整理工具&#xff0c;幫助開發者自動化這一繁瑣過程。本教程面向Python初學者&#xff0c;通過一個完整的項目案例&#xff0c;講解文件系統操作的核心技術。我們將構建的工具將具備以下功能&#xff1a;基于正則表…

C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例

C 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例一、左值右值1.左值2.右值二、左值引用右值引用1.左值引用2.右值引用總結三、integral_constant四、integral_constant的元模板使用案例1.求最大整數2.內存對齊alignof關鍵字元模板計算內存…

c++算法一

1.雙指針總結&#xff1a;1.復寫0這道題&#xff0c;告訴我們要正難其反&#xff0c;我們從后向前進行重寫&#xff0c;刪除某些數字的時候&#xff0c;我們可以從前向后遍歷&#xff0c;但是增加一些數字的時候會對后面的數據進行覆蓋&#xff0c;所以要從后向前進行2.快樂數涉…

LeetCode-283. 移動零(Java)

283. 移動零 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,12,0,0] 示例 2: 輸入: n…

【數據庫】慢SQL優化 - MYSQL

一、數據庫故障的關鍵點 引起數據庫故障的因素有操作系統層面、存儲層面&#xff0c;還有斷電斷網的基礎環境層面&#xff08;以下稱為外部因素&#xff09;&#xff0c;以及應用程序操作數據庫和人為操作數據庫這兩個層面&#xff08;以下稱內部因素&#xff09;。這些故障中外…

桶排序算法深度剖析

&#x1f50d; 桶排序算法深度剖析 &#x1f3af; 核心原理圖解?? 完整算法流程 #mermaid-svg-LyB6SpaZ132X4Wtn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LyB6SpaZ132X4Wtn .error-icon{fill:#552222;}#mer…

對S32K144做的BMS安裝快速開發Simulink庫及BMS例程介紹

前言 本章介紹BMS硬件功能及SimuLink庫為主&#xff0c;捎帶介紹一些例程內容 注意&#xff1a;例程所用的協議均是自定義的 自做的SimuLink庫也會不定期更新 BMS例程的內容不定期維護添加 當前的BMS沒有主動均衡功能&#xff0c;這個有考慮后期加上&#xff0c;當前還處于…

urlencode、html實體編碼、unicode

目錄 urlencode html實體編碼 Unicode編碼 urlencode URL編碼也稱為百分號編碼&#xff0c;用于將URL中的特殊字符轉換為安全傳輸的格式。英文數字一般不編碼 特點&#xff1a; 使用%后跟兩個十六進制數字表示字符 空格編碼為或%20 保留字符&#xff08;; / ? : & …

【HarmonyOS】元服務概念詳解

【HarmonyOS】元服務概念詳解 最近幾年&#xff0c;我們手里的設備越來越多——手機、平板、手表、車機……光是管理這些設備上的APP就夠頭疼了&#xff1a;下載要流量、安裝占內存、換個設備又得重新弄一遍。有沒有更簡單的方式&#xff1f;HarmonyOS推出的“元服務”&#xf…