整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

医药数据查询2

医药数据查询2

、国家药监局查询链接:

1.https://www.nmpa.gov.cn/datasearch/home-index.html?79QlcAyHig6m=1658898341929#category=yp

可查询内容:

国产药品 进口药品 进口药品商品名

境内生产药品备案信息公示 境外生产药品备案信息公示

药品生产企业许可 药品经营企业许可

全国药品抽检 药品出口销售证明

GMP认证 GSP认证

执业药师注册人员 互联网药品信息服务

中药提取物备案公示 中药配方颗粒备案信息公示

非处方药中药目录 非处方药化学药品目录

药品注册相关专利信息公开公示 中药保护品种

药物临床试验机构名单

麻醉药品和精神药品品种目录 国家基本药物(2018年版)

疫苗说明书和标签数据库(测试版)

2.https://www.nmpa.gov.cn/datasearch/home-index.html?79QlcAyHig6m=1659676758519#category=ylqx

可查询内容:

境内医疗器械(注册) 境内医疗器械(注册历史数据)

境内医疗器械(备案) 境内医疗器械(备案历史数据)

进口医疗器械(注册) 进口医疗器械(注册历史数据)

进口医疗器械(备案) 进口医疗器械(备案历史数据)

医疗器械生产企业(许可) 医疗器械经营企业(许可)

医疗器械生产企业(备案) 医疗器械经营企业(备案)

医疗器械标准目录 医疗器械分类目录 体外诊断试剂分类子目录(2013版)

一次性使用医疗器械产品

医疗器械网络交易服务第三方平台

3.https://www.nmpa.gov.cn/datasearch/home-index.html?79QlcAyHig6m=1659676758519#category=hzp

可查询内容:

国产特殊化妆品注册信息 进口特殊化妆品注册信息 进口化妆品

化妆品原料备案信息 化妆品注册和备案检验检测机构 化妆品生产企业

国产普通化妆品备案信息 进口普通化妆品备案信息

二、国家中检所查询链接:

https://www.nifdc.org.cn/nifdc/xxgk/sjcx/index.html

可查询内容:

药包材标准 进口报告书查询 生物制品批签发

三、国家药典委员会查询链接:

http://114.247.108.159:8090/zwywxt/staticindex.html

可查询内容:

指纹图谱

四、国家药监局药品审评中心

查询1链接:

https://www.cde.org.cn/main/xxgk/listpage/9f9c74c73e0f8f56a8bfbc646055026d

可查询内容:

受理品种信息 审评任务公示 沟通交流公示 特殊审批品种列表

优先审评公示 突破性治疗公示 三合一序列公示

临床试验默示许可 上市药品信息 原辅包登记信息

查询2链接:

https://www.cde.org.cn/hymlj/listpage/9cd8db3b7530c6fa0c86485e563f93c7

可查询内容:

上市化学药品目录集信息 说明书信息

五、国家药监局审核查验中心查询链接:

https://www.cfdi.org.cn/cfdi/index?module=A002&m1=16&m2=&nty=STA020&tcode=STA022

可查询内容:

药物非临床研究质量管理规范认证公告 药物临床试验机构资格认定检查公告

六、国家药监局药品评价中心

查询1链接:

https://www.cdr-adr.org.cn/drug_1/aqjs_1/

可查询内容:

药品警戒信息 药品不良反应信息 药品修订说明书信息

查询2链接:

http://otc.adrs.org.cn:18888/OTCweb/pages/HistoryNoticeApply.action

可查询内容:

历史公示转换非处方药品种名单

七、国家市场局查询链接:

https://zwfw.samr.gov.cn/needSearch

可查询内容:

国家企业信用信息公示系统 药品广告查询

八、中国市场监管行政处罚文书网查询链接:

https://cfws.samr.gov.cn/

可查询内容:

药品零售行政处罚文书

九、药品生产、批发需要在各省药监行政处罚项下查询链接:

1.上海:

http://hdcx.smda.sh.cn/XingZhengChuFa/xxgk2.aspx?pu=&qymc=&slrqstart=&slrqend=&pageindex=1&pagesize=20

2.陕西

http://mpa.shaanxi.gov.cn/jgxx/xzcfxx.htm

3.北京

http://xxcx.yjj.beijing.gov.cn/eportal/ui?pageId=723606

4.天津

http://scjg.tj.gov.cn/tjsscjdglwyh_52651/xwdt/xzcfxxgs/sjxzcfxx/

5.河北

http://yjj.hebei.gov.cn/CL0218/

6.山西

https://yjj.shanxi.gov.cn/aliasProject/xzzf.htm

7.内蒙古

http://mpa.nmg.gov.cn/zfxxgk/fdzdgknr/?gk=4

8.辽宁

http://ypjg.ln.gov.cn/zfxxgk_147137/fdzdgknr/cfqz/xzcf/

9.吉林

http://mpa.jl.gov.cn/xxgk_84894/xzcfajxxgk/

10.黑龙江

http://mpa.hlj.gov.cn/xzcfquery.jspx

11.江苏

http://218.94.26.170:9080/datacenter/dc/sgslist/c67bbfef054d4dbcaaca538600742618

12.浙江

http://mpa.zj.gov.cn/col/col1229429057/index.html

13.安徽

http://mpa.ah.gov.cn/public/column/4140867?type=4&action=list&nav=3&catId=6719765

14.福建

http://yjj.scjgj.fujian.gov.cn/zwgk/gstg/ssjccjggs/

15.江西

http://mpa.jiangxi.gov.cn/col/col38915/index.html

16.山东

http://mpa.shandong.gov.cn/col/col101822/index.html

17.河南

http://yjj.henan.gov.cn/zwgk/zcjd/

18.湖北

