云服务器内容精选

  • 回答 HetuEngine计算实例的启动依赖Python文件,需确保各节点“/usr/bin/”路径下面存在Python文件。 登录FusionInsight Manager,单击“主机”,查看并记录所有主机的业务IP。 以root用户登录1记录的节点,在所有节点都执行以下命令,在“/usr/bin/”目录下添加“python3”的软连接。 cd /usr/bin ln -s python3 python 重新启动HetuEngine计算实例。
  • 回答 当Standby NameNode存储元数据(命名空间)时,出现断电的情况,Standby NameNode启动失败,MD5文件会损坏。通过移除损坏的fsimage,然后启动Standby NameNode,可以修复此问题。Standby NameNode会加载先前的fsimage并重现所有的edits。 修复步骤: 移除损坏的fsimage。 rm -rf ${BIGDATA_DATA_HOME}/namenode/current/fsimage_0000000000000096 启动Standby NameNode。
  • 回答 当通过OfflineMetaRepair工具重建元数据时,HMaster在启动期间等待所有region server的WAL分割,以避免数据不一致问题。一旦WAL分割完成,HMaster将进行用户region的分配。所以当在集群异常的场景下,WAL分割可能需要很长时间,这取决于多个因素,例如太多的WALs,较慢的I/O,region servers不稳定等。 为确保HMaster能够成功完成所有region server WAL分割,请执行以下步骤: 确保集群稳定,不存在其他问题。如有任何问题,请先修复。 为“hbase.master.initializationmonitor.timeout”参数配置一个较大的值,默认值为“3600000”毫秒。 重启HBase服务。
  • 问题 为什么在使用OfflineMetaRepair工具重新构建元数据后,HMaster启动的时候会等待namespace表分配超时,最后启动失败? 且HMaster将输出下列FATAL消息表示中止: 2017-06-15 15:11:07,582 FATAL [Hostname:16000.activeMasterManager] master.HMaster: Unhandled exception. Starting shutdown. java.io.IOException: Timedout 120000ms waiting for namespace table to be assigned at org.apache.hadoop.hbase.master.TableNamespaceManager.start(TableNamespaceManager.java:98) at org.apache.hadoop.hbase.master.HMaster.initNamespace(HMaster.java:1054) at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:848) at org.apache.hadoop.hbase.master.HMaster.access$600(HMaster.java:199) at org.apache.hadoop.hbase.master.HMaster$2.run(HMaster.java:1871) at java.lang.Thread.run(Thread.java:745)
  • 解决方法 针对avro格式表查询报错,根本原因是avro格式表schema不匹配导致,需要考虑增量和存量avro格式表查询两个场景: 增量avro格式表,需要创建表之前设置参数spark.sql.forceConvertSchema.enabled=true,会将avro表格式强转指定数据类型,一次性修改schema。 存量avro格式表,查询avro表之前设置参数spark.sql.forceConvertSchema.enabled=true,如果查询失败,可能avro格式表schema被缓存,执行refresh table命令,清除缓存后再设置参数进行查询,会将avro表格式强转指定数据类型,客户端临时修改schema。
  • 回答 在JobHistory界面中跳转到某个应用的原生页面时,JobHistory需要回放该应用的Event log,如果应用包含的事件日志较大,则回放时间较长,浏览器需要较长时间的等待。 当前浏览器访问JobHistory原生页面需经过httpd代理,代理的超时时间是10分钟,因此,如果JobHistory在10分钟内无法完成Event log的解析并返回,httpd会主动向浏览器返回Proxy Error信息。
  • 问题 添加HBase的Ranger访问权限策略时,在策略中使用通配符搜索已存在的HBase表时,搜索不到已存在的表,并且在/var/log/Bigdata/ranger/rangeradmin/ranger-admin-*log中报以下错误 Caused by: javax.security.sasl.SaslException: No common protection layer between client and server at com.sun.security.sasl.gsskerb.GssKrb5Client.doFinalHandshake(GssKrb5Client.java:253) at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:186) at org.apache.hadoop.hbase.security.AbstractHBaseSaslRpcClient.evaluateChallenge(AbstractHBaseSaslRpcClient.java:142) at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler$2.run(NettyHBaseSaslRpcClientHandler.java:142) at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler$2.run(NettyHBaseSaslRpcClientHandler.java:138) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1761) at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.channelRead0(NettyHBaseSaslRpcClientHandler.java:138) at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.channelRead0(NettyHBaseSaslRpcClientHandler.java:42) at org.apache.hbase.thirdparty.io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) at org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
  • 回答 Ranger界面上HBase服务插件的“hbase.rpc.protection”参数值和HBase服务端的“hbase.rpc.protection”参数值必须保持一致。 参考登录Ranger WebUI界面章节,登录Ranger管理界面。 在首页中“HBASE”区域,单击组件插件名称,如HBase的按钮 搜索配置项“hbase.rpc.protection”,修改配置项的value值,与HBase服务端的“hbase.rpc.protection”的值保持一致。 单击“保存”。
  • 回答 如果LoadIncrementalHFiles工具依赖的Client在集群内安装,且和DataNode在相同的节点上,在工具执行过程中HDFS会创建短路读提高性能。短路读依赖“/var/run/FusionInsight-HDFS”目录(“dfs.domain.socket.path”),该目录默认权限是750。而当前Linux用户没有权限操作该目录。 上述问题可通过执行以下方法解决: 方法一:创建新用户(推荐使用)。 通过Manager页面创建新的用户,该用户属组中默认包含ficommon组。 [root@xxx-xxx-xxx-xxx ~]# id test uid=20038(test) gid=9998(ficommon) groups=9998(ficommon) 重新执行ImportData。 方法二:修改当前用户的属组。 将该用户添加到ficommon组中。 [root@xxx-xxx-xxx-xxx ~]# usermod -a -G ficommon test [root@xxx-xxx-xxx-xxx ~]# id test uid=2102(test) gid=2102(test) groups=2102(test),9998(ficommon) 重新执行ImportData。
  • 问题 在普通集群中手动创建Linux用户,并使用集群内DataNode节点执行批量导入时,为什么LoadIncrementalHFiles工具执行失败报“Permission denied”的异常? 2020-09-20 14:53:53,808 WARN [main] shortcircuit.DomainSocketFactory: error creating DomainSocket java.net.ConnectException: connect(2) error: Permission denied when trying to connect to '/var/run/FusionInsight-HDFS/dn_socket' at org.apache.hadoop.net.unix.DomainSocket.connect0(Native Method) at org.apache.hadoop.net.unix.DomainSocket.connect(DomainSocket.java:256) at org.apache.hadoop.hdfs.shortcircuit.DomainSocketFactory.createSocket(DomainSocketFactory.java:168) at org.apache.hadoop.hdfs.client.impl.BlockReaderFactory.nextDomainPeer(BlockReaderFactory.java:804) at org.apache.hadoop.hdfs.client.impl.BlockReaderFactory.createShortCircuitReplicaInfo(BlockReaderFactory.java:526) at org.apache.hadoop.hdfs.shortcircuit.ShortCircuitCache.create(ShortCircuitCache.java:785) at org.apache.hadoop.hdfs.shortcircuit.ShortCircuitCache.fetchOrCreate(ShortCircuitCache.java:722) at org.apache.hadoop.hdfs.client.impl.BlockReaderFactory.getBlockReaderLocal(BlockReaderFactory.java:483) at org.apache.hadoop.hdfs.client.impl.BlockReaderFactory.build(BlockReaderFactory.java:360) at org.apache.hadoop.hdfs.DFSInputStream.getBlockReader(DFSInputStream.java:663) at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:594) at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:776) at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:845) at java.io.DataInputStream.readFully(DataInputStream.java:195) at org.apache.hadoop.hbase.io.hfile.FixedFileTrailer.readFromStream(FixedFileTrailer.java:401) at org.apache.hadoop.hbase.io.hfile.HFile.isHFileFormat(HFile.java:651) at org.apache.hadoop.hbase.io.hfile.HFile.isHFileFormat(HFile.java:634) at org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.visitBulkHFiles(LoadIncrementalHFiles.java:1090) at org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.discoverLoadQueue(LoadIncrementalHFiles.java:1006) at org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.prepareHFileQueue(LoadIncrementalHFiles.java:257) at org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.doBulkLoad(LoadIncrementalHFiles.java:364) at org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.run(LoadIncrementalHFiles.java:1263) at org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.run(LoadIncrementalHFiles.java:1276) at org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.run(LoadIncrementalHFiles.java:1311) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76) at org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.main(LoadIncrementalHFiles.java:1333)
  • 问题 HDFS调用FileInputFormat的getSplit方法的时候,出现ArrayIndexOutOfBoundsException: 0,日志如下: java.lang.ArrayIndexOutOfBoundsException: 0 at org.apache.hadoop.mapred.FileInputFormat.identifyHosts(FileInputFormat.java:708) at org.apache.hadoop.mapred.FileInputFormat.getSplitHostsAndCachedHosts(FileInputFormat.java:675) at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:359) at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:210) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237) at scala.Option.getOrElse(Option.scala:120) at org.apache.spark.rdd.RDD.partitions(RDD.scala:237) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
  • 解决方法 找到重启前的主NameNode,进入其数据目录(查看配置项“dfs.namenode.name.dir”可获取,例如/srv/BigData/namenode/current),得到最新的FSImage文件的序号。一般如下: 查看各JournalNode的数据目录(查看配置项“dfs.journalnode.edits.dir”可获取,例如/srv/BigData/journalnode/hacluster/current),查看序号从第一部获取到的序号开始的edits文件,看是否有不连续的情况(即前一个edits文件的最后一个序号 和 后一个edits文件的第一个序号 不是连续的,如下图中的edits_0000000000013259231-0000000000013259237就和后一个edits_0000000000013259239-0000000000013259246就是不连续的)。 如果有这种不连续的edits文件,则需要查看其它的JournalNode的数据目录或NameNode数据目录中,有没有连续的该序号相关的连续的edits文件。如果可以找到,复制一个连续的片段到该JournalNode。 如此把所有的不连续的edits文件全部都修复。 重启NameNode,观察是否成功。如还是失败,请联系技术支持。
  • 问题 安装集群外客户端或使用集群外客户端时,有时会出现连接Spark任务端口失败的问题。 异常信息:Failed to bind SparkUi Cannot assign requested address: Service ‘sparkDriver’ failed after 16 retries (on a random free port)! Consider explicitly setting the appropriate binding address for the service ‘sparkDriver’ (for example spark.driver.bindAddress for SparkDriver) to the correct binding address.
  • 解决方法 应用无法访问到SparkUI的IP:PORT。有以下可能: 查看集群节点与客户端节点是否通信: 查看客户端节点“/etc/hosts”文件中是否配置集群节点映射,在客户端节点执行命令: ping sparkui的IP 如果ping不同,检查映射配置与网络设置。 关闭客户端节点防火墙设置。 执行如下命令可查看是否关闭: systemctl status firewalld(不同的操作系统查询命令不一致,此命令以CentOS为例) 如下图所示:dead表示关闭。 防火墙开则影响通信,执行如下命令关闭防火墙: service firewalld stop(不同的操作系统查询命令不一致,此命令以CentOS为例) 查看端口是否被占用: ssh -v -p port username@ip 如果输出“Connection established”,则表示连接成功,端口已被占用。 Spark UI端口范围由配置文件spark-defaults.conf中的参数“spark.random.port.min”和“spark.random.port.max”决定,如果该范围端口都已被占用,则 导致无端口可用从而连接失败。 解决方案:调节重连次数spark.port.maxRetries=50,并且调节executor随机端口范围spark.random.port.max+100 查看Spark配置参数: 在客户端节点执行命令cat spark-env.sh,查看SPARK_LOCAL_HOSTNAME,是否为本机IP。 该问题容易出现在从其他节点直接复制客户端时,配置参数未修改。 需修改SPARK_LOCAL_HOSTNAME为本机IP 注:如果集群使用EIP通信,则需要设置 spark-default.conf中添加spark.driver.host = EIP(客户端节点弹性公网IP) spark-default.conf中添加spark.driver.bindAddress=本地IP spark-env.sh中修改SPARK_LOCAL_HOSTNAME=EIP(客户端节点弹性公网IP) 如果通信与配置均无问题,则从代码层面排查: Spark在启动任务时会在客户端创建sparkDriverEnv并绑定DRIVER_BIND_ADDRESS,该逻辑并没有走到服务端,所以该问题产生的原因也是客户端节点操作系统环境问题导致sparkDriver获取不到对应的主机IP。 可以尝试执行export SPARK_LOCAL_HOSTNAME=172.0.0.1或者设置spark.driver.bindAddress=127.0.0.1,使提交任务driver端可以加载到loopbackAddress,从而规避问题。
  • 操作步骤 假设存在如下一张表: user_data(user_group int, user_name string, update_time timestamp); 其中user_group是分区列,需要根据已有数据,按更新时间进行排序,刷新用户组信息。操作步骤如下: 在Hive Beeline命令行执行以下命令开启Hive动态分区: set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; 执行以下命令创建一个临时表,用于存储去重后的数据: CREATE TABLE temp_user_data AS SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY user_group ORDER BY update_time DESC) as rank FROM user_data ) tmp WHERE rank = 1; 执行以下命令使用临时数据作为数据源,并插入到目的表中: INSERT OVERWRITE TABLE user_data SELECT user_group, user_name, update_time FROM temp_user_data; 执行以下命令清理临时表: DROP TABLE IF EXISTS temp_user_data;