hbase->phoenix不得不说的故事之一

使用HBase接收数据并结合Phoenix进行SQL统计时遇到挑战。本文介绍了一个关于ID和时间字段映射的问题及解决方案:调整表结构中字段类型以确保数据正确映射。

用hbase来接收数据,phoenix进行sql统计,看起来很美好,实际波折很多。

首先建表

 

CREATE    TABLE m_interface_job( 
data.pk_log VARCHAR  ,
..........
 id INTEGER  not null primary key
) ;


用hbase插入,

发现

 

select id,* from m_interface_job limit 10;

 

+------------+---------+-------+----------------------+--------+----------------+----------------------+-------------+
|     ID     | PK_LOG  | TYPE  |        TITLE         |  USER  |      HOST      |      START_TIME      |       END_T |
+------------+---------+-------+----------------------+--------+----------------+----------------------+-------------+
| -593453590  | null    | 3     | new_Hload_mdownload  | rsync  | xxxx7  | 1970-01-01 08:00:00  | 1970-01-01  |
| -593453590  | null    | 3     | new_Hload_mdownload  | rsync  | xxxx.77  | 1970-01-01 08:00:00  | 1970-01-01  |
| -593453590  | null    | 3     | new_Hload_mdownload  | rsync  | xxxxx77  | 1970-01-01 08:00:00  | 1970-01-01  |

为啥ID都是负数了。

原来hbase插入的数,无法和phonix建立起映射,

将建表改为,

CREATE    TABLE m_interface_job( 
data.pk_log VARCHAR  ,
..........
 id VARCHAR  not null primary key
) ;


问题搞定,ID正确了。

但是START_TIME | END_T |却是:

1970-01-01 08:00:00  | 1970-01-01  


why?听下回分解。。。

 

 


 