http://fda.hubei.gov.cn/zfxxgk/fdzdgknr/cfqz/xxcfjd/#test

19.湖南

http://mpa.hunan.gov.cn/mpa/xxgk/zfxxgknew/c100812/c100826/xxgk_new.html

20.广东

http://mpa.gd.gov.cn/ztzl/zdly/xzcfaj/index.html

21.广西

http://yjj.gxzf.gov.cn/zwgk/fdzdgknr/xzzf/

22.海南

https://amr.hainan.gov.cn/himpa/ajxxgk/web/index.jsp

23.重庆

http://yaojianju.cq.gov.cn/zwgk_217/fdzdgknr/xzcf/

24.四川

http://yjj.sc.gov.cn/scyjj/c103184/xzcf.shtml

25.贵州

http://yjj.guizhou.gov.cn/zwgk/zdly/xzcf/

26.云南

http://mpa.yn.gov.cn/newsite/ZwgkNewsList.aspx?CID=a3330f59-3154-4327-8fd2-1569cffa5647

27.西藏

http://mpa.xizang.gov.cn/zwgk/gsgg/xzcfgs/

28.甘肃

http://apps.yjj.gansu.gov.cn:2180/xksgs.jsp

29.青海

http://ypjgj.qinghai.gov.cn/Article/ArticlePageYJJ?ParentSectionName=%E6%B3%95%E5%AE%9A%E4%B8%BB%E5%8A%A8%E5%85%AC%E5%BC%80%E5%86%85%E5%AE%B9§ion_id=D80B7953-6F82-4BA4-9FF8-C3C4C417D0CD&page=2&pagesize=15

30.宁夏

http://nxyjj.nx.gov.cn/yp/jdjc/allindex.html

31.新疆

http://mpa.xinjiang.gov.cn/xjyjj/xzcf/list_tyz.shtml

十、国家法律法规数据库查询链接:

https://flk.npc.gov.cn/

可查询内容:

涉及药品的法律和行政规范

十一、国家医保局查询链接:

https://fuwu.nhsa.gov.cn/nationalHallSt/#/home?code=90000&flag=false&gbFlag=true

可查询内容:

国家组织药品集中带量采购中选价格

定点零售药店 国家谈判药品配备机构

医保药品分类与代码

十二、国家市场监督管理总局特殊食品安全监督管理司查询链接:

http://ypzsx.gsxt.gov.cn/specialfood/#/food

可查询内容:

保健食品注册/备案

婴幼儿配方乳粉产品配方注册 特殊医学用途配方食品注册

十三、食品安全抽检公布结果查询系统查询链接:

https://spcjsac.gsxt.gov.cn/

十四、食品安全国家标准数据检索平台查询链接:

https://sppt.cfsa.net.cn:8086/db

十五、食品生产许可获证企业信息查询平台查询链接:

http://spscxkcx.gsxt.gov.cn/spscxk/spscxkindex.xhtml

十六、全国食品经营许可(社会公众查询)查询链接:

https://spjyxk.gsxt.gov.cn/cfdaPub/index/page/

十七、国家卫生健康委员会政务服务平台查询链接:

https://zwfw.nhc.gov.cn/cxx/ywjgcx/qgyzjg/

可查询内容:

医卫机构查询 器官移植机构 爱婴医院名单 辅助生殖机构

产前诊断技术医疗机构 医院执业登记

、概述

Livy是一个提供Rest接口和spark集群交互的服务。它可以提交Spark Job或者Spark一段代码,同步或者异步的返回结果;也提供Sparkcontext的管理,通过Restful接口或RPC客户端库。Livy也简化了与Spark与应用服务的交互,这允许通过web/mobile与Spark的使用交互。其他特点还包含:

  • 提交Scala、Python或是R代码片段到远端的Spark集群上执行;
  • 提交Java、Scala、Python所编写的Spark作业到远端的Spark集群上执行;
  • 提交批处理应用在集群中运行;
  • 长时间运行的SparkContext,允许多个spark job和多个client使用;
  • 在多个spark job和客户端之间共享RDD和Dataframe;
  • 多个sparkcontext可以简单的管理,并运行在集群中而不是Livy Server,以此获取更好的容错性和并行度;
  • 作业可以通过重新编译的jar、片段代码、或Java/Scala的客户端API提交。

从Livy所提供的基本功能可以看到Livy涵盖了原生Spark所提供的两种处理交互方式(交互式会话批处理会话)。与原生Spark不同的是,所有操作都是通过REST的方式提交到Livy服务端上,再由Livy服务端发送到不同的Spark集群上去执行。说到这里我们首先来了解一下Livy的架构。

官网:https://livy.incubator.apache.org/
GitHub地址:https://github.com/apache/incubator-livy

关于Spark的介绍,可以参考我之前的文章:大数据Hadoop之——计算引擎Spark

二、Apache Livy模块介绍

1)Client

Client 并不算 livy 的模块,也很简单,在此略过;

2)router

我们知道,livy server 提供的 api 是 rest api,Client 发送的请求也是针对各个资源(uri)的增删改查。router 的核心职责是管理好要把对什么资源的什么操作指派给哪个类的哪个函数来处理,该模块核心类是 SessionServlet,继承于 ScalatraServlet,有两个子类:InteractiveSessionServletBatchSessionServlet,分别用来路由对 session 及 batch 相关的请求;

3)权限管理

权限由 AccessManager 类管理,维护了几种不同级别的 user:

  • superUser
  • modifyUser
  • viewUser
  • allowedUser
    以及不用级别的 acl(访问控制列表):
  • viewAcls:superUsers ++ modifyUsers ++ viewUsers,对应查看权限
  • modifyAcls:superUsers ++ modifyUsers,对应修改权限(包括 kill 权限)
  • superAcls:superUsers,有所有权限
  • allowedAcls:superUsers ++ modifyUsers ++ viewUsers ++ allowedUsers,表示 acl 的全集

