使用hive3.x 问题记录

使用 hive3.1.2 问题记录

搭建步骤省略 ...

一、HIVE ON MR

1、第二次以上插入值 insert into table tablename values("xx"); 出现错误:

1)、metastore.RetryingMetaStoreClient: MetaStoreClient lost connection. Attempting to reconnect (1 of 1) after 1s. setPartitionColumnStatistics
org.apache.thrift.transport.TTransportException: null

解决:当hiveserver2和 metastore 服务在一个机器会出现这种错误 分两台机器起就会报2错误 这才是本质

2)、 Error occurred during processing of message.
java.lang.ClassCastException: org.apache.hadoop.hive.metastore.api.StringColumnStatsData cannot be cast to org.apache.hadoop.hive.metastore.columnstats.cache.StringColumnStatsDataInspector

解释一:网上搜索是一种Bug
https://issues.apache.org/jira/browse/HIVE-20151
https://issues.apache.org/jira/browse/HIVE-19316
解释二:
列状态为True会触发这种问题
表的列状态为True
临时解决:
1、建表之前设置set hive.stats.autogather=false;
2、或者建表之后 执行load data inpath “/xxx.txt” into table tal_name;
1、2 方法 可以去掉表的列状态为True的情况 即可重复执行INSERT INTO tb_name values

一、HIVE ON TEZ

说明:使用的是hive3.1.2 + tez0.9.2

1、 错误信息
java.lang.NoSuchMethodError:
com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

网上有人说将hadoop /share/hadoop/common/lib/guava-27.0-jre.jar
路径下的jar替换 tez/lib下的低版本guava jar就可以
我试了还是报这种错误
于是我将tez升级到0.10版本解决这个问题

2、执行卡住 是申请的资源不足导致
没有进度一直为0
通过设置set hive.tez.container.size=512解决

<property>
<name>hive.tez.container.size</name>
<value>-1</value>
<description>By default Tez will spawn containers of the size of a mapper. This can be used to overwrite.</description>   </property>

其他影响参数可以尝试设置解决 set hive.tez.java.opts=-Xmx1640m; set
tez.runtime.io.sort.mb=820; set
tez.runtime.unordered.output.buffer.size-mb=205;

其余相关配置参考如下:
yarn-site配置

   <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>

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

    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop1</value>
    </property>
    <!-- 是否开启聚合日志 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
      <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>8192</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</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.nodemanager.resource.cpu-vcores</name>
        <value>8</value>
    </property>


    <!-- 聚合日志在hdfs上的url -->
    <property>
        <name>yarn.log.server.url</name>
        <value>http://hadoop1:19888/jobhistory/logs</value>
    </property>

    <!-- 参数说明:聚合后的日志在HDFS上保存多长时间,单位为s。-->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>

    <property>
       <name>yarn.resourcemanager.webapp.address.rm1</name>
       <value>hadoop0:8088</value>
    </property>

    <property>
       <name>yarn.resourcemanager.webapp.address.rm2</name>
       <value>hadoop1:8088</value>
    </property>

    <!--启用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <!--声明两台resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop0</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop1</value>
    </property>

    <!--指定zookeeper集群的地址-->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop0:2181,hadoop1:2181,hadoop2:2181</value>
    </property>

    <!--启用自动恢复-->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>

    <!--指定resourcemanager的状态信息存储在zookeeper集群-->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
</configuration>

tez-site配置

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
        <name>tez.lib.uris</name>
    <value>${fs.defaultFS}/tez/tez.tar.gz</value>
</property>
<property>
     <name>tez.use.cluster.hadoop-libs</name>
     <value>false</value>
</property>
<property>
     <name>tez.history.logging.service.class</name>
     <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value>
</property>

<property>
     <name>tez.am.resource.memory.mb</name>
     <value>1024</value>
</property>

<property>
     <name>tez.am.resource.cpu.vcores</name>
     <value>1</value>
</property>
<property>
     <name>tez.task.resource.memory.mb</name>
     <value>1024</value>
</property>
</configuration>

hive-site配置

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
        <name>hive.metastore.uris</name>
        <value>thrift://192.168.187.192:9083</value>
    </property>
   <property>
       <name>hive.execution.engine</name>
      <value>tez</value>
  </property>
  <property>
      <name>hive.tez.container.size</name>
      <value>1024</value>  
   </property>
