PHOENIX问题汇总

1、通过phoenix的bulk data loading批量导入数据的时候报错,无法识别date列的空值

18/05/14 13:10:52 INFO mapreduce.Job: Task Id : attempt_1525509822813_0015_m_000000_1, Status : FAILED
Error: java.lang.RuntimeException: org.apache.phoenix.schema.IllegalDataException: java.lang.IllegalArgumentException: Invalid format: "null"
at org.apache.phoenix.mapreduce.FormatToBytesWritableMapper.map(FormatToBytesWritableMapper.java:205)
at org.apache.phoenix.mapreduce.FormatToBytesWritableMapper.map(FormatToBytesWritableMapper.java:77)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:793)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
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:1917)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: org.apache.phoenix.schema.IllegalDataException: java.lang.IllegalArgumentException: Invalid format: "null"
at org.apache.phoenix.util.DateUtil$ISODateFormatParser.parseDateTime(DateUtil.java:333)
at org.apache.phoenix.util.csv.CsvUpsertExecutor$SimpleDatatypeConversionFunction.apply(CsvUpsertExecutor.java:169)
at org.apache.phoenix.util.csv.CsvUpsertExecutor$SimpleDatatypeConversionFunction.apply(CsvUpsertExecutor.java:120)
at org.apache.phoenix.util.csv.CsvUpsertExecutor.execute(CsvUpsertExecutor.java:85)
at org.apache.phoenix.util.csv.CsvUpsertExecutor.execute(CsvUpsertExecutor.java:52)
at org.apache.phoenix.util.UpsertExecutor.execute(UpsertExecutor.java:133)
at org.apache.phoenix.mapreduce.FormatToBytesWritableMapper.map(FormatToBytesWritableMapper.java:174)
... 9 more
Caused by: java.lang.IllegalArgumentException: Invalid format: "null"
at org.apache.phoenix.shaded.org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:673)
at org.apache.phoenix.util.DateUtil$ISODateFormatParser.parseDateTime(DateUtil.java:331)

... 15 more


解决办法:sqoop导入数据的时候,把空字符串和空其它类型数据都设置为'',--null-string '' --null-non-string '' ,这样phoenix碰到的时候就会自动处理为null。


2、导入的时候碰到Hbase报错

18/05/14 13:38:55 INFO mapreduce.LoadIncrementalHFiles: Trying to load hfile=hdfs://nameservice1/tmp/1cf5afb5-9f13-4c13-b7a9-b22125cbe22c/MD3U_SICK_TYPE/0/a6dc29bce6df4a7b9d3e83a4fae58c76 first=000000 last=\xE6\xB3\x8C\xE5\xB0\xBF\xE5\xA4\x96\xE7\xA7\x91


18/05/14 13:50:09 INFO client.RpcRetryingCaller: Call exception, tries=10, retries=35, started=674743 ms ago, cancelled=false, msg=row '' on table 'MD3U_SICK_TYPE' at region=MD3U_SICK_TYPE,,1526264019025.2be9fc9e013fafc7086ac5a97234d771., hostname=dw91.localdomain,60020,1525654829835, seqNum=2
18/05/14 13:51:25 INFO client.RpcRetryingCaller: Call exception, tries=11, retries=35, started=749911 ms ago, cancelled=false, msg=row '' on table 'MD3U_SICK_TYPE' at region=MD3U_SICK_TYPE,,1526264019025.2be9fc9e013fafc7086ac5a97234d771., hostname=dw91.localdomain,60020,1525654829835, seqNum=2
18/05/14 13:52:40 INFO client.RpcRetryingCaller: Call exception, tries=12, retries=35, started=825171 ms ago, cancelled=false, msg=row '' on table 'MD3U_SICK_TYPE' at region=MD3U_SICK_TYPE,,1526264019025.2be9fc9e013fafc7086ac5a97234d771., hostname=dw91.localdomain,60020,1525654829835, seqNum=2
18/05/14 13:53:55 INFO client.RpcRetryingCaller: Call exception, tries=13, retries=35, started=900443 ms ago, cancelled=false, msg=row '' on table 'MD3U_SICK_TYPE' at region=MD3U_SICK_TYPE,,1526264019025.2be9fc9e013fafc7086ac5a97234d771., hostname=dw91.localdomain,60020,1525654829835, seqNum=2
18/05/14 13:55:10 INFO client.RpcRetryingCaller: Call exception, tries=14, retries=35, started=975626 ms ago, cancelled=false, msg=row '' on table 'MD3U_SICK_TYPE' at region=MD3U_SICK_TYPE,,1526264019025.2be9fc9e013fafc7086ac5a97234d771., hostname=dw91.localdomain,60020,1525654829835, seqNum=2

解决办法:查看CM的日志,发现是因为Hbase读取HFile的时候使用了user=hbase ,但sqoop导入的数据所有者是hdfs,权限是755,所以Hbase用户没有权限rename,所以报错,调整CM中Hbase配置,把系统用户配置有hbase改为hdfs,重启Hbase,解决问题。


3、sqoop导入的数据与phoenix表字段不匹配