在目前的实现中,livy 的权限管理尚不支持插件化且只有 AccessManager 一种实现,若要定义自己的权限管理,需要直接修改源码。

4)生成 Spark App

对于 session 和 batch 的任务,生成 Spark App 的逻辑及最终生成的 Spark App 都是不同的。先来说说相对简单的生成 session 的 Spark App 涉及的主要类:

  • ContextLauncher——用于启动一个新的 Spark App(通过 SparkLauncher)以及获取如何连接到其 driver 的信息(地址、clientId 及秘钥)。
  • RSCClient——与 Spark Driver 建立连接,向其发送创建、查看状态结果日志、修改statement、job 等请求并获取响应。

接下来是生成 batch 的 Spark App 涉及的主要类:

  • SparkProcessBuilder——用于从 livyConf 中提取出运行一个 Spark App 所需的一切,包括 mainClass、executableFile、deployMode、conf、master、queue、env 及 driver 和 executors 的资源配置等等;并最终生成一条启动 Spark App 的 spark-submit 命令。
  • SparkYarnApp——用来运行 SparkProcessBuilder 生成的启动命令,并监控管理启动运行起来的 Spark App,包括获取状态、日志、诊断信息、kill 等(目前 livy 只支持 local 和 yarn 两种模式,local 暂不进行介绍)。

5)交互式 Driver

需要注意的是,该模块仅对于 session 任务有,batch 并没有。 该模块中,最核心的类是 RSCDriver,其继承与 RpcDispatcher,RpcDispatcher 接收来自 RSCClient 发送的 rpc 请求,根据请求的类型调用 RSCDriver 相应的方法去处理请求中包含的具体信息,对于最核心的执行代码片段(statement)请求,调用 repl/Session 去处理,repl/Session 最终会根据不同的 session kind 调用不同的 Interpreter 进行真正的代码执行,目前共有 Spark、Scala、Python、R 对应的 Interpreter。

6)状态数据存储

核心类是 StateStore,状态数据的存储都是以 key-value 形式,目前有基于文件系统和 Zookeeper 的实现。另外,SessionStore 继承了该类提供高阶 Api 来进行 sessions 的存储和恢复。

三、Apache Livy架构

1)Livy架构

Livy是一个典型的REST服务架构,它一方面接受并解析用户的REST请求,转换成相应的操作;另一方面它管理着用户所启动的所有Spark集群。具体架构如下图:


用户可以以REST请求的方式通过Livy启动一个新的Spark集群,
Livy将每一个启动的Spark集群称之为一个会话(session),一个会话是由一个完整的Spark集群所构成的,并且通过RPC协议在Spark集群和Livy服务端之间进行通信。根据处理交互方式的不同,Livy将会话分成了两种类型

  • 交互式会话(interactive session)——这与Spark中的交互式处理相同,交互式会话在其启动后可以接收用户所提交的代码片段,在远端的Spark集群上编译并执行;
  • 批处理会话(batch session)——用户可以通过Livy以批处理的方式启动Spark应用,这样的一个方式在Livy中称之为批处理会话,这与Spark中的批处理是相同的。

2)Livy执行作业流程

下面这幅图片是Livy的基本原理,客户端提交任务到Livy server后,Livy server启动相应的session,然后提交作业到Yarn集群,当Yarn拉起ApplicationMaster进程后启动SparkContext,并连接到Livy Server进行通信。后续执行的代码会通过Livy server发送到Application进程执行。


下面是源码级别的详细的执行流程:

  1. live-server启动,启动BatchSessionManager, InteractiveSessionManager。
  2. 初始化WebServer,通过ServletContextListener启动InteractiveSessionServlet和BatchSessionServlet。
  3. 通过http调用SessionServlet的createSession接口,创建session并注册到sessionManager,InteractiveSession和BatchSession会创建SparkYarnApp,SparkYarnApp负责启动Spark作业,并维护yarnclient,获取作业信息、状态或kill作业。
  4. BatchSession是以jar包的方式提交作业,运行结束后session作业就结束。
  5. InteractiveSession会启动com.cloudera.livy.repl.ReplDriver,ReplDriver继承RSCDriver,初始化期间会通过RPC连接到livy-server,并启动RpcServer;其次会初始化Interpreter(支持PythonInterpreter,SparkInterpreter,SparkRInterpreter)。接收来自livy-server,并启动RpcServer;其次会初始化Interpreter(支持PythonInterpreter,SparkInterpreter,SparkRInterpreter)。接收来自livy-server的信息(代码),然后通过Interpreter执行,livy-server通过RPC请求作业结果。

四、环境部署

Hadoop环境部署可参考我之前的文章:大数据Hadoop原理介绍+安装+实战操作(HDFS+YARN+MapReduce)

1)下载

Livy下载地址:https://livy.apache.org/download
Livy官方文档:https://livy.apache.org/get-started/
Spark下载地址:http://spark.apache.org/downloads.html

### livy 下载
#cd /opt/bigdata
#wget https://dlcdn.apache.org/incubator/livy/0.7.1-incubating/apache-livy-0.7.1-incubating-bin.zip --no-check-certificate

# 解压
#yum -y install unzip
# unzip apache-livy-0.7.1-incubating-bin.zip

### spark 下载 
cd /opt/bigdata
wget https://dlcdn.apache.org/spark/spark-3.3.0/spark-3.3.0-bin-hadoop3.tgz  --no-check-certificate
tar -xf spark-3.3.0-bin-hadoop3.tgz