<!--RegionServer的共享目录,用来持久化Hbase--> <property> <name>hbase.rootdir</name> <!--如果要指定HDFS上的目录,端口号要与hdfs-site.xml中设为 一致--> <value>hdfs://master:8020/hbase</value> </property> <property> <!--启用分布式集群--> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <!--默认HMasterHTTP访问端口--> <name>hbase.master.info.port</name> <value>16010</value> </property> <property> <!--默认HRegionServer HTTP 访问端口--> <name>hbase.regionserver.info.port</name> <value>16030</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> <!--Zookeeper 元数据快照的存储目录(需要和zoo.cfg 配置文件中的属性一 致)--> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/zookeeper-3.8.3/zkdata</value> </property> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> </property> <!-- 备份的副本数,不能超过datanode的节点数。hbase-site.xml的 dfs.replication 与 hdfs-site.xml 配置文件中的dfs.replication 与参数不 同,需要单独设置,否则hbase写入的数据regionServer只会保存一份!--> <property> <name>dfs.replication</name> <value>2</value> </property> <!--hbase-site.xml 文件中 修改增加 ,增大时间容错--> <property> <name>hbase.master.maxclockskew</name> <value>150000</value> 83 </property>(我现在有三台虚拟机hadoop102(主),hadoop103(从),hadoop104(从)),请你帮我修改配置文件,版本情况:hadoop-3.1.3,hbase-2.4.18,jdk1.8.0_212
最新发布
10-10
<think>根据给定的软件版本和虚拟机配置,需要修改以下HBase配置文件: 1. hbase-env.sh 2. hbase-site.xml 3. regionservers 注意:HBase 2.4.18与Hadoop 3.1.3兼容,但需要确保Hadoop的配置文件(core-site.xml, hdfs-site.xml)在HBase的类路径中。 步骤: 1. 配置hbase-env.sh:设置JAVA_HOME、禁用HBase内置的ZooKeeper(如果使用外部ZooKeeper)等。 2. 配置hbase-site.xml:设置HBase集群的分布式模式、ZooKeeper集群地址、HDFS的NameNode地址等。 3. 配置regionservers:列出所有的RegionServer节点。 假设: - HBase安装在所有节点上,且路径一致。 - 使用HBase自带的ZooKeeper(也可以使用外部ZooKeeper,但这里为简化使用内置,且通常内置足够)。 - HBase的Master节点在hadoop102上(因为用户指定hadoop102为主)。 具体配置: 1. hbase-env.sh 设置JAVA_HOME,并注意HBase 2.4.x需要JDK8,所以使用给定的jdk1.8.0_212。 另外,如果使用内置ZooKeeper,不需要额外配置。 2. hbase-site.xml 需要配置的关键属性: - hbase.rootdir: HBase在HDFS上的存储路径,需要指向Hadoop的NameNode地址(hadoop102:8020) - hbase.cluster.distributed: 设置为true,表示分布式模式 - hbase.zookeeper.quorum: 指定ZooKeeper集群节点,这里我们使用三台机器:hadoop102,hadoop103,hadoop104 - hbase.zookeeper.property.dataDir: ZooKeeper的数据目录 - hbase.unsafe.stream.capability.enforce: 针对Hadoop3需要设置,避免因HDFS的stream capability检查导致错误(设为false) - hbase.master: 指定Master的主机名和端口(可选,如果不指定,则默认在启动Master的节点上运行) - hbase.master.info.port: Master的Web UI端口(2.x版本默认16010,但可以指定) 3. regionservers 写入三个节点:hadoop103, hadoop104(因为hadoop102作为Master,通常也作为RegionServer,但根据引用[1]中的描述,hadoop101(相当于这里的hadoop102)也运行了Region Server,所以这里三台都作为RegionServer,包括hadoop102。但用户要求主节点是hadoop102,从节点是hadoop103和hadoop104,所以regionservers文件中应该包括三个节点:hadoop102, hadoop103, hadoop104?但通常Master节点可以单独运行,也可以同时运行RegionServer。根据引用[1]中的描述,Master在hadoop101(对应hadoop102)上,同时该节点也有RegionServer,所以regionservers文件中应该有三台:hadoop102, hadoop103, hadoop104。 但是,注意引用[1]中提到了还有一个Backup Master在hadoop102上?这里实际上是hadoop102(Master)和hadoop102(备份Master?)?实际上,在HBase中,可以设置多个Master实现高可用,其中一个为Active Master,其他为Backup Master。因此,我们可以在hadoop103上也设置一个Backup Master。 因此,在hbase-site.xml中,我们还需要配置: - hbase.master: 指定主Master的地址和端口(默认端口16000) - hbase.backup.masters: 指定备份Master的节点(这里我们指定hadoop103为备份Master) 总结配置: 具体修改如下: 1. 修改hbase-env.sh 添加: export JAVA_HOME=/path/to/jdk1.8.0_212 # 根据实际路径修改 export HBASE_MANAGES_ZK=true # 使用HBase自带的ZooKeeper 2. 修改hbase-site.xml 在<configuration>标签内添加如下属性: ```xml <property> <name>hbase.rootdir</name> <value>hdfs://hadoop102:8020/hbase</value> <!-- 这里8020是Hadoop NameNode的RPC端口,根据实际修改 --> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop102,hadoop103,hadoop104</value> <!-- ZooKeeper集群节点 --> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/path/to/zookeeper/data</value> <!-- 设置ZooKeeper数据目录,确保存在且可写 --> </property> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> <!-- 避免与Hadoop3的兼容性问题 --> </property> <property> <name>hbase.master</name> <!-- 可选,默认就是启动的节点 --> <value>hadoop102</value> </property> <property> <name>hbase.master.info.port</name> <value>16010</value> <!-- 2.x版本Web UI端口,如果不设置默认就是16010 --> </property> <property> <name>hbase.backup.masters</name> <value>hadoop103</value> <!-- 指定备份Master节点为hadoop103 --> </property> ``` 3. 修改regionservers文件 内容为: hadoop102 hadoop103 hadoop104 注意:HBase的Master可以同时运行RegionServer,所以regionservers中包含hadoop102是没问题的。 4. 配置备份Master(在hadoop103上启动备份Master) 在conf目录下创建一个文件backup-masters(如果没有),里面写入备份Master的主机名,即hadoop103。或者通过hbase-site.xml中的hbase.backup.masters属性指定(如上面配置),则不需要单独创建backup-masters文件(HBase 2.x支持这种配置方式)。 5. 将Hadoop的配置文件(core-site.xml, hdfs-site.xml)复制到HBase的conf目录下,或者设置HBASE_CLASSPATH环境变量包含Hadoop的配置目录。但通常更简单的方式是复制这两个文件到HBase的conf目录下。 6. 确保所有节点的时间同步,主机名解析正确(/etc/hosts配置),SSH免密登录(至少Master可以免密登录其他节点)。 7. 启动HBase:在Master节点(hadoop102)上执行命令:`bin/start-hbase.sh` 8. 验证:访问Master的Web UI:http://hadoop102:16010,应该可以看到集群状态。 注意:如果遇到端口冲突,请检查配置的端口是否被占用。 </think>根据提供的三台虚拟机(hadoop102主节点,hadoop103/hadoop104从节点)和软件版本(HBase 2.4.18 + Hadoop 3.1.3 + JDK 1.8),以下是完整的HBase配置文件修改指南: ### 一、核心配置文件修改 #### 1. `hbase-env.sh` ```bash # 设置JDK路径 (根据实际路径修改) export JAVA_HOME=/opt/module/jdk1.8.0_212 # 使用内置ZooKeeper export HBASE_MANAGES_ZK=true # 禁用HBase内置的HDFS客户端(使用Hadoop 3.x的客户端) export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true" ``` #### 2. `hbase-site.xml` ```xml <configuration> <!-- HDFS存储路径 --> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop102:8020/hbase</value> </property> <!-- 分布式模式 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- ZooKeeper集群节点 --> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop102,hadoop103,hadoop104</value> </property> <!-- ZooKeeper数据目录 --> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/module/zookeeper/data</value> </property> <!-- Master节点地址 --> <property> <name>hbase.master</name> <value>hadoop102</value> </property> <!-- 备份Master节点 --> <property> <name>hbase.backup.masters</name> <value>hadoop103</value> </property> <!-- 兼容Hadoop 3.x --> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> </property> <!-- Web UI端口 --> <property> <name>hbase.master.info.port</name> <value>16010</value> </property> </configuration> ``` #### 3. `regionservers` ``` hadoop103 hadoop104 ``` ### 二、关键注意事项 1. **端口变更**: - HBase 2.x的Master Web UI端口为`16010`(非1.x的60010) - RegionServer Web UI端口为`16030` 2. **Hadoop依赖**: ```bash # 在HBase的lib目录下添加Hadoop 3.x兼容包 cp $HADOOP_HOME/share/hadoop/common/*.jar $HBASE_HOME/lib/ cp $HADOOP_HOME/share/hadoop/hdfs/*.jar $HBASE_HOME/lib/ ``` 3. **主机映射**: 确保所有节点的`/etc/hosts`包含: ``` 192.168.x.x hadoop102 192.168.x.x hadoop103 192.168.x.x hadoop104 ``` 4. **启动顺序**: ```bash # 先启动HDFS hadoop102> $HADOOP_HOME/sbin/start-dfs.sh # 再启动HBase hadoop102> $HBASE_HOME/bin/start-hbase.sh ``` ### 三、验证部署 1. **Web UI检查**: - 访问 `http://hadoop102:16010` - 应显示Master在hadoop102,RegionServers在hadoop103/hadoop104 - Backup Master应在hadoop103(如配置) 2. **Shell验证**: ```bash hbase shell > status # 应显示3个活节点(1 Master + 2 RegionServer) ``` > **重要提示**:若遇到HDFS权限问题,需在Hadoop执行: > `hdfs dfs -chmod -R 777 /hbase` > 或在`hadoop-policy.xml`配置权限[^1]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值