2019-08-10 11:46:19 sailist 阅读数 143

在Python终端输出颜色和在Linux下输出颜色是一样的,这两个终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。

转义字符格式为:

\033[{mode};{fore};{back}m

其中花括号内要填写具体的数值常量,它影响的是转义字符后的所有文字,其中每个参数之间用分号隔开。

另外,每个参数都可以省略,表示承接之前的参数。例如,如果要省略back参数,只需要|033[{mode};{fore}m即可;如果要省略mode参数,则使用\033[;{fore};{back}m,以此类推。

其中mode表示显示模式(有六种),fore和back分别表示前景色和背景色(一般有8种,占据了3x和4x,但有的说还有一些颜色在9x上),具体的效果可以查看这个问题:

How to print colored text in terminal in Python?

摘自上面的问题的答案,通过运行下面的Python代码可以看到所有的效果

def print_format_table():
    """
    prints table of formatted text format options
    """
    for style in range(8):
        for fg in range(30,38):
            s1 = ''
            for bg in range(40,48):
                format = ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
            print(s1)
        print('\n')

print_format_table()

在win平台的cmd下运行会发现转义字符不起作用,是因为cmd没有实现这个转义的规范,而是需要借助win32 API,具体解释可以参考Linux终端和win32控制台文本颜色输出

在Python下的实现方式可以查看Python实现修改Windows CMD命令行输出颜色(完全解析),通过使用ctypes这个内置库来运行

最后,为了在Python下无脑兼容各个平台,我写了一个库colorprint,通过判断终端环境和平台来调用不同的输出方法,比较方便,而且目前测试效果良好,使用方式:

安装

pip install colorprint

展示示例:

from colorprint.example import printall
printall()

使用方法和print函数几乎完全一致,但添加了返回方法本身的返回值,可以通过叠加括号不断的输出:

from colorprint.printer import uprint
from colorprint.unicolor import *
uprint("FOREGROUND_GREEN\n", fore=FOREGROUND_GREEN)
uprint("BACKGROUND_WHITE\n", back=BACKGROUND_WHITE)

uprint("MODE_NORMAL\n", mode=MODE_NORMAL)\
    ("MODE_BLINK\n", mode=MODE_BLINK)\
    ("MODE_BOLD\n", mode=MODE_BOLD)\
    ("MODE_HIDE\n", mode=MODE_HIDE)\
    ("MODE_INVERT\n", mode=MODE_INVERT)\
    ("MODE_UNDERLINE\n", mode=MODE_UNDERLINE)

更多特性和后续更新可以查看项目的说明文档

2019-09-22 21:15:54 qq_43459184 阅读数 19

Hive运行方式:

  1. 命令行方式cli:控制台模式
  2. 脚本运行方式(实际生产环境中用最多)
  3. JDBC方式:hiveserver2
  4. web GUI接口 (hwi、hue等)

Hive在CLI模式中
与hdfs交互
执行执行dfs命令
例:dfs –ls /
与Linux交互
!开头
例: !pwd

Hive脚本运行方式:

hive -e “” 直接执行引号中的语句,可以写多条,用分号分隔
hive -e “” >>aaa.txt
hive -S -e “” >> aaa.txt: ” 静默模式直接执行引号中的语句,并输出到aaa中
hive -f file:执行file文件中的语句
hive -i /home/my/hive-init.sql:执行文件中的sql,不会退出命令行
hive> source file (在hive cli中运行file)

Hive 权限管理

三种授权模型:

1、Storage Based Authorization in the Metastore Server

基于存储的授权 - 可以对Metastore中的元数据进行保护,但是没有提供更加细粒度的访问控制(例如:列级别、行级别)。

2、SQL Standards Based Authorization in HiveServer2

基于SQL标准的Hive授权 - 完全兼容SQL的授权模型,推荐使用该模式。
除支持对于用户的授权认证,还支持角色role的授权认证
role可理解为是一组权限的集合,通过role为用户授权
一个用户可以具有一个或多个角色
默认包含另种角色:public、admin
限制:
启用当前认证方式之后,dfs, add, delete, compile, and reset等命令被禁用。
通过set命令设置hive configuration的方式被限制某些用户使用。(可通过修改配置文件hive-site.xml中hive.security.authorization.sqlstd.confwhitelist进行配置)
添加、删除函数以及宏的操作,仅为具有admin的用户开放。
用户自定义函数(开放支持永久的自定义函数),可通过具有admin角色的用户创建,其他用户都可以使用。
Transform功能被禁用。

配置:
在hive服务端修改配置文件hive-site.xml添加以下配置内容:

<property>
  <name>hive.security.authorization.enabled</name>
  <value>true</value>
</property>
<property>
  <name>hive.server2.enable.doAs</name>
  <value>false</value>
</property>
<property>
  <name>hive.users.in.admin.role</name>
  <value>root</value>
</property>
<property>
  <name>hive.security.authorization.manager</name>
  <value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
</property>
<property>
  <name>hive.security.authenticator.manager</name>
  <value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>
</property>

服务端启动hiveserver2;客户端通过beeline进行连接

Hive权限管理

角色的添加、删除、查看、设置:

CREATE ROLE role_name;  -- 创建角色
DROP ROLE role_name;  -- 删除角色
SET ROLE (role_name|ALL|NONE);  -- 设置角色
SHOW CURRENT ROLES;  -- 查看当前具有的角色
SHOW ROLES;  -- 查看所有存在的角色

角色的授予、移除、查看:

将角色授予某个用户、角色:

GRANT role_name [, role_name] ...
TO principal_specification [, principal_specification] ...
[ WITH ADMIN OPTION ];
principal_specification
  : USER user
  | ROLE role

移除某个用户、角色的角色:

REVOKE [ADMIN OPTION FOR] role_name [, role_name] ...
FROM principal_specification [, principal_specification] ... ;
 
principal_specification
  : USER user
  | ROLE role

查看授予某个用户、角色的角色列表

SHOW ROLE GRANT (USER|ROLE) principal_name;

查看属于某种角色的用户、角色列表

SHOW PRINCIPALS role_name;

3、Default Hive Authorization (Legacy Mode)
hive默认授权 - 设计目的仅仅只是为了防止用户产生误操作,而不是防止恶意用户访问未经授权的数据。

2016-11-29 15:03:18 iteye_9644 阅读数 216


 
 rocketmq这么复杂的东西,没有运维工具可搞不定啊。

 

哈哈,别急,官方提供了一个WEB项目,可以查看rocketmq数据和执行一些操作。

而且我自己也添加了一些功能

官网:https://github.com/rocketmq/rocketmq-console

运行修改一下namesers的地址,注意多个地址用 分号 分割



 

下面是成功页面,cluster查询broker集群的tps和出队入队情况。

topic查询生产和消费信息

connection查询生产则和消费者的连接信息。

其他的不讲了,多试试就明白了。

注意consumer这一项,可以查询消息积压,这是我们最关心的。

首先更正一个观念 对与broker是没有积压这个概念的,只有consumer有积压的概念。

 

 



 看下图可以查询consumer的消费情况,下图是查询指定consumer的页面 每个queue对应的broker的生产和消费情况。

Diff Total 是总的挤压数



 

 重点介绍我自己开发的几个功能

一 ,查询所有consumer的积压

如果想查询所有consumer的挤压情况,抱歉没有,只能自己开发。

这个功能的原理就是 通过ssh Java客户端去执行 命令 获取返回数据,在任何的broker执行都可以(如果童鞋们知道更好的实现方式 请告知)。

命令资料如下

 

 


 通过sa账号执行 sh /opt/ali-rocketmq/devenv/bin/mqadmin consumerProgress -n \"10.103.16.77:9876;10.103.16.15:9876\"  报出

()

ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! !!

解决方法

 在bin/mqadmin 脚本写入 export JAVA_HOME=/usr/local/java .

 

 

具体代码实现见附件

 

 

 二,定时查询某个topic的挤压数 ,报警功能

代码如下

/**
 * 单条consumer的定时提醒
 * @author chenchangqun
 *
 */
public class SingleNotifyTask {
    static final Logger logger = LoggerFactory.getLogger(SingleNotifyTask.class);
	private int delayMils;//延迟启动时间,单位 毫秒
	private int periodMils;//周期时间 间隔,单位 毫秒
	private 	String consumerName;
	   private INotifyInvoke notifyInvoke;//通知操作	
	@Resource(name="consumerService")
    private ConsumerService consumerService;
       private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            return new Thread(r, "MQNotifyTaskScheduledThread");
        }
    });
	public void init(){
   scheduledExecutorService.scheduleAtFixedRate(new Runnable(){
	@Override
			public void run() {
				try {
					Table table = consumerService.consumerProgress(consumerName);
					String diffCountStr = table.getExtData().get("Diff Total:");
					if (StringUtils.isBlank(diffCountStr)) {
						logger.error("diff Total is null,consumer=" + consumerName);
						return;
					}
					int diffCount = Integer.parseInt(diffCountStr);
					notifyInvoke.invoke(diffCount,consumerName);
				

				} catch (Throwable e) {
					logger.error("queryConsumerState fail, consumer=" + consumerName, e);
				}

			}
	}, delayMils, periodMils, TimeUnit.MILLISECONDS);
	}
 
	public void setDelayMils(int delayMils) {
		this.delayMils = delayMils;
	}
	public void setPeriodMils(int periodMils) {
		this.periodMils = periodMils;
	}
	public void setConsumerName(String consumerName) {
		this.consumerName = consumerName;
	}

	public void setNotifyInvoke(INotifyInvoke notifyInvoke) {
		this.notifyInvoke = notifyInvoke;
	}
	
}

 通过 定时调用rocketmq的API查询挤压数,根据实现类的逻辑执行报警