为了支持Spark 3.x版本,需要重新编译,其实它对应的是livy 0.8的snapshot版本。
https://stackoverflow.com/questions/67085984/how-to-rebuild-apache-livy-with-scala-2-12

# 下载
git clone https://github.com/apache/incubator-livy.git && cd incubator-livy

修改配置

<profile>
      <id>spark-3.3</id>
      <activation>
        <property>
          <name>spark-3.3</name>
        </property>
      </activation>
      <properties>
        <spark.scala-2.13.version>3.3.0</spark.scala-2.13.version>
        <spark.scala-2.11.version>2.4.5</spark.scala-2.11.version>
        <spark.version>${spark.scala-2.11.version}</spark.version>
        <netty.spark-2.12.version>4.1.47.Final</netty.spark-2.12.version>
        <netty.spark-2.11.version>4.1.47.Final</netty.spark-2.11.version>
        <netty.version>${netty.spark-2.11.version}</netty.version>
        <java.version>1.8</java.version>
        <py4j.version>0.10.9</py4j.version>
        <json4s.spark-2.11.version>3.5.3</json4s.spark-2.11.version>
        <json4s.spark-2.12.version>3.6.6</json4s.spark-2.12.version>
        <json4s.version>${json4s.spark-2.11.version}</json4s.version>
        <spark.bin.download.url>
          https://dlcdn.apache.org/spark/spark-3.3.0/spark-3.3.0-bin-hadoop3.tgz
        </spark.bin.download.url>
        <spark.bin.name>spark-3.3.0-bin-hadoop3</spark.bin.name>
      </properties>
    </profile>

	 <!-- 注释一些运行livy无需的模块 -->
	    <module>api</module>
	    <module>assembly</module>
	    <module>client-common</module>
	    <module>client-http</module>
	    <module>core</module>
	    <module>core/scala-2.11</module>
	    <module>core/scala-2.12</module>
	    <!--<module>coverage</module>-->
	    <!--<module>examples</module>-->
	    <!--<module>python-api</module>-->
	    <module>repl</module>
	    <module>repl/scala-2.11</module>
	    <module>repl/scala-2.12</module>
	    <module>rsc</module>
	    <module>scala</module>
	    <module>scala-api</module>
	    <module>scala-api/scala-2.11</module>
	    <module>scala-api/scala-2.12</module>
	    <module>server</module>
	    <module>test-lib</module>
	    <!--<module>integration-test</module>-->

开始编译

# spark3.3.0
mvn clean package -B -V -e \
        -Pspark-3.3.0 \
        -Pthriftserver \
        -DskipTests \
        -DskipITs \
        -Dmaven.javadoc.skip=true


解压包

cp assembly/target/apache-livy-0.8.0-incubating-SNAPSHOT-bin.zip .
unzip apache-livy-0.8.0-incubating-SNAPSHOT-bin.zip

这里也提供上面编译好的部署包,有需要的小伙伴可以自行下载:

链接:https://pan.baidu.com/s/1pPCbe0lUJ6ji8rvQYsVw9A?pwd=qn7i
提取码:
qn7i

2)配置

  • 环境变量设置
vi /etc/profile

export LIVY_HOME=/opt/bigdata/livy-spark/incubator-livy/apache-livy-0.8.0-incubating-SNAPSHOT-bin
export PATH=$LIVY_HOME/bin:$PATH
export SPARK_HOME=/opt/bigdata/spark-3.3.0-bin-hadoop3
export PATH=$SPARK_HOME/bin:$PATH

source /etc/profile
  • 修改配置文件$LIVY_HOME/conf/livy.conf
cp $LIVY_HOME/conf/livy.conf.template  $LIVY_HOME/conf/livy.conf

cat >$LIVY_HOME/conf/livy.conf<<EOF
livy.spark.master=yarn
livy.spark.deploy-mode=cluster
livy.environment=production
livy.impersonation.enabled=true
livy.server.csrf_protection.enabled=false
livy.server.port=8998
livy.server.session.timeout=3600000
livy.server.recovery.mode=recovery
livy.server.recovery.state-store=filesystem
livy.server.recovery.state-store.url=/tmp/livy
livy.repl.enable-hive-context=true
EOF
  • 修改配置文件$LIVY_HOME/conf/livy-env.sh
cp $LIVY_HOME/conf/livy-env.sh.template  $LIVY_HOME/conf/livy-env.sh

mkdir $LIVY_HOME/logs $LIVY_HOME/pid-dir

cat >$LIVY_HOME/conf/livy-env.sh<<EOF
export JAVA_HOME=/opt/jdk1.8.0_212
export HADOOP_HOME=/opt/bigdata/hadoop/hadoop-3.3.4
export HADOOP_CONF_DIR=/opt/bigdata/hadoop/hadoop-3.3.4/etc/hadoop
export SPARK_CONF_DIR=/opt/bigdata/spark-3.3.0-bin-hadoop3/conf
export SPARK_HOME=/opt/bigdata/spark-3.3.0-bin-hadoop3
export LIVY_LOG_DIR=/opt/bigdata/livy-spark/incubator-livy/apache-livy-0.8.0-incubating-SNAPSHOT-bin/logs
export LIVY_PID_DIR=/opt/bigdata/livy-spark/incubator-livy/apache-livy-0.8.0-incubating-SNAPSHOT-bin/pid-dir
export LIVY_SERVER_JAVA_OPTS="-Xmx512m"
EOF
  • 修改配置文件$LIVY_HOME/conf/spark-blacklist.conf
cp $LIVY_HOME/conf/spark-blacklist.conf.template  $LIVY_HOME/conf/spark-blacklist.conf

cat >$LIVY_HOME/conf/spark-blacklist.conf<<EOF
spark.master
spark.submit.deployMode