</configuration>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
RDD:弹性分布式数据集(ResilientDistributed Dataset),是Spark对数据的核心抽象。RDD其实是分布式的元素集合。当Spark对数据操作和转换时,会自动将RDD中的数据分发到集群,并将操作并行化执行。 Spark中的RDD是一个不可变的分布式对象集合。每个RDD都倍分为多个分区,这些分区运行在集群中的不同节点。RDD可以包含Python、Java、Scala中任意类型的对象,甚至可以包含用户自定义对象,本文主要通过Java实现相关示例。 Spark程序或shell会话工作流程 1. 从外部数据创建出输入RDD; 2. 使用诸如filter()等这样的转化操作对RDD进行转化,以定义新的RDD; 3. 告诉Spark对需要被重用的中间结果RDD执行persist()操作; 4. 使用诸如first()等这样的行动操作来触发一次并行计算,Spark会对计算进行优化后再执行。 一. 创建RDD Spark提供了两种创建RDD方式: 1. 读取外部数据集,如文件,hive数据库等; 2. 在驱动器程序中对一个集合进行并行化,如list,set等。 方法1是常用方法,其从外部存储中读取数据来创建RDD,如读取文件 方法1创建RDD 方法2其实使用较少,毕竟它需要把整个数据集先放在一台机器的内存中。实现也简单,就是把程序中一个已有集合传给SparkContext的parallelize()方法。二.RDD操作 方法2创建RDD 二. RDD操作 1. RDD支持两种操作: (1) 转化操作,RDD的转化操作是返回一个新的RDD的操作,比如map()和filter。 (2) 行动操作,RDD的行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作,会触发实际的计算,比如count()和first()。 惰性求值:RDD的转化操作是惰性求值的,即在被调用行动操作之前Spark不会开始计算,相反,Spark会在内部记录下索要求执行的操作的相关信息。例如,当我们调用jsc.textFile()时,数据并没有读取进来,而是在必要时才会读取。Spark使用惰性求值,就可以把一些操作合并到一起来减少计算数据的步骤。 2. RDD的基本转化操作 函数名 目的 示例 结果 map() 将函数应用于RDD的每一元素, 将返回值构成新的RDD rdd.map(x=>x+1) {2,3,4,4} flatMap() 将函数应用于RDD的每一元素, 将返回的迭代器的所有内容构成新的RDD. 通常用于切分单词 rdd.flatMap(x=>x.to(3)) {1,2,3,2,3,3,3} filter() 返回一个由通过传给filter()的函数 的元素组成的RDD rdd.filter(x=>x!=1) {2,3,3} distinct() 去重 rdd.distinct() {1,2,3) sample(withReplacement, fraction,[seed]) 对RDD采用,以及是否替换 rdd.sample(false,0.5) 非确定的 对一个数据为{1,2,3,3}的RDD进行基本的RDD转化操作 函数名 目的 示例 结果 union() 生成一个包含两个RDD 中所有元素的RDD rdd.union(other) {1, 2, 3, 3, 4, 5} intersection() 求两个RDD 共同的元素的RDD rdd.intersection(other) {3} subtract() 移除一个RDD 中的内容(例如移除训练数据) rdd.subtract(other) {1, 2} cartesian() 与另一个RDD 的笛卡儿积 rdd.cartesian(other) {(1, 3), (1, 4), ...(3, 5)} 对数据分别为{1, 2,3}和{3, 4, 5}的RDD进行针对两个RDD的转化操作 3. RDD的基本执行操作 函数名 目的 示例 结果 collect() 返回RDD 中的所有元素 rdd.collect() {1, 2, 3, 3} count() RDD 中的元素个数 rdd.count() 4 countByValue() 各元素在RDD 中出现的次数 rdd.countByValue() {(1, 1),(2, 1),(3, 2)} take(num) 从RDD 中返回num 个元素 rdd.take(2) {1, 2} top(num) 从RDD 中返回最前面的num个元素 rdd.top(2) {3, 3} takeOrdered(num) (ordering) 从RDD 中按照提供的顺序返回最前面的num 个元素 rdd.takeOrdered(2)(myOrdering) {3, 3} takeSample(withReplacement, num, [seed]) 从RDD 中返回任意一些元素 rdd.takeSample(false, 1) 非确定的 reduce(func) 并行整合RDD 中所有数据(例如sum) rdd.reduce((x, y) => x + y) 9 fold(zero)(func) 和reduce() 一样, 但是需要提供初始值 注意:不重复元素加初始值,重复元素只加一个 rdd.fold(0)((x, y) => x + y) 9 aggregate(zeroValue) (seqOp, combOp) 和reduce() 相似, 但是通常返回不同类型的函数 注意:不重复元素加初始值,重复元素只加一个 rdd.aggregate((0, 0))((x, y) => (x._1 + y, x._2 + 1),(x, y) => (x._1 + y._1, x._2 + y._2)) (9,4) foreach(func) 对RDD 中的每个元素使用给定的函数 rdd.foreach(func) 无 对一个数据为{1, 2,3, 3}的RDD进行基本的RDD行动操作 4. 标准Java函数接口 在Java中,函数需要作为实现了Spark的org.apache,spark.api.java.function包中的任一函数接口的对象传递。 函数名 实现的方法 用途 Function<T, R> R call(T) 接收一个输入值并返回一个输出值,用于类似map() 和filter() 等操作中 Function2<T1, T2, R> R call(T1, T2) 接收两个输入值并返回一个输出值,用于类似aggregate()和fold() 等操作中 FlatMapFunction<T, R> Iterable<R> call(T) 接收一个输入值并返回任意个输出,用于类似flatMap()这样的操作中 标准Java函数接口 5. Java中针对专门类型的函数接口 函数名 等价函数 用途 DoubleFlatMapFunction<T> Function<T, Iterable<Double>> 用于flatMapToDouble,以生成DoubleRDD DoubleFunction<T> Function<T, Double> 用于mapToDouble,以生成DoubleRDD PairFlatMapFunction<T, K, V> Function<T, Iterable<Tuple2<K, V>>> 用于flatMapToPair,以生成PairRDD<K, V> PairFunction<T, K, V> Function<T, Tuple2<K, V>> 用于mapToPair, 以生成PairRDD<K, V> Java中针对专门类型的函数接口 三. 示例 本节将通过示例的方式验证第二节中相关的转化操作和行动操作。 转化和行动计算结果 代码地址: 参考文献: 王道远 《Spark 快速大数据分析》
Hive 的调度 Shell 脚本一般用于定时执行 Hive 命令或脚本。以下是一个简单的调度脚本示例: ``` #!/bin/bash # 设置环境变量 export HADOOP_HOME=/usr/local/hadoop export HIVE_HOME=/usr/local/hive # 定义 Hive 命令或脚本 HIVE_CMD="hive -f /path/to/hive/script.hql" # 执行 Hive 命令或脚本 $HIVE_CMD ``` 在上面的示例中,脚本首先设置了 Hadoop 和 Hive 的环境变量,然后定义了要执行的 Hive 命令或脚本。最后,使用 `$HIVE_CMD` 执行 Hive 命令或脚本。 你可以根据实际情况修改脚本中的路径和命令,以满足自己的需求。另外,你还可以使用 crontab 或其他调度工具来定期执行该脚本。Hive的调度可以使用shell脚本来实现。一般来说,Hive调度的shell脚本包括以下几个部分: 1. 环境变量设置:需要设置Hadoop和Hive的环境变量,以便在脚本中调用Hadoop和Hive命令。 2. 脚本参数设置:需要设置脚本的一些参数,比如日期、时间等信息,以便在执行任务时使用。 3. Hive任务脚本编写:需要编写Hive任务的脚本,包括Hive语句和参数设置。 4. 任务调度设置:需要使用Linux中的crontab等工具设置任务的调度时间,以便定时执行任务。 例如,以下是一个简单的Hive调度脚本示例: ``` #!/bin/bash export HADOOP_HOME=/usr/local/hadoop export HIVE_HOME=/usr/local/hive export PATH=$PATH:$HADOOP_HOME/bin:$HIVE_HOME/bin # 设置脚本参数 YEAR=`date +%Y` MONTH=`date +%m` DAY=`date +%d` HOUR=`date +%H` MINUTE=`date +%M` # 编写Hive任务脚本 HQL="SELECT count(*) FROM my_table WHERE year='$YEAR' AND month='$MONTH' AND day='$DAY';" # 执行Hive任务 $HIVE_HOME/bin/hive -e "$HQL" # 设置任务调度 # 每天的9点和21点执行任务 0 9,21 * * * /path/to/hive_script.sh >> /path/to/hive_script.log ``` 这个脚本设置了Hadoop和Hive的环境变量,并设置了脚本的参数。然后,它编写了一个Hive任务脚本,查询一个名为`my_table`的表,并统计当天的数据条数。最后,它使用Linux中的crontab工具设置了任务的调度时间,每天的9点和21点执行任务,并将执行结果输出到日志文件中。Hive的调度可以使用shell脚本实现。下面是一个示例脚本,可以通过修改其中的参数来适应不同的需求: ```bash #!/bin/bash # 设置Hive客户端路径 export HIVE_HOME=/path/to/hive export PATH=$PATH:$HIVE_HOME/bin # 设置Hadoop客户端路径 export HADOOP_HOME=/path/to/hadoop export PATH=$PATH:$HADOOP_HOME/bin # 设置日志文件路径 export LOGFILE=/path/to/logfile.log # 执行Hive脚本 hive -f /path/to/hive/script.hql >> $LOGFILE 2>&1 # 检查Hive执行结果并发送邮件 if [ $? -eq 0 ]; then echo "Hive job completed successfully." | mail -s "Hive Job Success" [email protected] else echo "Hive job failed. Check the log file for more information." | mail -s "Hive Job Failure" [email protected] fi ``` 这个示例脚本中,首先设置了Hive和Hadoop客户端路径,以便能够正确执行Hive脚本。然后定义了日志文件路径,指定Hive执行输出的日志信息将会写入到这个文件中。 接下来,执行Hive脚本,并将输出重定向到日志文件中。如果Hive脚本执行成功,脚本会发送一封邮件通知用户;如果执行失败,则会在邮件中包含错误信息。 在实际使用中,你需要根据具体需求修改这个示例脚本中的路径、日志文件名和邮件地址等参数。Hive的调度可以使用shell脚本来完成。下面是一个简单的示例,假设你要每天晚上10点执行一个Hive查询: ``` #!/bin/bash HIVE_QUERY="SELECT COUNT(*) FROM mytable WHERE date = date_sub(CURRENT_DATE(), 1)" HIVE_OUTPUT="/path/to/output" HIVE_LOG="/path/to/log" HIVE_DB="mydatabase" HIVE_TABLE="mytable" # Run the Hive query hive -e "$HIVE_QUERY" 1>"$HIVE_OUTPUT" 2>"$HIVE_LOG" # Check the exit code of the Hive query if [ $? -eq 0 ] then # If the query was successful, update the partition PARTITION=$(date +%Y-%m-%d -d "yesterday") hive -e "ALTER TABLE $HIVE_DB.$HIVE_TABLE ADD IF NOT EXISTS PARTITION (date='$PARTITION')" fi ``` 这个脚本将执行一个Hive查询,将结果输出到指定的输出文件中,并将日志输出到指定的日志文件中。如果查询成功,则会更新分区。你可以使用cron等工具来调度此脚本,以便在每天晚上10点自动运行。Hive调度脚本一般包含以下几个步骤: 1. 设置环境变量 为了能够正常运行Hive命令,需要设置Hive的环境变量。可以通过以下命令设置: ``` export HIVE_HOME=/path/to/hive export PATH=$HIVE_HOME/bin:$PATH ``` 2. 定义变量 为了能够方便地修改参数,可以定义一些变量。例如: ``` export INPUT_DIR=/path/to/input export OUTPUT_DIR=/path/to/output ``` 3. 执行Hive命令 使用Hive命令执行具体的任务。例如: ``` hive -e "SELECT * FROM table_name" > $OUTPUT_DIR/output.txt ``` 4. 保存脚本 将以上内容保存为一个Shell脚本文件,例如`myscript.sh`,并赋予执行权限: ``` chmod +x myscript.sh ``` 5. 定时执行 使用Linux的crontab命令可以定时执行脚本。例如,每天凌晨1点执行: ``` 0 1 * * * /path/to/myscript.sh ``` 以上是一个简单的Hive调度脚本的示例,具体的脚本内容需要根据实际需求进行修改。Hive调度的shell脚本通常需要完成以下几个任务: 1. 创建Hive表:在脚本中使用HiveQL语句创建所需的表格。 2. 加载数据:通过HiveQL语句将数据加载到相应的表格中。 3. 执行Hive查询:使用HiveQL语句执行需要的查询操作。 4. 将结果导出:将查询结果导出到指定的文件或目录中。 以下是一个简单的Hive调度脚本示例: ``` #!/bin/bash # 定义Hive数据库和表格名 DATABASE=my_db TABLE=my_table # 创建Hive表格 hive -e "CREATE DATABASE IF NOT EXISTS $DATABASE; USE $DATABASE; CREATE TABLE IF NOT EXISTS $TABLE ( id INT, name STRING, age INT );" # 加载数据 hive -e "USE $DATABASE; LOAD DATA INPATH '/path/to/data' INTO TABLE $TABLE;" # 执行Hive查询 hive -e "USE $DATABASE; SELECT name, age FROM $TABLE WHERE age > 18;" # 导出结果到文件 hive -e "USE $DATABASE; INSERT OVERWRITE DIRECTORY '/path/to/output' SELECT name, age FROM $TABLE WHERE age > 18;" ``` 这个示例脚本假设已经有了一个名为`my_db`的Hive数据库,并且在其中创建了一个名为`my_table`的表格。脚本首先使用HiveQL语句创建表格,然后将数据加载到表格中。接下来,脚本执行一条查询语句,从表格中选出年龄大于18岁的人名和年龄。最后,脚本将查询结果导出到`/path/to/output`目录中。Hive的调度Shell脚本主要用于自动化地执行Hive任务。以下是一个简单的Hive调度Shell脚本示例: ``` #!/bin/bash LOGFILE=/path/to/logfile/hive.log echo "Hive script started at $(date)" >> $LOGFILE hive -f /path/to/hive/script.hql >> $LOGFILE 2>&1 echo "Hive script finished at $(date)" >> $LOGFILE ``` 在这个示例中,脚本首先定义了一个LOGFILE变量来存储日志文件的路径和名称。然后它使用“echo”命令将当前时间戳写入日志文件。接下来,它调用“hive”命令并指定Hive脚本的路径和名称(/path/to/hive/script.hql)。输出将被重定向到日志文件,并且任何错误消息也将被记录在日志文件中。最后,脚本再次使用“echo”命令将当前时间戳写入日志文件。 您可以根据您的具体需求修改该示例脚本,例如添加错误处理、更改日志文件位置或使用Cron等工具自动化调度。 我可以提供一些关于Hive调度shell脚本的基本信息,但是更多的信息可以在Hive官方文档中找到。Hive的调度Shell脚本通常包括以下步骤: 1. 设置环境变量:脚本需要设置Hive的环境变量,例如HIVE_HOME和HADOOP_HOME。 2. 定义变量:脚本需要定义一些变量,例如输入文件路径、输出文件路径、Hive脚本路径等。 3. 执行Hive脚本:使用hive命令执行Hive脚本,例如: ``` $HIVE_HOME/bin/hive -f $HIVE_SCRIPT_PATH ``` 其中,$HIVE_SCRIPT_PATH是Hive脚本的路径。 4. 日志记录:在执行Hive脚本的过程中,脚本需要记录日志以便于查看执行结果和调试。 5. 错误处理:如果Hive脚本执行失败,脚本需要进行错误处理,例如发送邮件或者执行其他操作。 6. 定时调度:最后,脚本需要设置定时调度,例如使用crontab命令将脚本设置为每天定时执行。 以上是Hive的调度Shell脚本的一般步骤,具体实现方式根据实际情况可能会有所不同。Hive的调度Shell脚本可以通过以下步骤实现: 1. 创建一个文本文件,可以使用任何文本编辑器编写,如vi或nano。 2. 在文件中编写Hive查询语句。 3. 在文件开头添加 #!/bin/bash,表示这是一个bash脚本。 4. 使用crontab或其他调度工具将脚本定期运行。例如,如果您想在每天早上6点运行脚本,可以将以下内容添加到crontab中: 0 6 * * * /path/to/your/script.sh 这将在每天早上6点运行名为script.sh的脚本文件。 5. 最后,将文件保存并授予执行权限: chmod +x /path/to/your/script.sh 然后就可以通过运行./script.sh来执行脚本了。 希望这些步骤可以帮助您编写和运行Hive的调度Shell脚本。Hive是一种基于Hadoop的数据仓库工具,可以用于大规模数据处理和分析。Hive调度脚本通常用于自动化调度Hive任务的执行,以便在指定的时间自动运行这些任务。 以下是一个简单的Hive调度shell脚本示例: ``` #!/bin/bash # 设置Hive和Hadoop的环境变量 export HADOOP_HOME=/usr/local/hadoop export HIVE_HOME=/usr/local/hive # 设置执行日期 today=$(date +%Y-%m-%d) # 运行Hive查询 $HIVE_HOME/bin/hive -e "SELECT COUNT(*) FROM mytable WHERE date='$today';" ``` 这个脚本中,首先设置了Hadoop和Hive的环境变量,然后定义了当前的执行日期。接着,使用`hive -e`命令运行了一个Hive查询,查询了名为`mytable`的表在当天的记录数。 您可以根据自己的需求来修改和扩展这个示例脚本,例如添加更多的Hive查询、调整执行时间等。 我不太了解hive的调度shell脚本,但是我可以尝试给你提供一些帮助。Hive是一个基于Hadoop的数据仓库工具,用于处理大规模数据。在使用Hive时,可以编写调度脚本来自动化处理任务。下面是一个Hive调度脚本的示例: ``` #!/bin/bash # 设置环境变量 export HADOOP_HOME=/usr/local/hadoop export HIVE_HOME=/usr/local/hive # 定义变量 DATABASE_NAME=mydb TABLE_NAME=mytable QUERY="SELECT * FROM $TABLE_NAME" # 运行Hive查询 $HIVE_HOME/bin/hive -e "$QUERY" # 将查询结果导出到文件 $HIVE_HOME/bin/hive -e "USE $DATABASE_NAME; INSERT OVERWRITE LOCAL DIRECTORY '/tmp/result' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT * FROM $TABLE_NAME;" # 发送邮件 echo "查询结果见附件" | mutt -a /tmp/result -s "Hive查询结果" -- [email protected] ``` 以上脚本包含以下步骤: 1. 设置环境变量,包括Hadoop和Hive的安装路径。 2. 定义要处理的数据库和表名以及查询语句。 3. 运行Hive查询并将结果导出到本地目录。 4. 发送包含查询结果的邮件。 可以根据实际需求修改脚本中的参数和步骤。Hive的调度Shell脚本可以使用crontab来实现定时任务。下面是一个示例脚本: ```shell #!/bin/bash # 设置Hadoop和Hive环境变量 export HADOOP_HOME=/path/to/hadoop export HIVE_HOME=/path/to/hive # 运行Hive脚本 $HIVE_HOME/bin/hive -f /path/to/hive_script.hql ``` 在此基础上,可以通过crontab来定时运行脚本。例如,如果要在每天凌晨2点运行脚本,可以使用以下命令来编辑crontab: ```shell crontab -e ``` 然后在打开的编辑器中添加以下行: ```shell 0 2 * * * /path/to/hive_scheduler.sh ``` 保存并退出编辑器后,crontab将在每天凌晨2点运行Hive脚本。Hive的调度可以通过编写shell脚本来实现。下面是一个示例脚本,可以根据实际需求进行修改: ``` #!/bin/bash # 设置Hive执行环境 export HADOOP_USER_NAME=hdfs export HIVE_CONF_DIR=/path/to/hive/conf # 执行Hive脚本 hive -f /path/to/hive/script.hql ``` 在这个脚本中,首先通过export命令设置了Hive执行所需的环境变量。然后通过hive命令执行了指定的Hive脚本,该脚本的路径可以根据实际情况进行修改。 此外,还可以通过其他方式来实现Hive调度,例如使用Apache Oozie等调度工具,或者使用cron等定时任务工具来执行脚本。 我可以为您提供一些有关Hive调度shell脚本的建议,例如,您可以使用Hive调度功能来在指定的时间自动执行特定的任务,例如查询或计算等等。 首先,您需要执行hive的调度shell脚本。可以使用以下命令:hive -f <nameOfScript>.sh。这将调用您提供的shell脚本,开始调度hive作业。Hive的调度可以通过编写Shell脚本实现。以下是一个简单的Hive调度Shell脚本的示例: ``` #!/bin/bash # 设置Hive执行路径和Hive脚本路径 HIVE_BIN=/usr/local/hive/bin/hive HIVE_SCRIPT=/path/to/hive/script.hql # 执行Hive脚本 $HIVE_BIN -f $HIVE_SCRIPT # 检查Hive脚本执行状态并打印日志 if [ $? -eq 0 ]; then echo "Hive脚本执行成功" else echo "Hive脚本执行失败" fi ``` 在脚本中,首先需要设置Hive的执行路径和要执行的Hive脚本路径。然后,使用Hive执行命令`$HIVE_BIN -f $HIVE_SCRIPT`来运行Hive脚本。最后,使用if语句检查Hive脚本执行状态,并在控制台打印执行日志。Hive 的调度脚本可以使用 shell 脚本编写,通常使用 crontab 或者 Oozie 等调度工具来实现。 使用 crontab 调度可以按照一定的时间间隔执行指定的 Hive 脚本。例如,要在每天早上 6 点运行一个 Hive 脚本,可以在 crontab 中添加以下条目: ``` 0 6 * * * /path/to/hive -f /path/to/script.hql ``` 这条命令会在每天早上 6 点运行指定路径下的 Hive 脚本。其中,`/path/to/hive` 是 Hive 执行器的路径,`/path/to/script.hql` 是要运行的 Hive 脚本的路径。 另外,也可以使用 Oozie 调度工具来进行 Hive 脚本的调度。Oozie 可以支持更加灵活的调度方式,例如可以根据任务的状态、时间、数据等条件来触发任务的执行。 以上是关于 Hive 调度 shell 脚本的简要介绍,希望对您有所帮助。Hive调度shell脚本的主要目的是自动化执行Hive脚本并将结果输出到指定位置。以下是一个简单的Hive调度shell脚本示例: ```bash #!/bin/bash # 设置Hadoop和Hive环境变量 export HADOOP_HOME=/usr/local/hadoop export HIVE_HOME=/usr/local/hive # 设置Hive脚本路径和输出路径 SCRIPT_PATH=/path/to/hive/script.hql OUTPUT_PATH=/path/to/output # 执行Hive脚本 $HIVE_HOME/bin/hive -f $SCRIPT_PATH > $OUTPUT_PATH 2>&1 # 检查执行状态并输出日志 if [ $? -eq 0 ]; then echo "Hive脚本执行成功!" else echo "Hive脚本执行失败,请检查日志文件。" cat $OUTPUT_PATH fi ``` 这个脚本首先设置Hadoop和Hive的环境变量,然后指定要执行的Hive脚本的路径和输出路径。接下来,它使用Hive命令行工具执行脚本,并将结果输出到指定的输出路径中。最后,它检查执行状态并输出日志,如果执行成功,则输出成功的消息,否则输出失败的消息并打印日志文件的内容。 您可以根据需要自定义此脚本,例如添加定时调度,自动备份输出文件等功能。Hive的调度Shell脚本可以用来自动化运行Hive脚本,以下是一个简单的例子: ``` #!/bin/bash # 设置Hadoop和Hive的环境变量 export HADOOP_HOME=/usr/local/hadoop export HIVE_HOME=/usr/local/hive # 设置输入和输出路径 input_path=/input/data output_path=/output/data # 运行Hive脚本 $HIVE_HOME/bin/hive -f /path/to/hive_script.hql -hiveconf input_path=$input_path -hiveconf output_path=$output_path ``` 在上述脚本中,我们首先设置Hadoop和Hive的环境变量。然后,我们设置输入和输出路径。最后,我们运行Hive脚本,并通过`-hiveconf`参数将输入和输出路径传递给Hive脚本。Hive的调度Shell脚本可以用于定期运行Hive查询任务。以下是一个简单的Hive调度Shell脚本的示例: ```bash #!/bin/bash # 设置Hive客户端路径 export HIVE_HOME=/usr/local/hive export PATH=$PATH:$HIVE_HOME/bin # 设置日期格式 DATE=`date +%Y-%m-%d` # 运行Hive查询 hive -e "SELECT * FROM table WHERE date='$DATE'" # 结束脚本 exit 0 ``` 在上面的示例中,首先设置Hive客户端路径和日期格式。然后,使用Hive的-e选项运行一个查询,查询的条件是当天的日期。最后,使用exit命令结束脚本。 这个脚本可以在Linux或Unix系统上运行,可以将它加入到定时任务中,实现自动化调度。Hive是一种基于Hadoop的数据仓库工具,它可以帮助我们进行大规模数据处理。对于Hive的调度任务,可以使用shell脚本来完成。 一般来说,Hive的调度任务可以通过编写shell脚本并利用crontab来实现定时运行。在shell脚本中,我们需要定义Hive脚本的路径和执行语句。以下是一个简单的Hive调度shell脚本示例: ``` #!/bin/bash # 设置Hive脚本路径 hive_script_path=/path/to/hive/script.hql # 执行Hive脚本 hive -f $hive_script_path ``` 在上面的示例中,我们定义了Hive脚本的路径,并利用`hive -f`命令来执行Hive脚本。可以根据实际需求修改脚本中的路径和执行语句。 然后,我们可以将该脚本保存为一个可执行文件,并利用crontab设置定时任务。例如,我们可以在每天早上8点运行该脚本,可以在终端中执行以下命令: ``` $ crontab -e ``` 然后在打开的文本编辑器中添加以下内容: ``` 0 8 * * * /path/to/hive/schedule.sh ``` 这将会在每天早上8点运行我们编写的Hive调度shell脚本。 当然,这只是一个简单的示例,实际情况可能会更加复杂。在实际应用中,我们需要根据具体的需求编写更为复杂的Hive调度脚本。当您想要为Hive中的作业编写一个调度脚本时,可以使用shell脚本来完成这个任务。以下是一个示例脚本,可以作为参考: ```bash #!/bin/bash # 设置Hadoop和Hive的环境变量 export HADOOP_HOME=/path/to/hadoop export HIVE_HOME=/path/to/hive # 定义Hive作业的数据库名称和表名 database_name="my_db" table_name="my_table" # 运行Hive查询语句 query="SELECT * FROM $database_name.$table_name" $HIVE_HOME/bin/hive -e "$query" # 检查查询是否成功完成 if [ $? -eq 0 ] then echo "Hive job completed successfully." else echo "Hive job failed." fi ``` 在这个示例脚本中,您需要设置Hadoop和Hive的环境变量,然后定义Hive作业的数据库名称和表名。接下来,使用Hive的-e选项来运行查询语句,并检查查询是否成功完成。您可以根据需要修改和调整脚本,以满足您的具体需求。Hive的调度脚本可以使用shell脚本来实现。以下是一个示例脚本: ```bash #!/bin/bash # 设置Hive脚本目录和日志目录 SCRIPT_DIR=/path/to/hive/scripts LOG_DIR=/path/to/logs # 执行Hive脚本,并将日志输出到指定目录 hive -f $SCRIPT_DIR/my_script.hql 2>&1 | tee $LOG_DIR/my_script.log ``` 该脚本首先设置Hive脚本和日志目录的路径,然后执行Hive脚本,并将日志输出到指定目录中。tee命令可将标准输出重定向到文件中,同时保留标准输出到终端。 此外,您还可以使用Linux的crontab工具来调度Hive脚本的执行。例如,以下是一个每天晚上9点执行Hive脚本的crontab示例: ```bash 0 21 * * * /path/to/hive/scheduling_script.sh ``` 该命令在每天晚上9点执行指定的脚本。您只需要将脚本路径替换为实际的脚本路径即可。 我可以为您提供一些有关Hive调度shell脚本的信息,例如如何使用它们来实现自动化作业、构建管道等等。Hive的调度可以使用shell脚本来实现。以下是一个简单的Hive调度脚本示例,供您参考: ``` #!/bin/bash # 设置Hive数据库的连接信息 hive_database="your_hive_database" hive_username="your_hive_username" hive_password="your_hive_password" # 设置Hive查询语句 hive_query="SELECT * FROM your_table;" # 执行Hive查询 hive -e "$hive_query" --database $hive_database --hiveconf hive.server2.thrift.port=10000 --hiveconf hive.metastore.uris=thrift://your_hive_metastore_host:9083 --hiveconf hive.security.authorization.enabled=false --hiveconf hive.security.authentication=none --hiveconf hive.cli.print.header=true --hiveconf hive.resultset.use.unique.column.names=false --hiveconf hive.cli.print.current.db=false --hiveconf hive.fetch.task.conversion=more --hiveconf hive.vectorized.execution.enabled=false --hiveconf hive.execution.engine=mr --hiveconf hive.exec.parallel=true --hiveconf hive.exec.dynamic.partition=true --hiveconf hive.exec.dynamic.partition.mode=nonstrict --hiveconf mapred.job.queue.name=default --hiveconf mapreduce.job.reduces=1 --hiveconf mapreduce.map.memory.mb=4096 --hiveconf mapreduce.reduce.memory.mb=8192 --hiveconf mapreduce.map.java.opts=-Xmx3276m --hiveconf mapreduce.reduce.java.opts=-Xmx6554m --hiveconf mapreduce.job.name='your_job_name' --hiveconf hive.exec.max.dynamic.partitions=1000 --hiveconf hive.exec.max.dynamic.partitions.pernode=1000 --hiveconf hive.exec.compress.output=true --hiveconf hive.exec.dynamic.partition.modes=nonstrict --hiveconf hive.auto.convert.join=true --hiveconf hive.optimize.bucketmapjoin=true --hiveconf hive.optimize.bucketmapjoin.sortedmerge=true --hiveconf hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat --hiveconf hive.merge.mapfiles=true --hiveconf hive.merge.mapredfiles=true --hiveconf hive.merge.size.per.task=256000000 --hiveconf hive.merge.smallfiles.avgsize=16000000 --hiveconf hive.mapred.reduce.tasks.speculative.execution=false --hiveconf hive.stats.fetch.column.stats=true --hiveconf hive.stats.fetch.partition.stats=true --hiveconf hive.stats.autogather=true --hiveconf hive.stats.jdbcdriver=com.mysql.jdbc.Driver --hiveconf hive.stats.dbclass=mysql --hiveconf hive.exec.submitviachild=true --hiveconf hive.tez.container.size=2048 --hiveconf hive.vectorized.execution.reduce.enabled=true --hiveconf hive.vectorized.execution.map.enabled=true --hiveconf hive.tez.auto.reducer.parallelism=true --hiveconf hive.optimize.index.filter=true --hiveconf hive.tez.cpu.vcores=2 --hiveconf hive.exec.max.created.files=100000 --hiveconf hive.exec.min.split.size=1 --hiveconf hive.optimize.skewjoin=true --hiveconf hive.optimize.skewjoin.compiletime=true --hiveconf hive.optimize.bucketmapjoin.sortedmerge.bucketmapjoin=false --hiveconf hive.optimize.bucketmapjoin.sortedmerge.tez=false --hiveconf hive.optimize.bucketmapjoin=true --hiveconf hive.tez.container.max.java.heap.fraction=0.85 --hiveconf hive.tez.java.opts=-XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -verbose:gc -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/tez -XX:+UseNUMA -XX:+UseCondCardMark -XX:G1HeapRegionSize=16mHive调度的shell脚本一般包括以下几个部分: 1. 连接Hive服务:使用beeline命令连接到Hive Server2,示例如下: ``` beeline -u jdbc:hive2://<hive_server2>:<port>/<database> -n <username> -p <password> ``` 2. 设置参数:设置Hive执行的参数,例如: ``` set hive.execution.engine=tez; set hive.tez.container.size=8192; ``` 3. 执行HiveQL语句:编写HiveQL语句并执行,例如: ``` CREATE TABLE IF NOT EXISTS table1 ( col1 INT, col2 STRING, col3 DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE; ``` 4. 退出beeline:执行完所有语句后,使用exit命令退出beeline,例如: ``` !exit ``` 完整的Hive调度shell脚本示例如下: ``` #!/bin/bash beeline -u jdbc:hive2://<hive_server2>:<port>/<database> -n <username> -p <password> set hive.execution.engine=tez; set hive.tez.container.size=8192; CREATE TABLE IF NOT EXISTS table1 ( col1 INT, col2 STRING, col3 DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE; !exit ```Hive的调度可以使用Shell脚本来完成。以下是一个基本的Hive调度Shell脚本示例: ``` #!/bin/bash # 定义变量 HIVE_BIN="/usr/bin/hive" HIVE_SCRIPT="/path/to/hive_script.hql" # 执行Hive脚本 $HIVE_BIN -f $HIVE_SCRIPT ``` 在此示例中,首先定义了两个变量`HIVE_BIN`和`HIVE_SCRIPT`。`HIVE_BIN`指定了Hive的二进制文件路径,`HIVE_SCRIPT`指定了要执行的Hive脚本路径。 然后使用`$HIVE_BIN`和`$HIVE_SCRIPT`变量执行Hive脚本,这将通过Hive客户端运行脚本。 您可以在此基础上进行修改和扩展,例如添加日期和时间戳以生成唯一的输出文件名,或者添加错误处理和日志记录。可以使用Shell脚本来调度Hive作业。以下是一个示例脚本: ``` #!/bin/bash # 设置Hadoop和Hive的路径 export HADOOP_HOME=/path/to/hadoop export HIVE_HOME=/path/to/hive # 设置Hadoop和Hive的类路径 export HADOOP_CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath) export HIVE_AUX_JARS_PATH=/path/to/aux/jars # 定义变量 DATABASE=your_database_name TABLE=your_table_name INPUT_PATH=/path/to/input OUTPUT_PATH=/path/to/output # 执行Hive脚本 $HIVE_HOME/bin/hive -e "USE $DATABASE; INSERT OVERWRITE TABLE $TABLE SELECT * FROM your_query;" # 拷贝输出结果到HDFS $HADOOP_HOME/bin/hadoop fs -mkdir -p $OUTPUT_PATH $HADOOP_HOME/bin/hadoop fs -put $HIVE_HOME/$DATABASE/$TABLE/* $OUTPUT_PATH ``` 此脚本将会执行一个Hive查询,并将结果保存到指定的输出路径中。你可以使用 `crontab` 或其他工具来定期运行该脚本,以便自动执行Hive作业。请注意,在运行脚本之前,需要根据你自己的环境和要求来修改脚本中的路径和变量。Hive的调度shell脚本可以通过在Linux或Unix系统上使用crontab或其他调度工具来实现。在编写脚本之前,需要先编写Hive的SQL查询,并将其存储在Hive脚本文件中。 例如,假设我们想要每天晚上11点运行一个名为"myhivequery.hql"的Hive查询。我们可以创建一个名为"run_hive_query.sh"的shell脚本,并将以下代码添加到其中: ``` #!/bin/bash #设置Hive的环境变量 export HIVE_HOME=/usr/local/hive export PATH=$PATH:$HIVE_HOME/bin #运行Hive查询 hive -f /path/to/myhivequery.hql ``` 接下来,我们需要设置crontab来调度运行此脚本。打开终端,输入以下命令: ``` crontab -e ``` 这将打开一个文本编辑器,允许我们编辑我们的crontab文件。在文件的末尾,添加以下行: ``` 0 23 * * * /path/to/run_hive_query.sh ``` 这个cron表达式指定了每天23:00运行我们的脚本。我们需要将"/path/to/run_hive_query.sh"替换为实际的脚本路径。 保存并退出文件,cron将在每天指定的时间运行我们的脚本,该脚本将运行Hive查询并将结果输出到指定位置。Hive的调度Shell脚本通常使用Linux的crontab进行调度,下面是一个简单的例子: ```bash #!/bin/bash # 设置环境变量 export HADOOP_USER_NAME=hadoop export HIVE_HOME=/path/to/hive export PATH=$PATH:$HIVE_HOME/bin # 执行Hive脚本 hive -f /path/to/hive/script.hql ``` 在crontab中设置定时调度,比如每天早上6点执行: ``` 0 6 * * * /path/to/shell/script.sh ``` 这样就会在每天早上6点执行一次Hive脚本了。需要注意的是,执行脚本的用户需要有执行权限,并且Hive的环境变量需要正确设置。Hive 的调度可以通过编写 Shell 脚本来实现。下面是一个基本的 Hive 调度 Shell 脚本的示例: ```bash #!/bin/bash # 设置 Hive 命令行参数 HIVE_ARGS="-hiveconf mapred.job.queue.name=my_queue" # 运行 Hive 查询 hive ${HIVE_ARGS} -f /path/to/hive/query.hql ``` 在这个示例中,脚本首先设置了 Hive 命令行参数(这里是设置了作业队列),然后运行了一个 Hive 查询,使用了 `-f` 参数指定了 Hive 查询脚本的路径。 当然,这只是一个简单的示例。实际上,Hive 调度可以更加复杂,需要根据具体的业务需求进行编写。可以根据实际情况来设置参数、指定查询、添加依赖关系等等,以实现更加高效、可靠的调度。当使用Hive作为数据处理引擎时,可以编写一个调度shell脚本来定期运行Hive脚本以更新数据。下面是一个简单的Hive调度shell脚本示例,其中包括了一些常用的命令和参数: ``` #!/bin/bash # 设置Hive脚本和日志文件路径 SCRIPT_PATH=/path/to/hive/script.hql LOG_PATH=/path/to/log/file.log # 执行Hive脚本 hive -f $SCRIPT_PATH > $LOG_PATH 2>&1 # 检查Hive脚本是否执行成功 if [ $? -eq 0 ] then echo "Hive script executed successfully!" else echo "Hive script failed to execute. Check log file for details." fi # 结束脚本执行 exit 0 ``` 在上述示例中,调度脚本首先设置Hive脚本和日志文件的路径,然后使用`hive -f`命令执行Hive脚本,并将输出写入日志文件中。脚本还包括一个检查语句,以检查Hive脚本是否成功执行。最后,脚本通过`exit`命令结束执行。 请注意,这只是一个简单的示例脚本,实际的Hive调度脚本可能需要更多的命令和参数,以便在实际的数据处理场景中运行。当你在Hive使用调度shell脚本时,你可以采取以下步骤: 1.编写Hive脚本,包括必要的Hive命令和逻辑。 2.将Hive脚本保存在HDFS上的一个目录中。 3.编写一个调度脚本,其中包括调用Hive脚本的命令以及计划运行时间。 4.将调度脚本保存在你选择的位置。 5.设置调度器,例如cron或oozie。 6.启动调度器,让它按照你指定的计划来运行调度脚本。 当调度脚本被运行时,它将调用Hive脚本,这将在Hive中执行你的任务。你也可以在调度脚本中包含其他命令和逻辑来处理任务完成后的后续步骤,例如将结果导出到一个文件中。以下是Hive调度Shell脚本的示例: ```bash #!/bin/bash # 设置Hive的JDBC连接参数 HIVE_JDBC_URL="jdbc:hive2://localhost:10000/default" HIVE_USER="hiveuser" HIVE_PASSWORD="hivepassword" # 执行Hive SQL语句的函数 function run_hive_query() { # 将传入的SQL语句作为参数 local query="$1" # 使用beeline连接Hive服务器,并执行SQL语句 beeline -u "${HIVE_JDBC_URL}" \ --silent=true \ --showHeader=false \ --outputformat=tsv2 \ --fastConnect=true \ --verbose=false \ --showWarnings=false \ --hiveconf hive.cli.print.header=false \ --hiveconf hive.resultset.use.unique.column.names=false \ --hiveconf hive.exec.dynamic.partition.mode=nonstrict \ --hiveconf hive.exec.dynamic.partition=true \ --hiveconf hive.exec.max.dynamic.partitions=10000 \ --hiveconf hive.exec.max.dynamic.partitions.pernode=10000 \ --hiveconf hive.exec.max.created.files=100000 \ --hiveconf hive.auto.convert.join=true \ --hiveconf hive.auto.convert.join.noconditionaltask=true \ --hiveconf hive.optimize.reducededuplication=true \ --hiveconf hive.optimize.skewjoin=true \ --hiveconf hive.vectorized.execution.enabled=true \ --hiveconf hive.vectorized.execution.reduce.enabled=false \ --hiveconf hive.vectorized.execution.reduce.groupby.enabled=false \ --hiveconf hive.vectorized.execution.mapjoin.native.enabled=false \ --hiveconf hive.cbo.enable=true \ --hiveconf hive.compute.query.using.stats=true \ --hiveconf hive.stats.fetch.column.stats=true \ --hiveconf hive.stats.fetch.partition.stats=true \ --hiveconf hive.stats.autogather=true \ --hiveconf hive.server2.enable.doAs=false \ -n "${HIVE_USER}" -p "${HIVE_PASSWORD}" \ --hivevar query="${query}" \ -e '$query' } # 示例:执行查询 run_hive_query "SELECT * FROM my_table LIMIT 10;" ``` 上面的脚本定义了一个名为`run_hive_query`的函数,它将接收Hive SQL语句作为参数,并使用`beeline`命令连接到Hive服务器并执行该语句。 在函数的主体中,`beeline`命令的各种选项用于配置连接参数和执行参数。例如,`--hiveconf`选项用于设置Hive的各种配置选项,如动态分区模式、向量化执行和查询统计信息。 在示例中,函数通过调用`run_hive_query`函数并传递一个简单的SQL查询作为参数来演示如何使用它。 请注意,此示例假定您已经安装并配置了Hive和beeline,并且能够正确地连接到Hive服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值