一. Phoenix的简介

1. 什么是phoenix

现有hbase的查询工具有很多如:Hive,Tez,Impala,Shark/Spark,Phoenix等。今天主要说Phoenix。phoenix是一个在hbase上面实现的基于hadoop的OLTP技术,具有低延迟、事务性、可使用sql、提供jdbc接口的特点。 而且phoenix还提供了hbase二级索引的解决方案,丰富了hbase查询的多样性,继承了hbase海量数据快速随机查询的特点。但是在生产环境中,不可以用在OLTP中。在线事务处理的环境中,需要低延迟,而Phoenix在查询HBase时,虽然做了一些优化,但延迟还是不小。所以依然是用在OLAT中,再将结果返回存储下来。

Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。

2. phoenix的架构

3. phoenix的下载

选择对应的hbase版本进行下载,我这里使用的是hbase-1.2.6版本,下载地址:http://mirror.bit.edu.cn/apache/phoenix/

  1. [admin@node21 ~]$ cd /opt/software/
  2. [admin@node21 software]$ wget http://mirror.bit.edu.cn/apache/phoenix/apache-phoenix-4.14.0-HBase-1.2/bin/apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz
  3. [admin@node21 software]$ ll
  4. -rw-rw-r-- 1 admin admin 346171547 Jun  5 06:16 apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz

4. 集群部署

节点IP  节点名称 HBase Phoniex Zookeeper Hadoop
192.168.100.21 node21  √  √
192.168.100.22 node22  √    √
192.168.100.23 node23  √    √

Hadoop集群搭建参考:    CentOS7.5搭建Hadoop2.7.6完全分布式集群

zookeeper集群搭建参考:CentOS7.5搭建Zookeeper3.4.12集群

HBase集群搭建参考:      CentOS7.5搭建HBase1.2.6HA集群

二. Phoenix服务端安装

官网安装文档参考:http://phoenix.apache.org/installation.html

1. 解压缩安装包

  1. [admin@node21 software]$ tar zxvf apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz -C /opt/module/
  2. [admin@node21 software]$ cd /opt/module/
  3. [admin@node21 module]$ mv apache-phoenix-4.14.0-HBase-1.2-bin phoenix-4.14.0-HBase-1.2
  4. [admin@node21 module]$ ll
  5. drwxr-xr-x 5 admin admin 4096 Jun 5 05:41 phoenix-4.14.0-HBase-1.2

2. 拷贝jar包到hbase/lib包

进入到phoenix的安装目录把phoenix-4.12.0-HBase-1.2-server.jar 拷贝到集群中每个节点( 主节点也要拷贝 )的 hbase 的 lib 目录下

  1. [admin@node21 module]$ cd phoenix-4.14.0-HBase-1.2/
  2. [admin@node21 phoenix-4.14.0-HBase-1.2]$ cp phoenix-4.14.0-HBase-1.2-server.jar /opt/module/hbase-1.2.6/lib/
  3. [admin@node21 phoenix-4.14.0-HBase-1.2]$ scp phoenix-4.14.0-HBase-1.2-server.jar admin@node22:/opt/module/hbase-1.2.6/lib/
  4. [admin@node21 phoenix-4.14.0-HBase-1.2]$ scp phoenix-4.14.0-HBase-1.2-server.jar admin@node23:/opt/module/hbase-1.2.6/lib/

3. 配置phoenix环境变量

  1. [admin@node21 phoenix-4.14.0-HBase-1.2]$ sudo vi /etc/profile
  2. export PHOENIX_HOME=/opt/module/phoenix-4.14.0-HBase-1.2
  3. export PATH=$PATH:$PHOENIX_HOME/bin
  4. [admin@node21 phoenix-4.14.0-HBase-1.2]$ source /etc/profile

4. 重启Hbase

  1. $ zkServer.sh start
  2. [admin@node21 ~]$ start-dfs.sh
  3. [admin@node22 ~]$ start-yarn.sh
  4. [admin@node21 ~]$ start-hbase.sh

5. 启动phoenix