# Disallow overriding the location of Spark cached jars.
spark.yarn.jar
spark.yarn.jars
spark.yarn.archive

# Don't allow users to override the RSC timeout.
livy.rsc.server.idle-timeout
EOF
  • 添加Hadoop 配置$HADOOP_HOME/etc/hadoop/core-site.xml
<property>
  <name>hadoop.proxyuser.livy.groups</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.livy.hosts</name>
  <value>*</value>
</property>

重启服务

stop-all.sh ; start-all.sh
  • HDFS 上面创建livy 的用户目录
hdfs dfs -mkdir -p /user/livy
hdfs dfs -chown livy:supergroup /user/livy

3)启动服务

sh $LIVY_HOME/bin/livy-server start
netstat -tnlp|grep 8998

访问Livy web 地址:http://local-168-182-110:8998

五、Livy API 实战操作

rest-api官方文档:https://livy.apache.org/docs/latest/rest-api.html
java-api官方文档:https://livy.apache.org/docs/latest/api/java/index.html

、概述

HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文。HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeeper 实现。HBase 良好的分布式架构设计为海量数据的快速存储、随机访问提供了可能,基于数据副本机制和分区机制可以轻松实现在线扩容、缩容和数据容灾,是大数据领域中 Key-Value 数据结构存储最常用的数据库方案。

官方文档:https://hbase.apache.org/book.html
GitHub地址:https://github.com/apache/hbase

HBase特点:

  • 易扩展:Hbase 的扩展性主要体现在两个方面,一个是基于运算能力(RegionServer) 的扩展,通过增加 RegionSever 节点的数量,提升 Hbase 上层的处理能力;另一个是基于存储能力的扩展(HDFS),通过增加 DataNode 节点数量对存储层的进行扩容,提升 HBase 的数据存储能力。
  • 海量存储:HBase 作为一个开源的分布式 Key-Value 数据库,其主要作用是面向 PB 级别数据的实时入库和快速随机访问。这主要源于上述易扩展的特点,使得 HBase 通过扩展来存储海量的数据。
  • 列式存储:Hbase 是根据列族来存储数据的。列族下面可以有非常多的列。列式存储的最大好处就是,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段时,能大大减少读取的数据量。
  • 高可靠性:WAL 机制保证了数据写入时不会因集群异常而导致写入数据丢失,Replication 机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏。而且 Hbase 底层使用 HDFS,HDFS 本身也有备份。
  • 稀疏性:在 HBase 的列族中,可以指定任意多的列,为空的列不占用存储空间,表可以设计得非常稀疏。

二、Hbase的优缺点

1)Hbase优点

  • 列的可以动态增加,并且列为空就不存储数据,节省存储空间.
  • Hbase自动切分数据,使得数据存储自动具有水平scalability.
  • Hbase可以提供高并发读写操作的支持

2)Hbase缺点

  • 不能支持条件查询,只支持按照Row key来查询.
  • 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.

三、HBase数据模型

HBase是运行在Hadoop集群上的一个数据库,与传统的数据库有严格的ACID(原子性、一致性、隔离性、持久性)要求不一样,HBase降低了这些要求从而获得更好的扩展性,它更适合存储一些非结构化和半结构化的数据。

1)逻辑模型

  • 表命名空间(Namespace):表命名空间不是强制的,当想把多个表分到一个组去统一管理的时候才会用到表命名空间;
  • 表(Table):Hbase采用表来组织数据;一个表由一个或多个列族组成。数据属性,比如超时时间(TTL)、压缩算法(COMPRESSION)等,都在列族的定义中定义。
  • 行(Row):一个行包含多个列,这些列通过列族来分类。行中数据所属列族只能只能从该表所定义的列族选择,否则会得到一个NoSuchColumnFamilyException。由于HBase是一个列式数据库,所以一个行中的数据可以分布在不同的RegionServer上。
  • 列标识(Column Qualifier):多个列组成一个行。列族和列经常用Column
  • 列族(Column Family):一个table有许多个列族,列族是列的集合,属于表结构,也是表的基本访问控制单元。
  • Column Family:Column Qualifier形式标识;
  • 时间戳(Timestamp):用来区分数据的不同版本;
  • 单元格(Cell):通过行、列族、列、时间戳可以确定一个单元格,存储的数据没有数据类型,是字节数组byte[]。

以上几个概念以及它们之间的关系可以用下图表示:

2)物理模型

实际存储方式:每个Region由多个Store构成,每个Store保存一个column family。

  • 逻辑数据模型中空白cell在物理上是不存储的,因此若一个请求为要获取t8时间的contents:html,他的结果就是空。相似的,若请求为获取t9时间的anchor:my.look.ca,结果也是空。但是,如果不指明时间,将会返回最新时间的行,每个最新的都会返回。
  • 在一个HBase中,存储了很多HBase表,当表中包含的行数量非常庞大,无法在一台机器上存储时,需要分布存储到多台机器上,需要根据行键的值对表中进行分区,每个行分区被称为“Region”
  • Master主服务器把不同的Region分配到不同的Region服务器上,同一个Region不会拆分到多个Region服务器上,每个Region服务器负责管理一个Region集合,通常每个Region服务器上会放置10~1000个Region。

四、HBase 架构与原理

1)HBase读流程

2)HBase写流程

数据flush过程

  • 当MemStore数据达到阈值(默认是128M,老版本是64M),将数据刷到硬盘,将内存中的数据删除,同时删除HLog中的历史数据;
  • 并将数据存储到HDFS中;

数据合并过程

  • 当数据块达到4块,Hmaster将数据块加载到本地,进行合并;
  • 当合并的数据超过256M,进行拆分,将拆分后的Region分配给不同的HregionServer管理;
  • 当HregionServer宕机后,将HregionServer上的hlog拆分,然后分配给不同的HregionServer加载,修改.META.;

