• [技术干货] 浅析MySQL模式匹配查询(标准SQL模式匹配和正则模式匹配)
    在业务开发中,经常有需要模糊匹配某个字段的需求。比如按某个名字匹配,但用户可能只记得部分字,没记住全名,如果能支持模糊匹配那用户体验就会好很多。MySQL 提供了标准SQL模式匹配以及一种基于扩展正则表达式的模式匹配,类似于 Unix 实用程序(如 vi、grep和 sed )使用的那些。SQL模式匹配SQL模式匹配使您能够用"_"匹配任何单个字符,使用"%"匹配任意数量的字符(包括零个字符)。在MySQL中,SQL模式默认不区分大小写。不要在使用SQL模式时使用=或<>,请改用LIKE或者NOT LIKE运算符。要查找以b开头的名称:复制mysql> SELECT * FROM pet WHERE name LIKE 'b%'; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+1.2.3.4.5.6.7.查找以fy结尾的名称:复制mysql> SELECT * FROM pet WHERE name LIKE '%fy'; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+1.2.3.4.5.6.7.要查找包含w的名称:复制mysql> SELECT * FROM pet WHERE name LIKE '%w%'; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+1.2.3.4.5.6.7.8.要查找恰好包含五个字符的名称,请使用模式字符"_":复制mysql> SELECT * FROM pet WHERE name LIKE '_____'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+1.2.3.4.5.6.7.正则模式匹配在通常情况下,上述功能已经可以满足大部分业务的开发需求。但偶尔也会遇到一些更复杂的查询匹配需求,可能需要正则才能满足。MySQL 提供的另一种模式匹配使用扩展的正则表达式。当您测试这种类型的模式是否匹配时,请使用REGEXP和NOT REGEXP运算符(或 RLIKE与NOT RLIKE,它们是同义词)。个人比较偏爱RLIKE、NOT RLIKE,与LIKE、NOT LIKE类似,好记。. 匹配任何单个字符。字符类 [...] 匹配括号内的任何字符。例如, [abc]匹配a、 b或c。要命名一系列字符,请使用破折号,[a-z] 匹配任何字母,而[0-9] 匹配任何数字。* 匹配它前面的事物的零个或多个实例。例如,x* 匹配任意数量的x字符、 [0-9]*匹配任意数量的数字以及.*匹配任意数量的任何内容。如果模式匹配正在测试的值中的任何位置,则正则表达式模式匹配成功。(这与LIKE模式匹配不同,LIKE模式匹配只有在模式匹配整个值时才会成功。)要锚定一个模式,使其必须匹配被测试值^的开头或$结尾,请在模式的开头或结尾使用。为了演示扩展正则表达式是如何工作的,LIKE前面显示的查询在这里用正则重写。要查找以b开头的名称,使用^匹配名称的开头:复制mysql> SELECT * FROM pet WHERE name REGEXP '^b'; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+1.2.3.4.5.6.7.要强制REGEXP比较区分大小写,请使用BINARY关键字使其中一个字符串成为二进制字符串。此查询仅匹配b名称开头的小写字母:复制SELECT * FROM pet WHERE name REGEXP BINARY '^b';1.要查找以fy结尾的名称,使用$匹配名称的结尾:复制mysql> SELECT * FROM pet WHERE name REGEXP 'fy$'; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+1.2.3.4.5.6.7.要查找包含w的名称,请使用以下查询:复制mysql> SELECT * FROM pet WHERE name REGEXP 'w'; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+1.2.3.4.5.6.7.8.因为正则表达式模式会匹配出现在值的任何位置,因此在前面的查询中,没有必要像SQL 模式那样在模式的任一侧放置通配符以使其匹配整个值。要查找恰好包含五个字符的名称,使用^、$、. 来匹配名称的开头和结尾:复制mysql> SELECT * FROM pet WHERE name REGEXP '^.....$'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+1.2.3.4.5.6.7.还可以使用{n} (“repeat-n-times”)运算符:复制mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+1.2.3.4.5.6.7.注意事项两种模式匹配区别Like匹配原则是要求模式串与整个目标字段匹配时,才返回该条记录。正则匹配则是当目标字段包含模式串时即返回该条记录。模式匹配可能无法走索引InnoDB 在模糊查询数据时使用 "%xx" 会导致索引失效,正则也类似。最好能结合其他索引字段一起查询,这样效率比较高。如果数据比较多,建议用全文索引。正则匹配注意特殊字符正则匹配功能强大,但使用时一定需要注意特殊字符的干扰,尤其是在mysql中查中括号或者小括号,一定要转义:复制mysql> SELECT REGEXP_LIKE('(', '('); ERROR 3692 (HY000): Mismatched parenthesis in regular expression. mysql> SELECT REGEXP_LIKE('(', '\\('); +-------------------------+ | REGEXP_LIKE('(', '\\(') | +-------------------------+ | 1 | +-------------------------+ mysql> SELECT REGEXP_LIKE(')', ')'); ERROR 3692 (HY000): Mismatched parenthesis in regular expression. mysql> SELECT REGEXP_LIKE(')', '\\)'); +-------------------------+ | REGEXP_LIKE(')', '\\)') | +-------------------------+ | 1 | +-------------------------+ mysql> SELECT REGEXP_LIKE('[', '['); ERROR 3696 (HY000): The regular expression contains an unclosed bracket expression. mysql> SELECT REGEXP_LIKE('[', '\\['); +-------------------------+ | REGEXP_LIKE('[', '\\[') | +-------------------------+ | 1 | +-------------------------+ mysql> SELECT REGEXP_LIKE(']', ']'); +-----------------------+ | REGEXP_LIKE(']', ']') | +-----------------------+ | 1 | +-----------------------+1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.解决办法:限制使用的字符范围,排除元字符。查询之前先转义,例如golang中,使用func QuoteMeta(s string) string复制QuoteMeta returns a string that escapes all regular expression metacharacters inside the argument text; the returned string is a regular expression matching the literal text.1.
  • [C/C++] 一起来看看auto推导规则
    🎄auto推导规则1️⃣如果auto声明的变量是按值初始化,则推导出的类型会忽略const、volatile限定符。进一步解释为,在使用auto声明变量时,既没有使用引用,也没有使用指针,那么编译器在推导的时候会忽略const和volatile限定符。当然auto本身也支持添加const、volatile限定const int i = 10; auto j = i; // auto推导类型为int auto &m = i; // auto推导类型为const int& auto *k = i; // auto推导类型为const int const auto n = j; // auto推导类型为int✨✨解释:因为在进行类型推导时忽略了const、volatile,所以i虽然我const int类型结果却是int类型 而m和k分别为引用和指针初始化,所以原本的const和volatile属性得以保留 最后,const auto结合让n的类型推导为const int2️⃣在使用auto声明变量初始化时,目标对象如果是引用&,则引用属性会被忽略:int i = 10; int &j = i; auto m = j; // auto推导类型为int✨✨解释:虽然j是i的引用,j的类型为int&但是在推导m的时候auto会直接忽略掉其中的引用推导为int类型,也就是说明对谁的引用就会直接推导成谁本身的类型3️⃣使用auto和万能引用声明变量时,对于左值会将auto推导为引用类型:int i = 10; auto&& k = i; // auto推导类型为int& auto&& j = 10; // auto推导类型为int解释: 因为i是一个左值,所以k的类型会被推导为int&,auto被推导为int&,这其中用到了引用折叠的规则。而5是一个右值,因此j的类型被推导为int&&,auto被推导为int4️⃣使用auto声明变量,如果目标对象是一个数组或者函数,则auto会被推导为对应的指针类型int i[10]; auto m = i; // auto推导类型为int* int add(int A, int A){ return A+A; } auto j = add // auto推导类型为int (__cdecl *)(int,int)解释: i[10]是数组类型,但是在推导时变为int*,m化为指针类型指向i的首地址,同样,j也退为函数指针类型5️⃣当auto关键字与列表初始化组合时直接使用列表初始化,列表中必须为单元素,否则无法编译,auto类型被推导为单元素的类型。用等号加列表初始化,列表中可以包含单个或者多个元素,auto类型被推导为**std::initializer_list**,其中T是元素类型。请注意,在列表中包含多个元素的时候,元素的类型必须相同,否则编译器会报错。auto A1 = { 10, 12 }; // x1类型为 std::initializer_list auto A2 = { 10, 12.0 }; // 编译失败,花括号中元素类型不同 auto A3{ 10, 12 }; // 编译失败,不是单个元素 auto A4 = { 13 }; // x4类型为std::initializer_list auto A5{ 13 }; // x5类型为int
  • [C/C++] 一起来看看重新定义的auto关键字
    ✨一起来看看重新定义的auto关键字🎁auto作为一个在c++98标准就已经开始存在的关键字,因为现在我们已经几乎不再去使用去声明自动变量,于是乎在c++11中我们重新对其进行定义赋予了它新的含义:🎄声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。🎈例如:auto A = 1;这里没有对A去声明类型,但是通过auto进行推导时已经将A推导为int类型的变量🎈再以字符为例:auto str="hello world";在这里同样是auto自动进行推导,推导类型为 const char*🎈再以函数返回值为例:auto add(int A,int B)->int{return A+B;}再这里add函数声明采用了函数返回类型后置的方法,在这里同样可以看出返回值A+B为int型推导出的函数类型为int型✨但是我们在使用auto时一定要注意,在进行类型推导时一定要对变量进行初始化,比如下面没有初始化就不能编译通过auto A;A=1;✨这里很明显没有进行初始化,也就导致了编译器无法推导具体类型而报错除此之外auto在进行编译推导时还有以下4点规则1️⃣当我们使用auto声明多个变量时,编译器遵循从左往右的推导规则,以最左边的表达式推断auto的具体类型:auto n=12,m=10;在上面的代码因为是以左边的表达式类型推导auto的具体类型,n=12可以推导出为int型,于是m这个时候同样也被声明成int类型,在这种情况下,要注意声明多个变量时要保证声明的变量都是相同的,比如下面的变量类型不同就编译不通过;auto n=12,m=10.0;在这种情况下由于n为int型,m为浮点型,前后不同所以报错2️⃣当使用条件表达式初始化auto声明的变量时要注意,编译器往往会初始化为表达能力更强的类型而并不是是我们想的条件表达式的返回类型,例如:auto A=true?10:12.0;在上面的代码种,虽然条件表达式的返回类型为int但是A的类型依然会被推导为double3️⃣在C++11中静态成员变量是可以用auto声明并且初始化的,不过前提是auto必须使用const限定符: 例如:struct nametype { static const auto A = 12; };一旦使用const就将导致变量的常量化,为了解决这一问题,在c++17中就已经提出了响应的解决方法,代码如下:struct nametype{ static inline auto A=12; }4️⃣无法在形参列表中使用auto声明形参void sum(auto A,auto B){ ...... }
  • [C/C++] 内联命名空间的定义和使用
    内联命名空间的定义和使用✨✨在进行大型开发过程中,我们偶尔发现会遇到函数重名或者类型同名造成的编译冲突问题。为了解决类似的问题,我们需要合理使用命名空间,于是我们可以将函数和类型纳入命名空间中,这样,因为不在同一命名空间下就不会产生函数和类型的冲突比如:namespace name1 { void foo() {} } namespace name2 { void foo() {} } using namespace name1; int main(){ stu(); name2::stu(); }✨✨在上面的例子中我们用有俩个命名空间name1、name2,在两块空间下都具有相同的函数stu()于是我们可以使用命名空间的名称去调用空间内的函数,也可以去通过using关键字去打开命名空间,但是在每次使用空间都需要打开空间就显得有些复杂了,于是在c++11中就增强了命名空间的特性;✨✨在c++11中提出了内联空间的概念,我们可以使用inline关键字将空间内的函数和类型导出在父空间中,这样内联空间内的函数就可以直接通过父空间直接调用,则样就是即使不指定子命名空间也可以使用其子命名空间内的函数和类型了例如:#include #include namespace Parent { namespace name1 { void stu() { std::cout << "命名空间1.0" << std::endl; } } inline namespace name2 { void stu() { std::cout << "命名空间2.0" << std::endl; } } } int main(){ Parent::name1::stu(); Parent::stu(); }✨✨在上面的代码中在对name2使用了inline关键字标记为内联命名空间,所以调用name1的stu函数需要明确指定所属的命名空间。而在调用name2当中的stu函数就显得十分方便了,可以直接通过父空间进行调用但是这一点好像目前看来并没有太大的作用,那么内联命名空间的作用到底是上面呢?其实内联函数命名空间的这一特性在版本的迭代方面就可以看出作用,给大家举个例子看看当我们在进行版本迭代的时候,就比如下面的这段代码#include #inculde namespace Parent { void stu() { std::cout << "版本1.0" << std::endl; } } int main(){ Parent::stu(); }✨✨在对这段代码进行的时候我们就需要对这代代码进行大量的删改操作,但是问题来了,当我们想要再次体验老版本时候就很难再找回原来的版本,那么我们就可以通过内联命名命名空间这样一个特性进行新老版本的更迭比如下面这段代码:namespace Parent { namespace name1 { void stu() { std::cout << "版本1.0" << std::endl; } } inline namespace name2 { void stu() { std::cout << "版本2.0" << std::endl; } } } int main(){ Parent::stu(); }✨✨从上面的代码中可以看出,当我们需要将版本升级到2.0时只需要在将Parent::stu()改为Parent::name2::stu()。我们就可以使用新的版本,不光如此我们也可以在同一个父空间下创建版本3.0、版本4.0、版本5.0,我们只需要创建对应的内联命名空间就好;🎃🎃值得注意的是在同一个父命名空间下只允许一个内联命名空间,不然编译时就会因为不知道使用那个内联命名空间而报错🎃🎃
  • [openEuler] Openeuler基础命令操作——文件操作
    ​Openeuler基础命令操作——文件操作一、目录及文件管理1、使用pwd回显当前用户所在的位置​2、使用ls命令ls / :查看根目录下的文件或者目录ls -l:查看当前目录下的文件或者目录详细信息ls -a:查看当前目录下的所有文件或目录​3、使用cd命令cd /:切换到系统根目录cd /ect:切换到/ect目录cd :切换到当前用户的家目录​4、使用mkdir命令mkdir test0:创建test0目录mkdir -p test1/test2/test3:递归创建多级目录tree:以树的形式查看目录​5、使用touch命令创建文件​6、使用cp命令cp -r test0//test1/:拷贝text0目录到/test1目录下,拷贝目录使用-r参数cp test1.txt:拷贝文件7、使用rm命令rm test4.txt:删除目录下的test4.txt文件rm -rf test1:选项r表示删除对象是目录,选项f表示强制rmdir /test1/test/2:表示删除一个空目录​输入y确定删除8、使用mv命令mv:进行文件覆盖 ​9、使用ln命令ln:创建文件连接软链接(symbolic link):以路径形式存在(快捷方式);删除源文件后链接失效;可以对目录进行链接;可以跨文件系统硬链接(hard link):以文件副本形式存在,不占用实际空间;删除源文件后影响;不可以对目录链接;不可以跨文件系统#不带参数情况下默认创建硬链接 ln sourcefile targetfile    #创建硬链接 ln -s sourcefile targetfile #创建软链接 二、文件查看1、使用cat、head命令cat查看命令文件,使用管道符head命令打印前5行使用tail命令查看后5行内容,不加 -n 参数默认为后10行​三、使用whereis命令whereis bash:查看bash的位置​​
  • [虚拟化] 【华为云手机】【robox】robox默认的android 版本从7.1切换9.0,原来的转码程序需要升级吗?
    【功能模块】华为鲲鹏920 Robox【操作步骤&问题现象】1、将robox 搭配的安卓7自己升级到安卓9,请问下,转码程序需要升级吗?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【问题】【鲲鹏+麒麟v10+达梦v8】使用Ambari、达梦数据库存放元数据后,启动Ambari-server报错
    1. 问题描述HUAWEI,Kunpeng 920Kylin Linux Advanced Server release V10 (Sword)达梦V8在使用Ambari安装包ambari-2.7.3.0-openEuler20.03.tar.gz后,安装配置Ambari-server报错,其中使用达梦v8替代oracle作为ambari元数据库关键步骤1:将DmJdbcDriver18.jar重命名为ojdbc7.jar,放置在/usr/share/java下ambari-server setup --jdbc-db=oracle --jdbc-driver=/usr/share/java/ojdbc7.jarchmod 644 /usr/share/java/ojdbc7.jar:关键步骤2:修改配置文件ambari.properties如下:vim /etc/ambari-server/conf/ambari.propertiesulimit.open.files=65536server.jdbc.driver.path=/usr/share/java/DmJdbcDriver18.jarjava.home=/opt/jdk8u222-b10server.jdbc.hostname=arm-ky10-23-2#server.jdbc.driver=oracle.jdbc.driver.OracleDriverserver.jdbc.driver=dm.jdbc.driver.DmDriverserver.jdbc.rca.user.name=ambariserver.jdbc.database=oracleserver.jdbc.database_name=ambari#server.jdbc.rca.url=jdbc:oracle:thin:@arm-ky10-23-2:5236/ambariserver.jdbc.rca.url=jdbc:dm://arm-ky10-23-2:5236?schema=ambaricustom.oracle.jdbc.name=DmJdbcDriver18.jarbootstrap.script=/usr/lib/ambari-server/lib/ambari_server/bootstrap.pyserver.version.file=/var/lib/ambari-server/resources/versiongpl.license.accepted=truejdk1.8.dest-file=jdk-8u112-linux-x64.tar.gzserver.task.timeout=1200#server.jdbc.rca.driver=oracle.jdbc.driver.OracleDriverserver.jdbc.rca.driver=dm.jdbc.driver.DmDriver#server.jdbc.url=jdbc:oracle:thin:@arm-ky10-23-2:5236/ambariserver.jdbc.url=jdbc:dm://arm-ky10-23-2:5236?schema=ambari执行ambari-server start后报错:INFO: An exception was caught and reported. Message: java.lang.RuntimeException: The database type could be not determined from the JDBC URL jdbc:dm://arm-ky10-23-2:5236/ambarijava.lang.RuntimeException: The database type could be not determined from the JDBC URL jdbc:dm://arm-ky10-23-2:5236/ambari at org.apache.ambari.server.configuration.Configuration.getDatabaseType(Configuration.java:4944) at org.apache.ambari.server.controller.ControllerModule.getPersistenceProperties(ControllerModule.java:224) at org.apache.ambari.server.controller.ControllerModule.buildJpaPersistModule(ControllerModule.java:418) at org.apache.ambari.server.controller.ControllerModule.configure(ControllerModule.java:343) at com.google.inject.AbstractModule.configure(AbstractModule.java:62) at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:340) at com.google.inject.spi.Elements.getElements(Elements.java:110) at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:138) at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:104) at com.google.inject.Guice.createInjector(Guice.java:99) at com.google.inject.Guice.createInjector(Guice.java:73) at com.google.inject.Guice.createInjector(Guice.java:62) at org.apache.ambari.server.controller.AmbariServer.main(AmbariServer.java:1079)Exception in thread "main" com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.IllegalStateException: Recursive load of: org.apache.ambari.server.events.publishers.STOMPUpdatePublisher.() at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2203) at com.google.common.cache.LocalCache.get(LocalCache.java:3937) at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941) at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824) at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4830) at com.google.inject.internal.FailableCache.get(FailableCache.java:48) at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:50) at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:138) at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:550) at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:887) at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:808) at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:285) at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:217) at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:893) at com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46) at com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50) at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:134) at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107) at com.google.inject.Guice.createInjector(Guice.java:99) at com.google.inject.Guice.createInjector(Guice.java:73) at com.google.inject.Guice.createInjector(Guice.java:62) at org.apache.ambari.server.controller.AmbariServer.main(AmbariServer.java:1079)
  • [大数据] [求助] Hadoop 3.3.1进行dfs write报错: Failed to place enough replicas
    鲲鹏920服务器,1台NameNode, 3台DataNode,Hadoop 3.3.1 使用官网 aarch64包 cid:link_0works配置正确,副本数设置为3.进行dfs write测试时会报如下错误(使用Hadoop 2.6不会),求解决方法: 2022-08-25 10:21:38,080 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* allocate blk_1073743798_2974, replicas=10.10.10.4:9866, 10.10.10.3:9866 for /benchmarks/TestDFSIO/io_control/in_file_test_io_1973 2022-08-25 10:21:38,082 INFO org.apache.hadoop.hdfs.StateChange: DIR* completeFile: /benchmarks/TestDFSIO/io_control/in_file_test_io_1973 is closed by DFSClient_NONMAPREDUCE_-1180995040_1 2022-08-25 10:21:38,083 INFO org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Not enough replicas was chosen. Reason: {NO_REQUIRED_STORAGE_TYPE=1} 2022-08-25 10:21:38,083 INFO org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Not enough replicas was chosen. Reason: {NO_REQUIRED_STORAGE_TYPE=1} 2022-08-25 10:21:38,083 INFO org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Not enough replicas was chosen. Reason: {NO_REQUIRED_STORAGE_TYPE=1} 2022-08-25 10:21:38,083 WARN org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Failed to place enough replicas, still in need of 1 to reach 3 (unavailableStorages=[], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}, newBlock=true) For more information, please enable DEBUG log level on org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy and org.apache.hadoop.net.NetworkTopology 2022-08-25 10:21:38,083 WARN org.apache.hadoop.hdfs.protocol.BlockStoragePolicy: Failed to place enough replicas: expected size is 1 but only 0 storage types can be selected (replication=3, selected=[], unavailable=[DISK], removed=[DISK], policy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}) 2022-08-25 10:21:38,083 WARN org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Failed to place enough replicas, still in need of 1 to reach 3 (unavailableStorages=[DISK], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}, newBlock=true) All required storage types are unavailable:  unavailableStorages=[DISK], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]} 2022-08-25 10:21:38,083 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* allocate blk_1073743799_2975, replicas=10.10.10.4:9866, 10.10.10.3:9866 for /benchmarks/TestDFSIO/io_control/in_file_test_io_1974 2022-08-25 10:21:38,085 INFO org.apache.hadoop.hdfs.StateChange: DIR* completeFile: /benchmarks/TestDFSIO/io_control/in_file_test_io_1974 is closed by DFSClient_NONMAPREDUCE_-1180995040_1
  • [openEuler] OpenEuler系统常用命令操作
    一、查看信息类(1)查看系统信息cat/etc/os-release(2)查看系统相关的资源信息1、查看cpu信息lscpu2、查看内存信息free3、查看磁盘信息fdisk -l4、查看系统资源实时信息top二、基础配置(1)、设置语言环境我们可以通过localectl修改系统的语言环境,对应的参数设置保存在/etc/locale.conf文件中。这些参数会在系统启动过程中被systemd的守护进程读取。1、显示当前语言环境localectl status2、显示当前可用语言环境localectl list-locales3、设置为简体中文语言环境,在root权限下执行,命令如下localectl set-locale LANG=zh_CN.UTF-8注意:① 要设置语言环境为其他语言类型时,在root权限下执行上面步骤③的命令,其中set-locale后面改为要设置的语言类型,取值范围可通过localectl list-locales获取,可根据实际情况修改。② 修改信息后需要重新登录或者在root权限下执行source /etc/locale.conf命令刷新配置的文件,使修改生效。(2)、设置键盘对应的参数设置保存在/etc/locale.conf文件中。这些参数,会在系统启动的早期被systemd的守护进程读取。1、显示当前键盘设置localectl status2、显示当前可用的键盘布局localectl list-keymaps3、设置键盘布局。在root权限下执行如下命令,其中map是要设置的键盘类型,取值范围可通过localectl list-keymaps获取,可根据实际情况修改此时设置的键盘布局。设置完成后,查看当前状态loalectl set-keymap maplocalectl status(3)、设置日期和时间1、使用timedatectl命令设置a、显示当前日期和时间timedatectlb、通过远程服务器进行时间同步若启用了NTP远程服务器进行系统时钟自动同步,则不能手动修改日期和时间。若需要手动修改日期或时间,则需确保已经关闭NTP系统时钟自动同步。可执行timedatectl set-ntp no命令进行关闭。开启自动远程时间同步timedatectl set-ntp yesc、修改日期进行日期修改前请确保已经关闭NTP系统时钟自动同步timedatectl set-ntp no修改当前的日期,在root权限下执行如下命令,其中 YYYY 代表年份,MM 代表月份,DD 代表某天,可根据实际情况修改:timedatectl set-time YYYY-MM-DD例如修改时间为2022年8月26日:timedatectl set-time'2022-08-26'd、修改时间修改时间前,请确保已经关闭NTP系统时钟自动同步。修改当前的时间,在root权限下执行如下命令,其中HH代表小时,MM代表分钟,SS代表秒,可根据实际情况修改:timedatectl set-time HH:MM:SS例如:timedatectl set-time 15:20:24e、修改时区显示当前可用时区timedatectl list-timezones2、使用date命令设置a、显示当前的日期和时间date默认情况下,date命令显示本地时间。要显示UTC时间,添加--utc或-u参数date --utc要自定义对应的输出信息格式,添加”format“参数date+”format“参数说明自定义date命令的输出date+”%Y-%m-%d%H:%M“b、修改时间要修改当前的时间,添加--set或者-s参数。在root权限下执行如下命令,其中 HH 代表小时,MM 代表分钟,SS 代表秒,可根据实际情况修改:date --set HH:MM:SS默认情况下,date命令设置本地时间。要设置UTC时间,添加--utc或-u参数:date --set HH:MM:SS --utcc、修改日期修改当前的日期,添加--set或者-s参数。在root权限下执行如下命令,其中 YYYY代表年份,MM 代表月份,DD 代表某天,可根据实际情况修改:date --set YYYY-MM-DD
  • [openEuler] HCE—OS基础——vim文本编辑器的使用
    步骤一:安装vimdnf install vim -y步骤二:编辑file1 文件在桌面上新建一个file1.txt文档终端输入命令:vim file1.txt1、按 i 键进入插入模式,观察屏幕左下角,应有“INSERT”(插入)字样。在这个模式下,输入字符串:hi ,friend!按esc键退出编辑模式,可以观察到下方的插入消失2、按“:”键输入wq再敲击enter进行保存退出编辑完成后会看到内容已经保存,同时生产出一个临时文件步骤三:学习常用的光标移动命令1、 运行 vimtutor 命令,该命令会打开一个临时文件输入:vimtutor file1.txt~      打开刚刚产生的临时文件2、 用末行模式命令: set number 把行号显示出来3、用j、k、h、l这4个键做光标的上下左右移动操作。4、 输入gg 回到第一行。5、输入G去到最后一行。6、 输入:99末行模式命令去到第99行。7、用$和0命令在行首和行尾之间跳动。8、对比0和^命令的细微差別,0移到第一个字符,^移到第一个非空字符。9、 用w和b命令在当前行内以词为单位左右移动。10、 用组合键ctrl-f、ctrl-b上下滚动文档。步骤四:vim的复制、剪切、粘贴、撤销、重做操作。1、 接着步骤三,仍然在vimtutor 里面;如果已经退出,请重新运行命令vimtutor。2、 输入:99末行模式命令去到第99行。3、 输入yy复制当前行,即第99行,屏幕上没有什么变化。4、 输入p把复制的内容粘贴到当前行的下面,即第100行。5、 输入u撤销上一步的粘贴操作。6、 输入5dd 删除从当前行往下的5行,删除就是剪切。7、 用命令93gg 去到第93行。8、 输入P(大写的P),把之前删除(剪切)的5行数据粘贴到当前行(第93行)的上面。9、 不停地按u键,撤销所有的改动。
  • [openEuler] openEuler-20.03-LTS-SP2的ssh安装与配置
    1、在openEuler系统下打开终端输入以下命令,检查ssh是否安装完成rpm -qa | grep ssh2、如果没有可以安装,输入以下命令进行安装:yum install openssh-clients-8.2p1-13.oe1.aarch64    //客户端 yum install openssh-server-8.2p1-13.oe1.aarch64     //服务端3、安装完成后可以通过以下命令下载缺失的包,并开始配置ssh# yum install openssh*4、ssh服务配置SSH服务端的配置文件在 /etc/ssh/sshd_config,在该文件的同目录中,还有ssh_config这个文件也是有关SSH配置的,但是该文件是属于客户端的配置文件我们对sshd_config的文件进行配置打开sshd_config配置文件内容:      1 # $OpenBSD: sshd_config,v 1.103 2022/08/22 20:41:22 tj Exp $       2        3 # This is the sshd server system-wide configuration file.  See       4 # sshd_config(5) for more information.       5        6 # This sshd was compiled with PATH=/usr/local/bin:/usr/bin:/usr/local/sb        in:/usr/sbin       7        8 # The strategy used for options in the default sshd_config shipped with       9 # OpenSSH is to specify options with their default value where      10 # possible, but leave them commented.  Uncommented options override the      11 # default value.      12       13 # If you want to change the port on a SELinux system, you have to tell      14 # SELinux about this change.      15 # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER      16 #      17 #Port 22      18 #AddressFamily any      19 #ListenAddress 0.0.0.0      20 #ListenAddress ::以上#开头的英文行,表示系统默认执行的,如果要修改建议不要删除原有文字,去掉#另写一行自己需要的配置则原默认的不再生效。5、修改配置文件firewall -cmd --permanent --add-port=端口号/tcp   添加防火墙允许政策firewall -cmd --reloadsemanage port -a -t ssh_port_t -p tcp 端口号  添加自定义端口到服务systemctl start sshd.service 启动ssh服务systemctl enable sshd.service  设置开机自动启动ssh服务6、远程登录输入指令ssh root@地址 -p 22 然后输入服务端的密码,然后成功远程登录退出ssh服务退出命令:logout
  • [问题求助] 成功安装hyper_install,但是在本地浏览器无法访问
    已经在购买的华为云服务器(操作系统:openEuler)上成功安装Hyper_tuner,而且8086端口也已经打开,但是在本地浏览器访问图中地址时无法访问
  • [交流分享] 【悦识鲲鹏系列 第55期】HPC学习平台——助力开发者技能成长
    HPC解决方案一站式学习平台,助您轻松上手,快速提升业务技能。点击访问鲲鹏社区HPC主页:cid:link_0
  • [问题求助] 作品提交入口
    求助,鲲鹏大赛作品如何提交呀
  • 【悦识鲲鹏系列 第54期】了解鲲鹏DevKit性能分析工具——全场景性能分析可视,性能瓶颈一目了然、调优尽在掌握!
    【悦识鲲鹏系列 第54期】了解鲲鹏DevKit性能分析工具——全场景性能分析可视,性能瓶颈一目了然、调优尽在掌握!了解鲲鹏DevKit性能分析工具,更多详情可参见鲲鹏文档中心