启动命令:phoenix-4.14.0-HBase-1.2/bin/sqlline.py  zookeeper

  1. [admin@node21 phoenix-4.14.0-HBase-1.2]$ ./bin/sqlline.py 192.168.100.21,192.168.100.22,192.168.100.23:2181
  2. Setting property: [incremental, false]
  3. Setting property: [isolation, TRANSACTION_READ_COMMITTED]
  4. issuing: !connect jdbc:phoenix:192.168.100.21,192.168.100.22,192.168.100.23:2181 none none org.apache.phoenix.jdbc.PhoenixDriver
  5. Connecting to jdbc:phoenix:192.168.100.21,192.168.100.22,192.168.100.23:2181
  6. SLF4J: Class path contains multiple SLF4J bindings.
  7. SLF4J: Found binding in [jar:file:/opt/module/phoenix-4.14.0-HBase-1.2/phoenix-4.14.0-HBase-1.2-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
  8. SLF4J: Found binding in [jar:file:/opt/module/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
  9. SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
  10. 18/08/21 02:28:30 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
  11. Connected to: Phoenix (version 4.14)
  12. Driver: PhoenixEmbeddedDriver (version 4.14)
  13. Autocommit status: true
  14. Transaction isolation: TRANSACTION_READ_COMMITTED
  15. Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
  16. 133/133 (100%) Done
  17. Done
  18. sqlline version 1.2.0
  19. 0: jdbc:phoenix:192.168.100.21,192.168.100.22>

6. 验证phoenix

1)查看所有表

输入 !tables ,查看都有哪些表。以下显示均为Phoenix系统表,系统表中维护了用户表的元数据信息。

注意:上图中,我们使用了 sqlline.py 支持的 table 命令,该命令可以列出 HBase 中所有的表。这里需要注意 Phoenix 不支持直接显示 HBase Shell 中创建的表格。原因很简单,当在 Phoenix 创建一张表时,Phoenix 是将表进行了重组装。而对 HBase Shell 创建的表 Phoenix 并未进行加工,所以无法直接显示。如果需要将 HBase Shell 中创建的表格关联到 Phoenix 中查看,就需要在 Phoenix 中创建一个视图(View)做关联。

2)退出Phoenix

输入 !exit 命令(PS:Phoenix早期版本如(2.11版本)需输入!quilt才可退出,目前高版本已改为!exit命令)

三. Phoenix基本shell命令

提示:以下,可能有部分命令在Phoenix更高版本中已失效,改为其他命令代替,请注意。

  1. 0: jdbc:phoenix:192.168.100.21,192.168.100.22> help
  2. !all Execute the specified SQL against all the current
  3. connections
  4. !autocommit Set autocommit mode on or off
  5. !batch Start or execute a batch of statements
  6. !brief Set verbose mode off
  7. !call Execute a callable statement
  8. !close Close the current connection to the database
  9. !closeall Close all current open connections
  10. !columns List all the columns for the specified table
  11. !commit Commit the current transaction (if autocommit is off)
  12. !connect Open a new connection to the database.
  13. !dbinfo Give metadata information about the database
  14. !describe Describe a table
  15. !dropall Drop all tables in the current database
  16. !exportedkeys List all the exported keys for the specified table
  17. !go Select the current connection
  18. !help Print a summary of command usage
  19. !history Display the command history
  20. !importedkeys List all the imported keys for the specified table
  21. !indexes List all the indexes for the specified table
  22. !isolation Set the transaction isolation for this connection
  23. !list List the current connections
  24. !manual Display the SQLLine manual
  25. !metadata Obtain metadata information
  26. !nativesql Show the native SQL for the specified statement
  27. !outputformat Set the output format for displaying results
  28. (table,vertical,csv,tsv,xmlattrs,xmlelements)
  29. !primarykeys List all the primary keys for the specified table
  30. !procedures List all the procedures
  31. !properties Connect to the database specified in the properties file(s)
  32. !quit Exits the program
  33. !reconnect Reconnect to the database
  34. !record Record all output to the specified file
  35. !rehash Fetch table and column names for command completion
  36. !rollback Roll back the current transaction (if autocommit is off)
  37. !run Run a script from the specified file
  38. !save Save the current variabes and aliases
  39. !scan Scan for installed JDBC drivers
  40. !script Start saving a script to a file
  41. !set Set a sqlline variable
  42.  
  43. Variable Value Description
  44. =============== ========== ================================
  45. autoCommit true/false Enable/disable automatic
  46. transaction commit
  47. autoSave true/false Automatically save preferences
  48. color true/false Control whether color is used
  49. for display
  50. fastConnect true/false Skip building table/column list
  51. for tab-completion
  52. force true/false Continue running script even
  53. after errors
  54. headerInterval integer The interval between which
  55. headers are displayed
  56. historyFile path File in which to save command
  57. history. Default is
  58. $HOME/.sqlline/history (UNIX,
  59. Linux, Mac OS),
  60. $HOME/sqlline/history (Windows)
  61. incremental true/false Do not receive all rows from
  62. server before printing the first
  63. row. Uses fewer resources,
  64. especially for long-running
  65. queries, but column widths may
  66. be incorrect.
  67. isolation LEVEL Set transaction isolation level
  68. maxColumnWidth integer The maximum width to use when
  69. displaying columns
  70. maxHeight integer The maximum height of the
  71. terminal
  72. maxWidth integer The maximum width of the
  73. terminal
  74. numberFormat pattern Format numbers using
  75. DecimalFormat pattern
  76. outputFormat table/vertical/csv/tsv Format mode for
  77. result display
  78. propertiesFile path File from which SqlLine reads
  79. properties on startup; default is
  80. $HOME/.sqlline/sqlline.properties
  81. (UNIX, Linux, Mac OS),
  82. $HOME/sqlline/sqlline.properties
  83. (Windows)
  84. rowLimit integer Maximum number of rows returned
  85. from a query; zero means no
  86. limit
  87. showElapsedTime true/false Display execution time when
  88. verbose
  89. showHeader true/false Show column names in query
  90. results
  91. showNestedErrs true/false Display nested errors
  92. showWarnings true/false Display connection warnings
  93. silent true/false Be more silent
  94. timeout integer Query timeout in seconds; less
  95. than zero means no timeout
  96. trimScripts true/false Remove trailing spaces from
  97. lines read from script files
  98. verbose true/false Show verbose error messages and
  99. debug info
  100. !sql Execute a SQL command
  101. !tables List all the tables in the database
  102. !typeinfo Display the type map for the current connection
  103. !verbose Set verbose mode on
  104.  
  105. Comments, bug reports, and patches go to ???

