HBase
文章目录
1、安装
-
第一步:将文件 hbase-1.3.1-bin.tar.gz 上传到服务器,并解压
-
第二步:修改 hbase 目录下的 conf 目录下的 hbase-env.sh 文件
export JAVA_HOME=/opt/software/jdk/jdk1.8.0_281 export HBASE_MANAGES_ZK=false
-
第三步:修改 hbase 目录下的 conf 目录下的 hbase-site.xml 文件
<property> <name>hbase.rootdir</name> <value>hdfs://hadoop151:8020/HBase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 0.98 后的新变动,之前版本没有.port,默认端口为 60000 --> <property> <name>hbase.master.port</name> <value>16000</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop151,hadoop152,hadoop153</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/software/zookeeper/zookeeper-3.4.10/zkData</value> </property>
-
第四步:修改 hbase 目录下的 conf 目录下的 regionservers 文件
hadoop151 hadoop152 hadoop153
-
第五步:将Hadoop中 etc/hadoop 目录下的 core-site.xml、hdfs-site.xml 文件软连接到 HBase的 conf 目录中上
ln -s /opt/software/hadoop/hadoop-3.1.4/etc/hadoop/core-site.xml \ /opt/software/hbase/hbase-1.3.1/conf/core-site.xml ln -s /opt/software/hadoop/hadoop-3.1.4/etc/hadoop/hdfs-site.xml \ /opt/software/hbase/hbase-1.3.1/conf/hdfs-site.xml
-
第六步:将整个 hbase 文件分发到其他服务器上
-
第七步:启动 Zookeeper 集群 和 Hadoop
-
第八步:启动 Hbase
#方式一 bin/start-hbase.sh #方式二 bin/hbase-daemon.sh start master bin/hbase-daemon.sh start regionserver
-
第九步:访问
http://hadoop151:16010
2、shell命令
基本操作
-
进入 HBase 客户端命令行
bin/hbase shell
-
查看帮助命令(客户端命令行中执行)
help
-
查看当前数据库中有哪些表(客户端命令行中执行)
list
表的操作
-
创建表
create '表名','列族名称' #示例,单个列族 create 'fzk','info' #示例,多个列族 create 'fzk','info1','info2'
-
查看表结构
describe '表名' #示例 describe 'fzk'
-
变更表信息
alter '表名',{NAME=>'列族',VERSIONS=>版本数量} #示例:将 info 列族中的数据存放 3 个版本 alter 'student',{NAME=>'info',VERSIONS=>3}
-
删除表
-
首先需要先让该表为 disable 状态,然后删除表
disable '表名' drop '表名' # 示例 disable 'fzk' drop 'fzk'
-
数据的操作
-
插入和修改 数据到表
put '表名','Row_Key值','列族:列字段名','值' #示例 put 'fzk','1001','info:name','fff'
-
删除数据
delete '表名','Row_Key值','列族:列字段名' #示例 delete 'fzk','1001','info:name'
-
查看“指定行”或“指定列族:列”的数据
#查看“指定行” get 'fzk','1001' #查看“指定行”的“指定列族:列” get 'fzk','1001','info:name'
-
扫描查看表数据
#查看全表 scan 'fzk' #查看 Row_Key值从1001 到 1003,左闭右开 scan 'fzk',{STARTROW=>'1001', STOPROW=>'1003'}
3、API
准备环境
-
创建Maven工程,导入依赖(pom.xml)
<dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.3.1</version> </dependency> </dependencies>
表操作API(DDL)
判断表是否存在
public boolean isTableExists(String tableName) throws IOException {
//获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");
//创建HBase对象(Admin)
//使用 ConnectionFactory 类创建 Connection 对象
Connection connection = ConnectionFactory.createConnection(configuration);
//通过 Connection 对象创建 Admin 对象
Admin admin = connection.getAdmin();
//判断表是否存在
boolean tableExists = admin.tableExists(TableName.valueOf(tableName));
//关闭连接
if(admin != null){
admin.close();
}
if(connection != null){
connection.close();
}
//返回结果
return tableExists;
}
创建表
public void createTable(String tableName, String... columns) throws IOException {
//获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");
//创建HBase对象(Admin)
//使用 ConnectionFactory 类创建 Connection 对象
Connection connection = ConnectionFactory.createConnection(configuration);
//通过 Connection 对象创建 Admin 对象
Admin admin = connection.getAdmin();
//创建表
//校验列族
if(columns.length <= 0){
System.out.println("列族不能为空");
return ;
}
//校验表名是否存在
if(admin.tableExists(TableName.valueOf(tableName))){
System.out.println("表名存在");
return ;
}
//创建表描述器
HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
//循环添加列族信息
for (String column : columns) {
//创建列族描述器
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(column);
//添加列族信息
hTableDescriptor.addFamily(hColumnDescriptor);
}
//创建表
admin.createTable(hTableDescriptor);
//关闭连接
if(admin != null){
admin.close();
}
if(connection != null){
connection.close();
}
}
删除表
public void dropTable(String tableName) throws IOException {
//获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");
//创建HBase对象(Admin)
//使用 ConnectionFactory 类创建 Connection 对象
Connection connection = ConnectionFactory.createConnection(configuration);
//通过 Connection 对象创建 Admin 对象
Admin admin = connection.getAdmin();
//删除表
//校验表名是否存在
if(!admin.tableExists(TableName.valueOf(tableName))){
System.out.println(tableName + " -- 表名不存在");
return ;
}
//使表不可用
admin.disableTable(TableName.valueOf(tableName));
//删除表
admin.deleteTable(TableName.valueOf(tableName));
//关闭连接
if(admin != null){
admin.close();
}
if(connection != null){
connection.close();
}
}
创建命名空间
public void createNameSpace(String nameSpace) {
//获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");
//创建HBase对象(Admin)
//使用 ConnectionFactory 类创建 Connection 对象
Connection connection = null;
try {
connection = ConnectionFactory.createConnection(configuration);
} catch (IOException e) {
e.printStackTrace();
}
//通过 Connection 对象创建 Admin 对象
Admin admin = null;
try {
admin = connection.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
//创建命名空间
//创建命名空间描述器
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(nameSpace).build();
//创建命名空间
try {
admin.createNamespace(namespaceDescriptor);
} catch (NamespaceExistException e) {
System.out.println(namespaceDescriptor + " -- 命名空间已存在");
} catch (IOException e) {
e.printStackTrace();
}
//关闭连接
if(admin != null){
admin.close();
}
if(connection != null){
connection.close();
}
}
数据操作API(DML)
插入数据
public void putData(String tableName, String rowKey, String cf, String cn, String value) throws IOException {
//获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");
//创建Table对象
//使用 ConnectionFactory 类创建 Connection 对象
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf(tableName));
//插入数据
//创建Put对象
Put put = new Put(Bytes.toBytes(rowKey));
//给put对象赋值
put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));
//插入数据
table.put(put);
//关闭连接
if (table != null) {
table.close();
}
if (connection != null) {
connection.close();
}
}
获取数据(get)
public void getData(String tableName, String rowKey, String cf, String cn) throws IOException {
//获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");
//创建Table对象
//使用 ConnectionFactory 类创建 Connection 对象
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf(tableName));
//获取数据
//创建Get对象
Get get = new Get(Bytes.toBytes(rowKey));
//给Get对象赋值
if (cf != null && !"".equals(cf)) {
if (cn != null && !"".equals(cn)) {
get.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));
} else {
get.addFamily(Bytes.toBytes(cf));
}
}
//获取数据
Result result = table.get(get);
//解析Result,并打印数据
for (Cell cell : result.rawCells()) {
byte[] columeFamily = CellUtil.cloneFamily(cell);
byte[] columnName = CellUtil.cloneQualifier(cell);
byte[] value = CellUtil.cloneValue(cell);
System.out.println("CF:" + Bytes.toString(columeFamily) + " -- " +
"CN:" + Bytes.toString(columnName) + " -- " +
"Value:" + Bytes.toString(value));
}
//关闭连接
if (table != null) {
table.close();
}
if (connection != null) {
connection.close();
}
}
获取数据(scan)
public void scanData(String tableName, String startRow, String stopRow) throws IOException {
//获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");
//创建Table对象
//使用 ConnectionFactory 类创建 Connection 对象
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf(tableName));
//获取数据
//创建Scan对象
Scan scan = null;
if (stopRow != null && !"".equals(stopRow)) {
scan = new Scan(Bytes.toBytes(startRow), Bytes.toBytes(stopRow));
} else {
scan = new Scan(Bytes.toBytes(startRow));
}
//获取数据
ResultScanner resultScanner = table.getScanner(scan);
//解析ResultScanner
for (Result result : resultScanner) {
//解析Result
Cell[] cells = result.rawCells();
//打印数据
for (Cell cell : cells) {
byte[] row = CellUtil.cloneRow(cell);
byte[] columeFamily = CellUtil.cloneFamily(cell);
byte[] columnName = CellUtil.cloneQualifier(cell);
byte[] value = CellUtil.cloneValue(cell);
System.out.println("Row:" + Bytes.toString(row) + " -- " +
"CF:" + Bytes.toString(columeFamily) + " -- " +
"CN:" + Bytes.toString(columnName) + " -- " +
"Value:" + Bytes.toString(value));
}
}
//关闭连接
if (table != null) {
table.close();
}
if (connection != null) {
connection.close();
}
}
删除数据
public void deleteData(String tableName, String rowKey, String cf, String cn) throws IOException {
//获取配置文件信息
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153");
//创建Table对象
//使用 ConnectionFactory 类创建 Connection 对象
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf(tableName));
//获取数据
//创建Delete对象
Delete delete = new Delete(Bytes.toBytes(rowKey));
if (cf != null && !"".equals(cf)) {
if (cn != null && !"".equals(cn)) {
delete.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));
} else {
delete.addFamily(Bytes.toBytes(cf));
}
}
//删除数据
table.delete(delete);
//关闭连接
if (table != null) {
table.close();
}
if (connection != null) {
connection.close();
}
}
MapReduce
环境准备
-
第一步:将HBase的lib中的文件添加到Hadoop中
- 在hadoop目录下的 etc/hadoop/ 目录下的 hadoop-env.sh 文件添加配置
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/$HBASE_HOME/lib/*
-
第二步:将 hadoop-env.sh 文件分发到其他服务器上
官方案例
-
案例一:统计 fzk 表中有多少行数据
/hadoop目录/bin/yarn jar \ /hbase目录/lib/hbase-server-1.3.1.jar rowcounter fzk #事例 /opt/software/hadoop/hadoop-3.1.4/bin/yarn jar \ /opt/software/hbase/hbase-1.3.1/lib/hbase-server-1.3.1.jar rowcounter fzk
-
案例二:使用 MapReduce 将本地数据导入到 HBase
-
第一步:在本地创建一个 tsv 格式的文件:my.tsv
1001 fff 111 1002 zzz 222 1003 kkk 333
-
第二步:在hdfs上创建 user 目录,并将 my.tsv 文件上传到 user 目录中
hadoop fs -mkdir /user hadoop fs -put my.tsv /user
-
第三步:创建 Hbase 表
create 'user', 'info'
-
第四步:执行 MapReduce 到 HBase 的 user 表中
/hadoop目录/bin/yarn jar \ /hbase目录/lib/hbase-server-1.3.1.jar importtsv \ -Dimporttsv.columns=HBASE_ROW_KEY,列族:字段,列族:字段 表名 \ 文件的hdfs地址 /opt/software/hadoop/hadoop-3.1.4/bin/yarn jar \ /opt/software/hbase/hbase-1.3.1/lib/hbase-server-1.3.1.jar importtsv \ -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:password user \ hdfs://hadoop151:8020/user
-
自定义Hbase-MapReduce
将 HDFS 中的数据写入到 Hbase 表中(打成jar包上传到服务器运行)
-
第一步:导入依赖(pom.xml)
<dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.3.1</version> </dependency> </dependencies>
-
第二步:编写Mapper类
import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class MRMapper extends Mapper<LongWritable, Text, LongWritable, Text> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //写出到reduce中 context.write(key, value); } }
-
第三步:编写Reducer类
import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.mapreduce.TableReducer; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import java.io.IOException; public class MRReducer extends TableReducer<LongWritable, Text, NullWritable> { @Override protected void reduce(LongWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException { for (Text value : values) { //切割数据 String[] datas = value.toString().split("\t"); //创建Put对象 Put put = new Put(Bytes.toBytes(datas[0])); //给put对象赋值,三个参数分别是:列族、字段名、数据 put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes(datas[1])); put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("password"), Bytes.toBytes(datas[2])); //写出到hbase的表中 context.write(NullWritable.get(), put); } } }
-
第四步:编写Driver类
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.util.Tool; import java.io.IOException; public class MRDriver { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { //1、获取配置信息以及 job 对象 Configuration configuration = new Configuration(); Job job = Job.getInstance(configuration); //2、关联 Driver 的 jar job.setJarByClass(MRDriver.class); //3、设置 Mapper 和 Reducer job.setMapperClass(MRMapper.class); TableMapReduceUtil.initTableReducerJob(args[1], //表名 MRReducer.class, //reducer类 job); //job对象 //4、设置 Mapper 输出的 key-value job.setMapOutputKeyClass(LongWritable.class); job.setMapOutputValueClass(Text.class); //5、设置 Reducer 输出的 key-value job.setOutputKeyClass(NullWritable.class); job.setOutputValueClass(Put.class); //6、设置 输入和输出 路径 FileInputFormat.setInputPaths(job, new Path(args[0])); //7、提交 job System.exit(job.waitForCompletion(true) ? 0 : 1); } }
-
第五步:将程序打包并上传到服务器(HBase目录的lib目录中)
-
第六步:运行
hadoop命令目录 jar jar包目录和名称 类的全限定名称 \ /hdfs上的数据目录 hbase的表名 # 事例 /opt/software/hadoop/hadoop-3.1.4/bin/hadoop jar /opt/software/hbase/hbase-1.3.1/lib/mr.jar \ com.itfzk.hbase.mr.MRDriver /users user
将一张表中的部分数据通过 MR 迁入到另一张表中(在本地运行)
需求:将 user 表中字段为‘name’的数据,通过 MR 迁入到 users 表中
-
第一步:导入依赖(pom.xml)
<dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.3.1</version> </dependency> </dependencies>
-
第二步:将服务器上的HBase目录的conf目录的 hbase-site.xml 文件拷贝到项目的 resources 目录下
-
第三步:Mapper类
import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.TableMapper; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; public class MRMapper extends TableMapper<ImmutableBytesWritable, Put> { @Override protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException { //创建Put对象 Put put = new Put(key.get()); //遍历rowKey数据并将 类字段为‘name’ 的数据赋值给put对象 for (Cell cell : value.rawCells()) { if ("name".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))){ //将数据赋值给put对象 put.add(cell); break; } } //写出到reduce中 context.write(key, put); } }
-
第四步:Reducer类
import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.TableReducer; import org.apache.hadoop.io.NullWritable; import java.io.IOException; public class MRReducer extends TableReducer<ImmutableBytesWritable, Put, NullWritable> { @Override protected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context) throws IOException, InterruptedException { //将数据写出到hbase的表中 for (Put put : values) { context.write(NullWritable.get(), put); } } }
-
第五步:Driver类
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.mapreduce.Job; import java.io.IOException; public class MRDriver2 { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { //1、获取配置信息以及 job 对象 Configuration configuration = HBaseConfiguration.create(); Job job = Job.getInstance(configuration); //2、关联 Driver 的 jar job.setJarByClass(MRDriver2.class); //3、设置 Mapper 和 输出的 key-value 类型 TableMapReduceUtil.initTableMapperJob("user", //表名 new Scan(), //Scan查询对象 MRMapper.class, //mapper对象 ImmutableBytesWritable.class, //mapper的key的输出类型 Put.class, //mapper的value的输出类型 job); //job //4、设置Reducer TableMapReduceUtil.initTableReducerJob("users", //表名 MRReducer.class, //reducer类 job); //job对象 //5、设置 Reducer 输出的 key-value 类型 job.setOutputKeyClass(NullWritable.class); job.setOutputValueClass(Put.class); //6、提交 job System.exit(job.waitForCompletion(true) ? 0 : 1); } }
4、优化
高可用
-
在hbase目录下创建并编辑 conf/backup-masters 文件
# 另外两台服务器的 host 名称(作用:启动hbase时,这两台也启动master成Backup Master,当master挂掉后,Backup Master会又一个成为master) hadoop152 hadoop153
预分区(四种方式)
每一个 region 维护着 StartRow 与 EndRow,如果加入的数据符合某个 Region 维护的 RowKey 范围,则该数据交给这个 Region 维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高 HBase 性能。
-
第一种:手动设定预分区
# 五个分区:(负无穷,1000),(1000,2000),(2000,3000),(3000,4000),(4000,正无穷) create 'table1001','info',SPLITS=>['1000','2000','3000','4000']
-
第二种:生成 16 进制序列预分区(不推荐)
#生成15个分区,按 16 进行分区 create 'table1002','info',{NUMREGIONS => 15, SPLITALGO =>'HexStringSplit'}
-
第三种:按照文件中设置的规则预分区
#按 splits.txt 文件进行分区 create 'table1003',SPLITS_FILE =>'splits.txt'
-
第四种:使用 JavaAPI 创建预分区
public void createTable(String tableName, String... columns) throws IOException { //获取配置文件信息 Configuration configuration = HBaseConfiguration.create(); configuration.set("hbase.zookeeper.quorum", "hadoop151,hadoop152,hadoop153"); //创建HBase对象(Admin) //使用 ConnectionFactory 类创建 Connection 对象 Connection connection = ConnectionFactory.createConnection(configuration); //通过 Connection 对象创建 Admin 对象 Admin admin = connection.getAdmin(); //创建表描述器 HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName)); //循环添加列族信息 for (String column : columns) { //创建列族描述器 HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(column); //添加列族信息 hTableDescriptor.addFamily(hColumnDescriptor); } / JavaAPI 创建预分区 //自定义算法,产生一系列 hash 散列值存储在二维数组中 byte[][] splitKeys = 某个散列值函数; //创建表(通过 HTableDescriptor 实例和散列值二维数组创建带有预分区的 Hbase 表) admin.createTable(hTableDescriptor, splitKeys); //关闭连接 if(admin != null){ admin.close(); } if(connection != null){ connection.close(); } }
基础优化
-
允许在 HDFS 的文件中追加内容(hdfs-site.xml、hbase-site.xml)
属性:dfs.support.append 解释:开启 HDFS 追加同步,可以优秀的配合 HBase 的数据同步和持久化。默认值为 true
-
优化 DataNode 允许的最大文件打开数(hdfs-site.xml )
属性:dfs.datanode.max.transfer.threads 解释:HBase 一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作,设置为 4096 或者更高。默认值:4096
-
优化延迟高的数据操作的等待时间(hdfs-site.xml)
属性:dfs.image.transfer.timeout 解释:如果对于某一次数据操作来讲,延迟非常高,socket 需要等待更长的时间,建议把该值设置为更大的值(默认 60000 毫秒),以确保 socket 不会被 timeout 掉。
-
**优化数据的写入效率 **(mapred-site.xml)
属性: mapreduce.map.output.compress mapreduce.map.output.compress.codec 解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec 或者其他压缩方式。
-
设置 RPC 监听数量(hbase-site.xml )
属性:Hbase.regionserver.handler.count 解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。
-
优化 HStore 文件大小(hbase-site.xml )
属性:hbase.hregion.max.filesize 解释:默认值 10737418240(10GB),如果需要运行 HBase 的 MR 任务,可以减小此值,因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间过长。该值的意思
-
优化 HBase 客户端缓存(hbase-site.xml )
属性:hbase.client.write.buffer 解释:用于指定 Hbase 客户端缓存,增大该值可以减少 RPC 调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少 RPC 次数的目的。
-
指定 scan.next 扫描 HBase 所获取的行数(hbase-site.xml)
属性:hbase.client.scanner.caching 解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。