【温馨提示】HLog会同步到HDFS。

五、环境部署(全分布模式)

HBase有三种运行模式:

  • 单机模式:只在一台计算机运行,这种模式下,HBase所有进程包括Maste、HRegionServer、和Zookeeper都在同一个JVM中运行,存储机制采用本地文件系统,没有采用分布式文件系统HDFS。
  • 伪分布模式:只在一台计算机运行,这种模式下,HBase所有进程都运行在不同一个节点,在一个节点上模拟了一个具有HBase完整功能的微型集群,存储机制采用分布式文件系统HDFS,但是HDFS的NameNode和DataNode都位于同一台计算机上。
  • 全分布模式:在多台计算机上运行,这种模式下,HBase的守护进程运行在多个节点上,形成一个真正意义上的集群,存储机制采用分布式文件系统HDFS,且HDFS的NameNode和DataNode位于不同计算机上。

1)环境准备

主机名

IP

角色

local-168-182-110

192.168.182.110

NodeManager、QuorumPeerMain、HMaster、DataNode、HRegionServer

local-168-182-111

192.168.182.111

DataNode、HRegionServer、SecondaryNameNode、NodeManager、QuorumPeerMain

local-168-182-112

192.168.182.112

NodeManager、HRegionServer、DataNode、QuorumPeerMain

2)安装JDK

官网下载:https://www.oracle.com/java/technologies/downloads/

百度云下载

链接:https://pan.baidu.com/s/1-rgW-Z-syv24vU15bmMg1w
提取码:8888

cd /opt/
tar -xf jdk-8u212-linux-x64.tar.gz

# 在文件加入环境变量/etc/profile
export JAVA_HOME=/opt/jdk1.8.0_212
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# source加载
source /etc/profile
# 查看jdk版本
java -version

3)安装ZooKeeper

也可以参考我之前的文章:分布式开源协调服务——Zookeeper

1、下载解压

下载地址:https://zookeeper.apache.org/releases.html

cd /opt/bigdata/
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz --no-check-certificate
tar -xf  apache-zookeeper-3.8.0-bin.tar.gz

2、配置环境变量

vi /etc/profile
export ZOOKEEPER_HOME=/opt/bigdata/apache-zookeeper-3.8.0-bin/
export PATH=$ZOOKEEPER_HOME/bin:$PATH

# 加载生效
source /etc/profile

3、配置

cd $ZOOKEEPER_HOME
cp conf/zoo_sample.cfg conf/zoo.cfg
mkdir $ZOOKEEPER_HOME/data
cat >conf/zoo.cfg<<EOF
# tickTime:Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。session最小有效时间为tickTime*2
tickTime=2000

# Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。不要使用/tmp目录
dataDir=/opt/bigdata/apache-zookeeper-3.8.0-bin/data

# 端口,默认就是2181
clientPort=2181

# 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量),超过此数量没有回复会断开链接
initLimit=10

# 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
syncLimit=5

# 最大客户端链接数量,0不限制,默认是0
maxClientCnxns=60

# zookeeper集群配置项,server.1,server.2,server.3是zk集群节点;hadoop-node1,hadoop-node2,hadoop-node3是主机名称;2888是主从通信端口;3888用来选举leader
server.1=local-168-182-110:2888:3888
server.2=local-168-182-111:2888:3888
server.3=local-168-182-112:2888:3888
EOF

4、配置myid

echo 1 > $ZOOKEEPER_HOME/data/myid

5、将配置推送到其它节点

scp -r $ZOOKEEPER_HOME local-168-182-111:/opt/bigdata/
scp -r $ZOOKEEPER_HOME local-168-182-112:/opt/bigdata/
# 也需要添加环境变量和修改myid,local-168-182-111的myid设置2,local-168-182-112的myid设置3

6、启动服务

cd $ZOOKEEPER_HOME
# 启动
./bin/zkServer.sh start
# 查看状态
./bin/zkServer.sh status

4)安装Hadoop

也可以参考我之前的文章:大数据Hadoop原理介绍+安装+实战操作(HDFS+YARN+MapReduce)

1、下载解压

下载地址:https://dlcdn.apache.org/hadoop/common/

mkdir -p /opt/bigdata/hadoop && cd /opt/bigdata/hadoop
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz --no-check-certificate
# 解压
tar -zvxf hadoop-3.3.4.tar.gz

2、修改配置文件

配置环境变量

vi /etc/profile
export HADOOP_HOME=/opt/bigdata/hadoop/hadoop-3.3.4
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

# 加载生效
source /etc/profile
  • 修改$HADOOP_HOME/etc/hadoop/hadoop-env.sh
# 在hadoop-env.sh文件末尾追加
export JAVA_HOME=/opt/jdk1.8.0_212
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
  • 修改$HADOOP_HOME/etc/hadoop/core-site.xml #核心模块配置
# 创建存储目录
mkdir -p /opt/bigdata/hadoop/data/hadoop-3.3.4
<!-- 在<configuration></configuration>中间添加如下内容 -->
<!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://local-168-182-110:8082</value>
</property>

<!-- 设置Hadoop本地保存数据路径 -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/bigdata/hadoop/data/hadoop-3.3.4</value>
</property>

<!-- 设置HDFS web UI用户身份 -->
<property>
  <name>hadoop.http.staticuser.user</name>
  <value>root</value>
</property>

<!-- 聚合hive 用户代理设置 -->
<property>
  <name>hadoop.proxyuser.hosts</name>
  <value>*</value>
</property>

<!-- 用户代理设置 -->
<property>
  <name>hadoop.proxyuser.root.groups</name>
  <value>*</value>
</property>