四. SQuirrel客户端安装

如果您更愿意使用客户端GUI与Phoenix进行交互,请下载并安装SQuirrel。由于Phoenix是一个JDBC驱动程序,因此与此类工具的集成是无缝的。通过SQuirrel,您可以在SQL选项卡中发出SQL语句(创建表,插入数据,运行查询),并在“对象”选项卡中检查表元数据(即列表,列,主键和类型)。

1. 下载SQuirrel

官网下载地址:http://squirrel-sql.sourceforge.net/

下载完成:

2. 安装Squirrel

进入到squirrel-sql-3.8.1-standard.jar所在目录,cmd,执行如下命令:

  1. java -jar squirrel-sql-3.8.1-standard.jar

然后,除了选择安装路径,其它的可按需选择,否则一路“next”即可。

3. 配置Squirrel客户端

(1)将服务器上Phoenix安装目录下的phoenix-4.14.0-HBase-1.2-client.jar文件,下载到Windows下squirrel-sql安装目录的lib文件夹下,并点击squirrel-sql.bat启动。

(2)添加新的驱动(Drivers -> New Driver),如下图所示:

(3)在弹出的“Add Driver”窗口中,设置Driver的“Name”为:Phoenix,“Phoenix”为:jdbc:phoenix:192.168.100.21,其中,192.168.100.21为你Phoenix服务器的地址;“ClassName”为:org.apache.phoenix.jdbc.PhoenixDriver,最终结果如下图:

参数说明:
Name:phoenix(可以填写其他名称) 
ExampleURL:填写HBase集群的zookeeper集群的连接信息,这里是jdbc:phoenix:192.168.100.21:2181 
Website URL:这里不填写 
Java Class Path:选择phoenix-4.2.2-client.jar(是否选中无所谓,只要在Java Class Path里面就行) 
Class Name:org.apache.phoenix.jdbc.PhoenixDriver

设置完成后,点击OK关闭。

(4)点击“Drivers”边上的“Alias”选项卡,和第(2)步的新建驱动一样新建Alias (Aliases -> New Aliases),在弹出的窗口中,填写Name,UserName,Password,这三项可任意填写,在Driver选项的下拉列表中查找我们刚添加的Phoenix驱动,然后点击“Test”按钮测试连接,然后点击“Connect”按钮,弹出“Connection successful”表示配置成功。结果如下图:

