云服务器内容精选

  • 操作步骤 优化GC。 调整老年代和新生代的比值。在客户端的“conf/flink-conf.yaml”配置文件中,在“env.java.opts”配置项中添加参数:“-XX:NewRatio”。如“ -XX:NewRatio=2”,则表示老年代与新生代的比值为2:1,新生代占整个堆空间的1/3,老年代占2/3。 开发Flink应用程序时,优化DataStream的数据分区或分组操作。 当分区导致数据倾斜时,需要考虑优化分区。 避免非并行度操作,有些对DataStream的操作会导致无法并行,例如WindowAll。 keyBy尽量不要使用String。
  • Flume客户端Cgroup使用指导 该操作指导用户加入、退出Cgroup,查询Cgroup状态以及更改Cgroup cpu阈值。 加入Cgroup 执行以下命令,加入Cgroup,假设Flume客户端安装路径为“/opt/FlumeClient”,Cgroup cpu阈值设置为50%: cd /opt/FlumeClient/fusioninsight-flume-1.9.0/bin ./flume-manage.sh cgroup join 50 该命令不仅可以加入Cgroup,同时也可以更改Cgroup cpu阈值。 Cgroup cpu阈值取值范围为1~100*N之间的整数,N表示机器cpu核数。 查询Cgroup状态 执行以下命令,查询Cgroup状态,假设Flume客户端安装路径为“/opt/FlumeClient”: cd /opt/FlumeClient/fusioninsight-flume-1.9.0/bin ./flume-manage.sh cgroup status 退出Cgroup 执行以下命令,退出Cgroup,假设Flume客户端安装路径为“/opt/FlumeClient”: cd /opt/FlumeClient/fusioninsight-flume-1.9.0/bin ./flume-manage.sh cgroup exit 客户端安装完成后,会自动创建默认Cgroup。如果安装客户端时未配置“-s”参数,则默认值为“-1”,表示agent进程不受cpu使用率限制。 加入、退出Cgroup时,agent进程不受影响。如果agent进程未启动,加入、退出Cgroup仍然可以成功执行,待下一次agent启动时生效。 客户端卸载完成后,安装时期创建的Cgroup会自动删除。
  • 配置自定义rowkey实现 使用BulkLoad工具批量导入HBase数据时,支持用户自定义的组合rowkey实现。用户可编写rowkey实现代码,导入时根据该代码逻辑进行组合rowkey导入。 配置自定义rowkey实现步骤如下: 用户编写自定义rowkey的实现类,需要继承接口,该接口所在的Jar包路径为“客户端安装目录/HBase/hbase/lib/hbase-it-bulk-load-*.jar”: [com.huawei.hadoop.hbase.tools.bulkload.RowkeyHandlerInterface], 实现接口中方法: byte[] getRowkeyBytes(String[] colsValues, RegulationDomain regulation) 其中: 传入参数“colsValues”为原始数据中的一行数据集合,每个元素为一列。 传入参数“regulation”为配置导入文件信息(一般情况下并不需要使用)。 将该实现类与其依赖包同时打包成Jar文件,保存到HBase客户端所在节点的任意位置并确保执行命令的用户具有读取和执行该Jar包的权限。 在执行导入命令时,增加两个参数配置项: -Dimport.rowkey.jar="第二步中Jar包的全路径" -Dimport.rowkey.class="用户实现类的全类名"
  • 如何开发Flume第三方插件 安装Flume客户端,如安装目录为“/opt/flumeclient”。 将自主研发的代码打成jar包。 建立插件目录布局。 进入“Flume客户端安装目录/fusionInsight-flume-*/plugins.d”路径下,使用以下命令建立目录,可根据实际业务进行命名,无固定名称: cd /opt/flumeclient/fusioninsight-flume-1.9.0/plugins.d mkdir thirdPlugin cd thirdPlugin mkdir lib libext native 显示结果如下: 将第三方jar包放入“Flume客户端安装目录/fusionInsight-flume-*/plugins.d/thirdPlugin/lib”路径下,如果该jar包依赖其他jar包,则将所依赖的jar包放入“Flume客户端安装目录/fusionInsight-flume-*/plugins.d/thirdPlugin/libext”文件夹中,“Flume客户端安装目录/fusionInsight-flume-*/plugins.d/thirdPlugin/native”放置本地库文件。 配置“Flume客户端安装目录/fusionInsight-flume-*/conf/properties.properties”文件。 具体properties.properties参数配置方法,参考配置Flume非加密传输数据采集任务和配置Flume加密传输数据采集任务对应典型场景中properties.properties文件参数列表的说明。 父主题: Flume常见问题
  • 操作步骤 参数入口:执行批量加载任务时,在BulkLoad命令行中加入表1中的参数。 表1 增强BulkLoad效率的配置项 参数 描述 配置的值 -Dimporttsv.mapper.class 用户自定义mapper通过把键值对的构造从mapper移动到reducer以提高性能。mapper只需要把每一行的原始文本发送到reducer,reducer解析每一行的每一条记录并创建键值对。 说明: 当该值配置为“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时,只在执行没有HBASE_CELL_VISIBILITY OR HBASE_CELL_TTL选项的批量加载命令时使用。使用“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时可以得到更好的性能。 org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper 和 org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper
  • 前提条件 创建或获取该任务中创建Loader作业的业务用户和密码。 确保用户已授权访问作业执行时操作的HDFS/OBS目录、HBase表和数据。 获取外部数据源(SFTP服务器或关系型数据库)使用的用户和密码。 检查磁盘空间,确保没有出现告警且余量满足导入、导出数据的大小。 使用Loader从SFTP、FTP和HDFS/OBS导入数据时,确保外部数据源的输入路径目录名、输入路径的子目录名及子文件名不能包含特殊字符/\"':;,中的任意字符。 如果设置的任务需要使用指定Yarn队列功能,该用户需要已授权有相关Yarn队列的权限。 设置任务的用户需要获取该任务的执行权限,并获取该任务对应的连接的使用权限。
  • 前提条件 创建或获取该任务中创建Loader作业的业务用户和密码。 确保用户已授权访问作业执行时操作的HDFS/OBS目录和数据。 获取SFTP服务器使用的用户和密码,且该用户具备SFTP服务器上源文件的读取权限。如果源文件在导入后文件名要增加后缀,则该用户还需具备源文件的写入权限。 检查磁盘空间,确保没有出现告警且余量满足导入、导出数据的大小。 使用Loader从SFTP服务器导入数据时,确保SFTP服务器输入路径目录名、输入路径的子目录名及子文件名不能包含特殊字符/\"':;,中的任意字符。 如果设置的作业需要使用指定YARN队列功能,该用户需要已授权有相关YARN队列的权限。 设置任务的用户需要获取该任务的执行权限,并获取该任务对应的连接的使用权限。
  • 使用自定义列创建表 可通过指定各列及其数据类型来创建表。 命令示例: CREATE TABLE IF NOT EXISTS productdb.productSalesTable ( productNumber Int, productName String, storeCity String, storeProvince String, productCategory String, productBatch String, saleQuantity Int, revenue Int) STORED AS carbondata TBLPROPERTIES ( 'table_blocksize'='128'); 上述命令所创建的表的详细信息如下: 表1 表信息定义 参数 描述 productSalesTable 待创建的表的名称。该表用于加载数据进行分析。 表名由字母、数字、下划线组成。 productdb 数据库名称。该数据库将与其中的表保持逻辑连接以便于识别和管理。 数据库名称由字母、数字、下划线组成。 productName storeCity storeProvince procuctCategory productBatch saleQuantity revenue 表中的列,代表执行分析所需的业务实体。 列名(字段名)由字母、数字、下划线组成。 table_blocksize CarbonData表使用的数据文件的block大小,默认值为1024,最小值为1,最大值为2048,单位为MB。 如果“table_blocksize”值太小,数据加载时,生成过多的小数据文件,可能会影响HDFS的使用性能。 如果“table_blocksize”值太大,数据查询时,索引匹配的block数据量较大,某些block会包含较多的blocklet,导致读取并发度不高,从而降低查询性能。 一般情况下,建议根据数据量级别来选择大小。例如:GB级别用256,TB级别用512,PB级别用1024。 所有Integer类型度量均以BigInt类型进行处理与显示。 CarbonData遵循严格解析,因此任何不可解析的数据都会被保存为null。例如,在BigInt列中加载double值(3.14),将会保存为null。 在Create Table中使用的Short和Long数据类型在DESCRIBE命令中分别显示为Smallint和Bigint。 可以使用DESCRIBE格式化命令查看表数据大小和表索引大小。
  • CarbonData查询流程 当CarbonData首次收到对某个表(例如表A)的查询任务时,系统会加载表A的索引数据到内存中,执行查询流程。当CarbonData再次收到对表A的查询任务时,系统则不需要再加载其索引数据。 在CarbonData中执行查询时,查询任务会被分成几个扫描任务。即,基于CarbonData数据存储的HDFS block对扫描任务进行分割。扫描任务由集群中的执行器执行。扫描任务可以并行、部分并行,或顺序处理,具体采用的方式取决于执行器的数量以及配置的执行器核数。 查询任务的某些部分可在独立的任务级上处理,例如select和filter。查询任务的某些部分可在独立的任务级上进行部分处理,例如group-by、count、distinct count等。 某些操作无法在任务级上处理,例如Having Clause(分组后的过滤),sort等。这些无法在任务级上处理,或只能在任务级上部分处理的操作需要在集群内跨执行器来传输数据(部分结果)。这个传送操作被称为shuffle。 任务数量越多,需要shuffle的数据就越多,会对查询性能产生不利影响。 由于任务数量取决于HDFS block的数量,而HDFS block的数量取决于每个block的大小,因此合理选择HDFS block的大小很重要,需要在提高并行性,进行shuffle操作的数据量和聚合表的大小之间达到平衡。
  • 压缩调优 CarbonData结合少数轻量级压缩算法和重量级压缩算法来压缩数据。虽然这些算法可处理任何类型的数据,但如果数据经过排序,相似值在一起出现时,就会获得更好的压缩率。 CarbonData数据加载过程中,数据基于Table中的列顺序进行排序,从而确保相似值在一起出现,以获得更好的压缩率。 由于CarbonData按照Table中定义的列顺序将数据进行排序,因此列顺序对于压缩效率起重要作用。如果低cardinality维度位于左边,那么排序后的数据分区范围较小,压缩效率较高。如果高cardinality维度位于左边,那么排序后的数据分区范围较大,压缩效率较低。
  • 查询性能调优 CarbonData可以通过调整各种参数来提高查询性能。大部分参数聚焦于增加并行性处理和更好地使用系统资源。 Spark Executor数量:Executor是Spark并行性的基础实体。通过增加Executor数量,集群中的并行数量也会增加。关于如何配置Executor数量,请参考Spark资料。 Executor核:每个Executor内,并行任务数受Executor核的配置控制。通过增加Executor核数,可增加并行任务数,从而提高性能。 HDFS block容量:CarbonData通过给不同的处理器分配不同的block来分配查询任务。所以一个HDFS block是一个分区单元。另外,CarbonData在Spark驱动器中,支持全局block级索引,这有助于减少需要被扫描的查询block的数量。设置较大的block容量,可提高I/O效率,但是会降低全局索引效率;设置较小的block容量,意味着更多的block数量,会降低I/O效率,但是会提高全局索引效率,同时,对于索引查询会要求更多的内存。 扫描线程数量:扫描仪(Scanner)线程控制每个任务中并行处理的数据块的数量。通过增加扫描仪线程数,可增加并行处理的数据块的数量,从而提高性能。可使用“carbon.properties”文件中的“carbon.number.of.cores”属性来配置扫描仪线程数。例如,“carbon.number.of.cores = 4”。 B-Tree缓存:为了获得更好的查询特性,可以通过B-tree LRU(least recently used,最近最少使用)缓存来优化缓存内存。在driver中,B-Tree LRU缓存配置将有助于通过释放未被访问或未使用的表segments来释放缓存。类似地,在executor中,B-Tree LRU缓存配置将有助于释放未被访问或未使用的表blocks。具体可参考表2中的参数“carbon.max.driver.lru.cache.size”和“carbon.max.executor.lru.cache.size”的详细描述。
  • 配置扫描仪线程 扫描仪线程属性决定了每个分割的数据被划分的可并行处理的数据块的数量。如果数量过多,会产生很多小数据块,性能会受到影响。如果数量过少,并行性不佳,性能也会受到影响。因此,决定扫描仪线程数时,需要考虑一个分割内的平均数据大小,选择一个使数据块不会很小的值。经验法则是将单个块大小(MB)除以250得到的值作为扫描仪线程数。 增加并行性还需考虑的重要一点是集群中实际可用的CPU核数,确保并行计算数不超过实际CPU核数的75%至80%。 CPU核数约等于: 并行任务数x扫描仪线程数。其中并行任务数为分割数和执行器数x执行器核数两者之间的较小值。
  • 通过加载数据的时间删除 用户可基于特定的加载时间删除数据。 命令: DELETE FROM TABLE db_name.table_name WHERE SEGMENT.STARTTIME BEFORE date_value; 示例: DELETE FROM TABLE carbonTable WHERE SEGMENT.STARTTIME BEFORE '2017-07-01 12:07:20'; 上述命令可删除'2017-07-01 12:07:20'之前的所有segment。 有关详细信息,请参阅DELETE SEGMENT by DATE。
  • 删除结果 数据对应的segment被删除,数据将不能再被访问。可通过SHOW SEGMENTS命令显示segment状态,查看是否成功删除。 调用DELETE SEGMENT命令时,物理上而言,Segment并没有从文件系统中被删除。使用命令SHOW SEGMENTS查看Segment信息,可看见被删除的Segment的状态被标识为"Marked for Delete"。但使用SELECT * FROM tablename命令查询时,不会显示被删除的Segment的内容。 下一次加载数据且达到最大查询执行时间(由“max.query.execution.time”配置,默认为“60分钟”)后,Segment才会从文件系统中真正删除。 如果用户想要强制删除物理Segment文件,那么可以使用CLEAN FILES命令。 示例: CLEAN FILES FOR TABLE table1; 该命令将从物理上删除状态为“Marked for delete”的Segment文件。 如果在“max.query.execution.time”规定的时间到达之前使用该命令,可能会导致查询失败。“max.query.execution.time”可在“carbon.properties”文件中设置,表示一次查询允许花费的最长时间。
  • 数据加载性能调优 数据加载性能调优与查询性能调优差异很大。跟查询性能一样,数据加载性能也取决于可达到的并行性。在数据加载情况下,工作线程的数量决定并行的单元。因此,更多的执行器就意味着更多的执行器核数,每个执行器都可以提高数据加载性能。 同时,为了得到更好的性能,可在HDFS中配置如下参数。 表1 HDFS配置 参数 建议值 dfs.datanode.drop.cache.behind.reads false dfs.datanode.drop.cache.behind.writes false dfs.datanode.sync.behind.writes true