/**
 * 通知操作 interface
 * @author chenchangqun
 *
 */
public interface INotifyInvoke {

/**
 * 执行通知的具体操作
 * @param diffCount
 */
public void  invoke(int diffCount,String consumerName);
}

 

/**
 * 操作通知具体实现类
 * @author chenchangqun
 *
 */
public class NotifyInvokeImpl implements INotifyInvoke {
private int thresholdValue;//积压阀值,用作是否发出提醒
	@Override
	public void invoke(int diffCount,String  consumerName) {
		if (diffCount > thresholdValue) {
			System.out.println("single check invoke ," + consumerName
					+ "  geater thean thresholdValue ,do something,thresholdValue=" + thresholdValue);
		}
	}
	public void setThresholdValue(int thresholdValue) {
		this.thresholdValue = thresholdValue;
	}
}

 

配置如下

 

  
<bean id="singleNotifyTask" class="com.alibaba.rocketmq.common.SingleNotifyTask" init-method="init">
   <property name="consumerName" value="firstSpringConsumer"></property>
   <property name="delayMils" value="1000"></property>
   <property name="periodMils" value="3000"></property>
   <property name="notifyInvoke" ref="notifyInvoke"></property> 
   </bean>
  <!-- 具体的通知动作 -->   
<bean id="notifyInvoke" class="com.alibaba.rocketmq.common.NotifyInvokeImpl" >
   <property name="thresholdValue" value="1"></property>
   </bean>
    

 

 