参数说明:
Name:phoenix(可以填写其他名称) 
Driver:选择phoenix,即上一步创建的Driver 
URL:这里就是HBase集群的zookeeper的连接ip和port 
User Name:随便填写 
Password:随便填写

点击OK按钮,关闭弹出窗口。

(5)双击新建的test Alias ,然后点击“Connect”按钮,打开SQL命令行,在“SQL”选项卡下,即可编写sql命令,新建一张person表进行测试

  1. create table person (id integer not null primary key,name varchar,age integer)

插入一条数据:

  1. upsert into person values (1,'zhangsan' ,18)

查询数据:

  1. select * from person

查询结果如下图所示:

(6)到Hbase Shell下去查看我们刚刚添加的数据

可以看到我们新建的person表已经添加进去了,至此squirrel也安装并配置成功了!!

注意:通过squirrel添加的表,会自动转换为大写,由于Phoenix是区分大小写的,所以在Hbase Shell下,表名都要用大写,如:desc 'PERSON',如果用desc 'person'是会报错的。

4.关联hbase已创建的视图表

创建视图表关联hbase;
create view "person" (
pk varchar primary key,
"info"."name" varchar,
"info"."age" varchar,
"info"."birthday" varchar,
"info"."company" varchar,
"address"."contry" varchar,
"address"."province" varchar,
"address"."city" varchar
) as select * from "person";

查询表
select * from "person";

删除视图表

drop view "person";

五. Phoenix的使用

1.  命令行方式

从命令行执行SQL的终端接口现在与Phoenix捆绑在一起。要启动它,请从bin目录执行以下命令:

  1. [admin@node21 phoenix-4.14.0-HBase-1.2]$ ./bin/sqlline.py 192.168.100.21,192.168.100.22,192.168.100.23:2181

1)建表插入数据:这里演示官方案例,安装包目录下examples包下STOCK_SYMBOL.sql 内容如下:

  1. CREATE TABLE IF NOT EXISTS STOCK_SYMBOL (SYMBOL VARCHAR NOT NULL PRIMARY KEY, COMPANY VARCHAR);
  2. UPSERT INTO STOCK_SYMBOL VALUES ('CRM','SalesForce.com');
  3. SELECT * FROM STOCK_SYMBOL;

要从命令行执行SQL脚本,可以包含如下所示的SQL文件参数:

  1. [admin@node21 phoenix-4.14.0-HBase-1.2]$ sqlline.py 192.168.100.21,192.168.100.22,192.168.100.23:2181 ./examples/STOCK_SYMBOL.sql
  2. Setting property: [incremental, false]
  3. Setting property: [isolation, TRANSACTION_READ_COMMITTED]
  4. Setting property: [run, ./examples/STOCK_SYMBOL.sql]
  5. issuing: !connect jdbc:phoenix:192.168.100.21,192.168.100.22,192.168.100.23:2181 none none org.apache.phoenix.jdbc.PhoenixDriver
  6. Connecting to jdbc:phoenix:192.168.100.21,192.168.100.22,192.168.100.23:2181
  7. SLF4J: Class path contains multiple SLF4J bindings.
  8. SLF4J: Found binding in [jar:file:/opt/module/phoenix-4.14.0-HBase-1.2/phoenix-4.14.0-HBase-1.2-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
  9. SLF4J: Found binding in [jar:file:/opt/module/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
  10. SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
  11. 18/08/21 07:53:36 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
  12. Connected to: Phoenix (version 4.14)
  13. Driver: PhoenixEmbeddedDriver (version 4.14)
  14. Autocommit status: true
  15. Transaction isolation: TRANSACTION_READ_COMMITTED
  16. Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
  17. 136/136 (100%) Done
  18. Done
  19. 1/4 CREATE TABLE IF NOT EXISTS STOCK_SYMBOL (SYMBOL VARCHAR NOT NULL PRIMARY KEY, COMPANY VARCHAR);
  20. No rows affected (3.818 seconds)
  21. 2/4 UPSERT INTO STOCK_SYMBOL VALUES ('CRM','SalesForce.com');
  22. 1 row affected (0.166 seconds)
  23. 3/4 SELECT * FROM STOCK_SYMBOL;
  24. +---------+-----------------+
  25. | SYMBOL | COMPANY |
  26. +---------+-----------------+
  27. | CRM | SalesForce.com |
  28. +---------+-----------------+
  29. 1 row selected (0.184 seconds)
  30. 4/4
  31. Closing: org.apache.phoenix.jdbc.PhoenixConnection
  32. sqlline version 1.2.0

examples/STOCK_SYMBOL.csv

  1. AAPL,APPLE Inc.
  2. CRM,SALESFORCE
  3. GOOG,Google
  4. HOG,Harlet-Davidson Inc.
  5. HPQ,Hewlett Packard
  6. INTC,Intel
  7. MSFT,Microsoft
  8. WAG,Walgreens
  9. WMT,Walmart

2)导入数据:此外,您可以使用bin / psql.py加载CSV数据或执行SQL脚本。例如:

  1. [admin@node21 phoenix-4.14.0-HBase-1.2]$ ./bin/psql.py -t STOCK_SYMBOL 192.168.100.21,192.168.100.22,192.168.100.23:2181 ./examples/STOCK_SYMBOL.csv

PS:其中 -t 后面是表名, ../examples/STOCK_SYMBOL.csv是csv数据(注意数据的分隔符需要是逗号)。

3)查询数据

  1. [admin@node21 phoenix-4.14.0-HBase-1.2]$ ./bin/sqlline.py 192.168.100.21,192.168.100.22,192.168.100.23:2181
  2. 0: jdbc:phoenix:192.168.100.21,192.168.100.22> select * from STOCK_SYMBOL;