18/05/15 14:41:58 INFO mapreduce.Job: Task Id : attempt_1525509822813_0027_m_000000_2, Status : FAILED
Error: java.lang.RuntimeException: java.lang.IllegalArgumentException: CSV record does not have enough values (has 6, but needs 41)
at org.apache.phoenix.mapreduce.FormatToBytesWritableMapper.map(FormatToBytesWritableMapper.java:205)
at org.apache.phoenix.mapreduce.FormatToBytesWritableMapper.map(FormatToBytesWritableMapper.java:77)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:793)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
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:1917)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.IllegalArgumentException: CSV record does not have enough values (has 6, but needs 41)
at org.apache.phoenix.util.csv.CsvUpsertExecutor.execute(CsvUpsertExecutor.java:82)
at org.apache.phoenix.util.csv.CsvUpsertExecutor.execute(CsvUpsertExecutor.java:52)
at org.apache.phoenix.util.UpsertExecutor.execute(UpsertExecutor.java:133)
at org.apache.phoenix.mapreduce.FormatToBytesWritableMapper.map(FormatToBytesWritableMapper.java:174)

... 9 more

解决办法:把sqoop导入的文件copy到本地,用notepad++打开,我用的分隔符是 '\001’,能看到两个字符间有EOF,看看是不是存在错行的问题,可能是由于数据中存在\n \r 等回车换行符,导致csv文件换行了,如果是这种情况 sqoop脚本添加命令   --hive-drop-import-delims 去掉回车换行符就可以了

4、phoenix转义符的问题

18/05/16 15:54:06 INFO mapreduce.Job: Task Id : attempt_1525509822813_0044_m_000000_2, Status : FAILED
Error: java.lang.RuntimeException: java.lang.IllegalArgumentException: CSV record does not have enough values (has 40, but needs 41)
at org.apache.phoenix.mapreduce.FormatToBytesWritableMapper.map(FormatToBytesWritableMapper.java:207)
at org.apache.phoenix.mapreduce.FormatToBytesWritableMapper.map(FormatToBytesWritableMapper.java:77)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:793)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
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:1917)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.IllegalArgumentException: CSV record does not have enough values (has 40, but needs 41)
at org.apache.phoenix.util.csv.CsvUpsertExecutor.execute(CsvUpsertExecutor.java:82)
at org.apache.phoenix.util.csv.CsvUpsertExecutor.execute(CsvUpsertExecutor.java:52)
at org.apache.phoenix.util.UpsertExecutor.execute(UpsertExecutor.java:133)
at org.apache.phoenix.mapreduce.FormatToBytesWritableMapper.map(FormatToBytesWritableMapper.java:176)
... 9 more

phoenix通过Bulk Data Loading读取文件的时候可以指定-e Supply a custom escape character, default is a backslash

意思就是支持转义符,默认是 \ ,所以当你的列中存在 \时,会被转义,出现问题,解决办法是使用-e 更换转义符,或者修改代码CsvToKeyValueMapper.CsvLineParser 去掉转义符设置

### V-Ray 分布式渲染与 Phoenix 的集成 #### 配置环境准备 为了使 V-Ray 和 Phoenix 实现高效的分布式渲染,需确保所有参与节点配置一致并安装必要的软件组件。默认情况下,渲染服务器机器会利用所有可用的 GPU 设备执行 V-Ray GPU 分布式渲染任务,除非已经指定了特定设备[^1]。 #### 设置网络连接 各工作站之间应建立稳定可靠的局域网链接,以便于主控端能够顺利分配工作负载至各个子节点,并收集最终合成图像所需的信息片段。 #### 安装驱动程序和服务 确认每台计算机上都已正确安装最新版本显卡驱动以及 V-Ray 渲染器插件;同时也要保证 Phoenix FD 插件被妥善部署到 Autodesk 3ds Max 中,因为这是实现流体模拟效果的关键工具之一。 #### 创建场景文件 构建好待渲染三维模型之后,在项目设置里开启 “Distributed Rendering” 功能选项,并调整参数以适应实际硬件条件。对于复杂度较高的大型工程来说,建议采用区域划分策略来提高效率——即将整个画面分割成若干个小部分分别交给不同客户端去完成各自负责的部分后再汇总起来形成完整的成品图样。 #### 启动远程桌面服务 为了让其他成员可以方便快捷地加入协作队伍当中,有必要开放相应权限允许外部访问本机上的图形界面应用程序(如通过 Windows 远程桌面协议)。不过需要注意的是这样做可能会带来一定的安全隐患,因此务必采取适当的安全措施加以防护。 #### 执行测试渲染作业 初次尝试时最好先选取一小段动画序列作为样本进行试运行,观察是否存在任何潜在错误或性能瓶颈。一旦发现问题所在,则应及时修正直至达到满意的效果为止。 ```python import vray from phoenix import setup_simulation, start_rendering def prepare_scene(): """Prepare the scene with necessary settings.""" pass def distribute_task(nodes): """Distribute rendering tasks across multiple nodes.""" for node in nodes: connect_to_node(node) prepare_scene() nodes = ['node1', 'node2'] distribute_task(nodes) setup_simulation() # Setup simulation using Phoenix FD. start_rendering() # Start distributed rendering process. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值