<!-- 文件系统垃圾桶保存时间 -->
<property>
  <name>fs.trash.interval</name>
  <value>1440</value>
</property>
  • 修改$HADOOP_HOME/etc/hadoop/hdfs-site.xml #hdfs文件系统模块配置
<!-- 在<configuration></configuration>中间添加如下内容 -->
<!-- 设置SNN进程运行机器位置信息 -->
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>local-168-182-111:9868</value>
</property>

<!-- 必须将dfs.webhdfs.enabled属性设置为true,否则就不能使用webhdfs的LISTSTATUS、LISTFILESTATUS等需要列出文件、文件夹状态的命令,因为这些信息都是由namenode来保存的。 -->
<property>
  <name>dfs.webhdfs.enabled</name>
  <value>true</value>
</property>

<!-- nameservice的逻辑名称。可以为任意可读字符串;如果在Federation中使用,那么还应该包含其他的nameservices,以","分割。 -->
<property>
  <name>dfs.nameservices</name>
  <value>ns1</value>
</property>
  • 修改$HADOOP_HOME/etc/hadoop/mapred.xml #MapReduce模块配置
<!-- 设置MR程序默认运行模式,yarn集群模式,local本地模式 -->
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>

<!-- MR程序历史服务地址 -->
<property>
  <name>mapreduce.jobhistory.address</name>
  <value>local-168-182-110:10020</value>
</property>

<!-- MR程序历史服务web端地址 -->
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>local-168-182-110:19888</value>
</property>

<!-- yarn环境变量 -->
<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<!-- map环境变量 -->
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<!-- reduce环境变量 -->
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
  • 修改$HADOOP_HOME/etc/hadoop/yarn-site.xml #yarn模块配置
<!-- 在<configuration></configuration>中间添加如下内容 -->
<!-- 设置YARN集群主角色运行集群位置 -->
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>local-168-182-110</value>
</property>

<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>

<!-- 是否将对容器实施物理内存限制 -->
<property>
  <name>yarn.nodemanager.pmem-check-enabled</name>
  <value>false</value>
</property>

<!-- 是否将对容器实施虚拟内存限制 -->
<property>
  <name>yarn.nodemanager.vmem-check-enabled</name>
  <value>false</value>
</property>

<!-- 开启日志聚集 -->
<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
</property>

<!-- 设置yarn历史服务器地址 -->
<property>
  <name>yarn.log.server.url</name>
  <value>http://local-168-182-110:19888/jobhistory/logs</value>
</property>

<!-- 设置yarn历史日志保存时间 7天 -->
<property>
  <name>yarn.log-aggregation.retain-seconds</name>
  <value>604880</value>
</property>
  • 修改$HADOOP_HOME/etc/hadoop/workers
    将下面内容覆盖文件,默认只有localhost
local-168-182-110
local-168-182-111
local-168-182-112

3、分发同步hadoop安装包到另外几台机器

scp -r $HADOOP_HOME local-168-182-111:/opt/bigdata/hadoop/
scp -r $HADOOP_HOME local-168-182-112:/opt/bigdata/hadoop/
# 注意也需要设置环境变量

vi /etc/profile

export HADOOP_HOME=/opt/bigdata/hadoop/hadoop-3.3.4
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

# 加载
source /etc/profile

4、Hadoop集群启停(local-168-182-110上执行)

1)(首次启动)格式化namenode(只能执行一次)

  • 首次启动HDFS时,必须对其进行格式化操作
  • format本质上初始化工作,进行HDFS清理和准备工作
hdfs namenode -format

2)手动逐个进程启停

# HDFS集群启动
hdfs --daemon [start|stop] [namenode|datanode|secondarynamenode]
# YARN集群启动
yarn --daemon [start|stop] [resourcemanager|nodemanager]

3)通过shell脚本一键启停(推荐)

在local-168-182-110上,使用软件自带的shell脚本一键启动。前提:配置好机器之间的SSH免密登录和works文件

start-dfs.sh
stop-dfs.sh #这里不执行

# YARN集群启停
start-yarn.sh
stop-yarn.sh # 这里不执行

# Hadoop集群启停(HDFS+YARN)
start-all.sh
stop-all.sh # 这里不执行

# 查看
jps

HDFS集群访问:http://local-168-182-110:9870

YARN集群访问:http://local-168-182-110:8088

5)部署HBase

1、下载解压

下载地址:http://hbase.apache.org/downloads.html

cd /opt/bigdata
wget https://dlcdn.apache.org/hbase/2.4.13/hbase-2.4.13-bin.tar.gz --no-check-certificate
# 解压
tar -xf hbase-2.4.13-bin.tar.gz
# 配置环境变量
vi /etc/profile

export HBASE_HOME=/opt/bigdata/hbase-2.4.13
export PATH=$HBASE_HOME/bin:$PATH

source /etc/profile

2、配置HBase

  • 配置$HBASE_HOME/conf/hbase-env.sh,添加或修改以下内容:
export JAVA_HOME=/opt/jdk1.8.0_212
export HBASE_CLASSPATH=/opt/bigdata/hbase-2.4.13/conf
export HBASE_MANAGES_ZK=false
  • 配置$HBASE_HOME/conf/hbase-site.xml
<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://local-168-182-110:8082/hbase</value>
        <!-- hdfs://ns1/hbase 对应hdfs-site.xml的dfs.nameservices属性值 -->
    </property>

    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>local-168-182-110,local-168-182-111,local-168-182-112</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property>

    <property>
        <name>hbase.master</name>
        <value>60000</value>
        <description>单机版需要配主机名/IP和端口,HA方式只需要配端口</description>
    </property>
    <property>
        <name>hbase.master.info.bindAddress</name>
        <value>0.0.0.0</value>
    </property>
    <property>
        <name>hbase.master.port</name>
        <value>16000</value>
    </property>
    <property>
        <name>hbase.master.info.port</name>
        <value>16010</value>
    </property>
    <property>
        <name>hbase.regionserver.port</name>
        <value>16020</value>
    </property>
    <property>
        <name>hbase.regionserver.info.port</name>
        <value>16030</value>
    </property>

    <property>
        <name>hbase.wal.provider</name>
        <value>filesystem</value> <!--也可以用multiwal-->
    </property>