查询总条数

2. 客户端方式

SQuirrel是用来连接Phoenix的客户端,前面已做介绍。

六. Phoenix的api操作HBase

1. 参考资料链接

常见问题参考:http://phoenix.apache.org/faq.html#What_is_the_Phoenix_JDBC_URL_syntax

帮助文档参考:https://help.aliyun.com/document_detail/69105.html?spm=a2c4g.11186623.6.591.420a48cbSK2wy8

参考文档: http://phoenix.apache.org/phoenix_spark.html

2. 开发环境准备

IDEA、jdk1.8、window10、hadoop2.7.6、hbase1.2.6、phoenix4.14.0

  1、从集群拷贝以下文件:core-site.xml、hbase-site.xml、hdfs-site.xml文件放到工程src下

  2、把phoenix的phoenix-4.14.0-client.jar和phoenix-core-4.14.0.jar添加到工程classpath

  3、配置集群中各节点的hosts文件,把客户端的hostname:IP添加进去

  4、在客户端host文件中加入集群的hostname和IP  

3. 例一

  1. package com.xyg.phoenix;
  2.  
  3. import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
  4.  
  5. /**
    * Author: Mr.Deng
    * Date: 2018/8/25
    * Desc: create table, create index, insert data, select table.
    */
    public class TestPhoenixJDBC {
  6.  
  7. private static String driver = "org.apache.phoenix.jdbc.PhoenixDriver";
  8.  
  9. public static void main(String[] args) throws SQLException {
  10.  
  11. Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
    Class.forName(driver);
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    conn = DriverManager.getConnection("jdbc:phoenix:node21,node22,node23:2181");
    stmt = conn.createStatement();
    stmt.execute("drop table if exists test");
    stmt.execute("create table test (mykey integer not null primary key, mycolumn varchar)");
    stmt.execute("create index test_idx on test(mycolumn)");
    stmt.executeUpdate("upsert into test values (1,'World!')");
    stmt.executeUpdate("upsert into test values (2,'Hello')");
    stmt.executeUpdate("upsert into test values (3,'World!')");
    conn.commit();
    rs = stmt.executeQuery("select mykey from test where mycolumn='Hello'");
    while (rs.next()) {
    System.out.println(rs.getInt(1));
    }
    stmt.close();
    rs.close();
    conn.close();
  12.  
  13. }
  14.  
  15. }