附件中给出具体代码,仅供参考

 

2013-10-25 11:56:06 qinpeng100423 阅读数 4343
(1)
linux下的批处理文件,基本就是shell脚本文件。
1.一个最简单的脚本书写方法为:
新建一个文件,名字为clean(自己定义的名字),在里面编写
rm -fv *.o;ls -al;
(可以写一些shell普通命令,命令用分号隔开)
 
2.执行方法
(1)在控制台输入:


   sh clean


(2)先给与脚本可执行权限:
  chmod 777 clean
  然后直接执行:
  ./clean
 
其他功能以后陆续添加。。。。
 
(2)
linux下的批处理文件,基本就是shell脚本文件。
一个最简单的脚本书写方法为:
1、新建一个文件,名字为test(自己定义的名字)
nano test.sh
2、在里面编写脚本
            程序必须以下面的行开始(必须方在文件的第一行): 
            #!/bin/sh 
              符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。 
(能写一些shell普通命令,命令用分号隔开)
例子:
#! /bin/bash
# shutdown pc
sudo shutdown +1


3.执行方法
(1)在控制台输入命令执行:
   sh test.sh


(2)先给脚本可执行权限,双击执行:
右键此文件,选择属性->权限,最下方会有一个“允许以程序执行文件”,将这一项勾选,就可以了。
或在命令行下附予权限:
        chmod 777 test.sh
或: chmod +x test.sh
2015-09-16 09:39:00 ljl_xyf 阅读数 35
linux下的批处理文件,基本就是shell脚本文件。

 

1.一个最简单的脚本书写方法为:

 

新建一个文件,名字为clean(自己定义的名字),在里面编写

 

rm -fv *.o;ls -al;

 

(可以写一些shell普通命令,命令用分号隔开)

 

 

 

2.执行方法

 

(1)在控制台输入:

 

   sh clean

 

(2)先给与脚本可执行权限:

 

  chmod 777 clean

 

  然后直接执行:

 

  ./clean

 

 

 

其他功能以后陆续添加。。。。

 

 

 

(2)

linux下的批处理文件,基本就是shell脚本文件。
一个最简单的脚本书写方法为:
1、新建一个文件,名字为test(自己定义的名字)
nano test.sh
2、在里面编写脚本
            程序必须以下面的行开始(必须方在文件的第一行):
            #!/bin/sh
              符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
(能写一些shell普通命令,命令用分号隔开)
例子:
#! /bin/bash
# shutdown pc
sudo shutdown +1

3.执行方法
(1)在控制台输入命令执行:
   sh test.sh

(2)先给脚本可执行权限,双击执行:
右键此文件,选择属性->权限,最下方会有一个“允许以程序执行文件”,将这一项勾选,就可以了。
或在命令行下附予权限:
        chmod 777 test.sh
或: chmod +x test.sh

没有更多推荐了,返回首页