</configuration>

hbase-site.xml参数说明:
1.
hbase.rootdir:这个目录是 RegionServer 的共享目录,用来持久化 HBase。特别注意的是 hbase.rootdir 里面的 HDFS 地址是要跟 Hadoop 的 core-site.xml 里面的 fs.defaultFS 的 HDFS 的 IP 地址或者域名、端口必须一致。(HA环境下,dfs.nameservices 是由zookeeper来决定的)。
2. hbase.cluster.distributed:HBase 的运行模式。为 false 表示单机模式,为 true 表示分布式模式。若为 false,HBase 和 ZooKeeper 会运行在同一个 JVM 中。
3. hbase.master:如果只设置单个 Hmaster,那么 hbase.master 属性参数需要设置为 master:60000 (主机名:60000);如果要设置多个 Hmaster,那么我们只需要提供端口 60000,因为选择真正的 master 的事情会有 zookeeper 去处理。
4. hbase.tmp.dir:本地文件系统的临时文件夹。可以修改到一个更为持久的目录上(/tmp会在重启时清除)。
5. hbase.zookeeper.quorum:对于 ZooKeeper 的配置。至少要在 hbase.zookeeper.quorum 参数中列出全部的 ZooKeeper 的主机,用逗号隔开。该属性值的默认值为 localhost,这个值显然不能用于分布式应用中。
6. hbase.zookeeper.property.dataDir:这个参数用户设置 ZooKeeper 快照的存储位置,默认值为 /tmp,显然在重启的时候会清空。因为笔者的 ZooKeeper 是独立安装的,所以这里路径是指向了$ZOOKEEPER_HOME/conf/zoo.cfg 中 dataDir 所设定的位置。
7. hbase.zookeeper.property.clientPort:客户端连接 ZooKeeper 的端口。默认是2181。
8. zookeeper.session.timeout:ZooKeeper 会话超时。Hbase 把这个值传递改 zk 集群,向它推荐一个会话的最大超时时间。
9. hbase.regionserver.restart.on.zk.expire:当 regionserver 遇到 ZooKeeper session expired, regionserver 将选择 restart 而不是 abort。

  • 配置$HBASE_HOME/conf/regionservers
local-168-182-110
local-168-182-111
local-168-182-112
  • 复制Hadoop的关键配置文件到conf目录
cp $HADOOP_HOME/etc/hadoop/core-site.xml  $HADOOP_HOME/etc/hadoop/hdfs-site.xml $HBASE_HOME/conf/

3、复制配置好的包到其它节点

scp -r $HBASE_HOME local-168-182-111:/opt/bigdata/
scp -r $HBASE_HOME local-168-182-112:/opt/bigdata/
# 注意在其它节点也配置环境变量

# 配置环境变量
vi /etc/profile

export HBASE_HOME=/opt/bigdata/hbase-2.4.13
export PATH=$HBASE_HOME/bin:$PATH

source /etc/profile

4、启动和停止HBase

【温馨提示】在其中一台启动即可,启动其它节点得hbase服务,跟hadoop启动类似

start-hbase.sh
stop-hbase.sh

5、测试

命令测试

#登入HBase(跟MySQL类似)
hbase shell


web访问:http://local-168-182-110:16010/


环境部署就到这里了,有任何疑问欢迎给我留言哦~

六、HBase与其它数据库对比

1)HBase与传统数据库对比

对比项

Hbase

传统数据库

数据类型

Hbase只有简单的数据类型,只保留字符串

传统数据库有丰富的数据类型

数据操作

Hbase只有简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系

传统数据库通常有各式各样的函数和连接操作

存储模式

Hbase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的,这样的好处是数据即是索引,访问查询涉及的列大量降低系统的I/O,并且每一列由一个线索来处理,可以实现查询的并发处理

传统数据库是基于表格结构和行存储,其没有建立索引将耗费大量的I/O并且建立索引和物化试图需要耗费大量的时间和资源

数据维护

Hbase的更新实际上是插入了新的数据

传统数据库只是替换和修改

可伸缩性

Hbase可以轻松的增加或减少硬件的数目,并且对错误的兼容性比较高

传统数据库需要增加中间层才能实现这样的功能

事务

Hbase只可以实现单行的事务性,意味着行与行之间、表与表之前不必满足事务性

传统数据库是可以实现跨行的事务性

2)HBase与ClickHouse对比

对比项

Hbase

Clickhouse

数据存储

Zookeeper保存元数据,数据写入HDFS(非结构化数据)

Zookeeper保存元数据,数据存储在本地,且会压缩

查询

不支持标准sql,需要集成Phoenix插件。Hbase自身有Scan操作,但是不建议执行,一般会全量扫描导致集群崩溃

支持sql,拥有高效的查询能力

数据读写

支持随机读写,删除。更新操作是插入一条新timestamp的数据

支持读写,但不能删除和更新

维护

需要同时维护HDFS、Zookeeper和Hbase(甚至于Phoenix)

额外维护Zookeeper

Hbase更适合非结构化的数据存储,ClickHouse拥有高效的查询能力。

关于HBase的介绍和环境部署就先到这里了,后面会分享HBase的实战操作,请小伙伴耐心等待,有疑问的小伙伴欢迎给我留言哦~