Phoenix的安装使用与SQL查询HBase的更多相关文章

  1. Phoenix实现用SQL查询HBase

    博客已转移,请借一步说话,http://www.weixuehao.com/archives/111 HBase,一个NoSQL数据库,可存储大量非关系型数据. HBase,可以用HBase shel ...

  2. Phoenix(SQL On HBase)安装和使用报告

    一.为什么使用Phoenix二.安装Phoenix2.1 兼容问题?2.2 编译CDH版本的Phoenix2.3 安装Phoenix到CDH环境中三.Phoenix的使用3.1 phoenix的4种调 ...

  3. Phoenix(SQL On HBase)

    1.简介 Phoenix是一个HBase框架,可以通过SQL的方式来操作HBase. Phoenix是构建在HBase上的一个SQL层,是内嵌在HBase中的JDBC驱动,能够让用户使用标准的JDBC ...

  4. HBase的二级索引,以及phoenix的安装(需再做一次)

    一:HBase的二级索引 1.讲解 uid+ts 11111_20161126111111:查询某一uid的某一个时间段内的数据 查询某一时间段内所有用户的数据:按照时间 索引表 rowkey:ts+ ...

  5. Phoenix(sql on hbase)简单介绍

    Phoenix(sql on hbase)简单介绍 介绍: Phoenix is a SQL skin over HBase delivered as a client-embedded JDBC d ...

  6. 085 HBase的二级索引,以及phoenix的安装(需再做一次)

    一:问题由来 1.举例 有A列与B列,分别是年龄与姓名. 如果想通过年龄查询姓名. 正常的检索是通过rowkey进行检索. 根据年龄查询rowkey,然后根据rowkey进行查找姓名. 这样的效率不高 ...

  7. 安装支持elasticsearch使用sql查询插件

    一.ElasticSearch-SQL介绍 ElasticSearch-SQL(后续简称es-sql)是ElasticSearch的一个插件,提供了es 的类sql查询的相关接口.支持绝大多数的sql ...

  8. Trafodion:Transactional SQL on HBase

    Trafodion: Transactional SQL on HBase HBase上实时分布式事务处理 介绍 HBase的SQL能力一直不足.Phoenix缺乏Join能力,eBay提出的kyli ...

  9. Centos7.5安装分布式Hadoop2.6.0+Hbase+Hive(CDH5.14.2离线安装tar包)

    Tags: Hadoop Centos7.5安装分布式Hadoop2.6.0+Hbase+Hive(CDH5.14.2离线安装tar包) Centos7.5安装分布式Hadoop2.6.0+Hbase ...

随机推荐

  1. python 常用模块之os

    1.权限判断 bool: os.access('/python/test.py',os.F_OK) #是否存在 bool: os.access('/python/test.py',os.R_OK) # ...

  2. java的灵魂——反射

    前言:当我们在类加载的时候,除了把.class文件加载到内存,会把各个类存到各个类模板(class类型)对象上,相同的类只有一个类模板对象.连接:把类的二进制数据合并到JRE中 反射运行时探究和使用编 ...

  3. RabbitMQ消息队列里积压很多消息

    1.场景:上千万条消息在mq里积压了几个小时了还没解决 2.解决: 1)先修复consumer的问题,确保其恢复消费速度,然后将现有cnosumer都停掉 2)新建一个topic,partition是 ...

  4. 【重要】Nginx模块Lua-Nginx-Module学习笔记(三)Nginx + Lua + Redis 已安装成功(非openresty 方式安装)

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一. 目标 使用Redis做分布式缓存:使用lua API来访问redis缓存:使用nginx向客户端提 ...

  5. Linux命令练习.ziw

    2017年1月10日, 星期二 Linux命令练习 1.统计/usr/bin/目录下的文件个数: # ls /usr/bin | wc -l 判断 /home/goldin目录是否有文件 2.取出当前 ...

  6. ArchLinux升级后deadbeef无法正常启动的解决办法

    deadbeef是一款简约而不简单的音乐播放器, 占资源少, 支持的格式却不少. 昨天对ArchLinux进行了一次全面升级, 经历种种惊险, 终于跨越了从 glibc-2.16 到 glibc-2. ...

  7. C语言入门教程-(1)简介及搭建环境

    1.谁适合阅读本教程 本教程可以帮助大家从零开始学习C语言,对于有一定基础的人起到夯实基本功的作用.C语言容易学习,非常适合初学者入门,而且也为以后的编程打下基础.借用一句话:“要进入编程行业高手必学 ...

  8. pta 一

    7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数 ...

  9. 2019年湖南多校第一场||2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)

    第一场多校就打的这么惨,只能说自己太菜了,还需继续努力啊- 题目链接: GYM链接:https://codeforces.com/gym/101933 CSU链接:http://acm.csu.edu ...

  10. npm_一个有意思的npm包

    $ npm install yosay const yosay = require('yosay'); console.log(yosay('Hello, and welcome to my fant ...