0%

Impala踩坑记录

本文主要包括:

  • LLVM hit fatal error: Cannot select: intrinsic %llvm.x86.sse42.crc32.32.32

LLVM hit fatal error: Cannot select: intrinsic %llvm.x86.sse42.crc32.32.32

公司在客户集群部署CDH6.2.0完成后,使用impala时当执行group by,distinct等类似shuffle操作的时候,会报以下错误:

F0222 15:24:10.852118  5234 llvm-codegen.cc:137] de46f4fb500c7078:bed226a500000006] LLVM hit fatal error: Cannot select: intrinsic %llvm.x86.sse42.crc32.32.32
*** Check failure stack trace: ***
    @          0x279b82c
    @          0x279d0d1
    @          0x279b206
    @          0x279e7cd
    @          0x11e2a5f
    @          0x26cdedf
    @          0x26ce07d
    @          0x1bd0ef1
    @          0x1bd5b89
    @          0x195bd3e
    @          0x1bcf999
    @          0x1bd2b13
    @          0x1bda2d2
    @          0x1bdc74f
    @          0x1960fe3
    @          0x1d822d8
    @          0x2646949
    @          0x26472f3
    @          0x22afea2
    @          0x22b06f9
    @          0x22acb9f
    @          0x11f1c69
    @           0xfab618
    @           0xfacd3c
    @           0xf985b6
    @          0x11a1e3f
    @          0x11a29e9
    @          0x1790be9
    @     0x7fd33df00ea4
    @     0x7fd33dc29b0c
Picked up JAVA_TOOL_OPTIONS: -Xms4294967296 -Xmx4294967296 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/impala_impala-IMPALAD-d02b8c673dfc84046520b4d81a5ac4a3_pid32418.hprof -XX:OnOutOfMemoryError=/opt/cloudera/cm-agent/service/common/killparent.sh
Wrote minidump to /var/log/impala-minidumps/impalad/c5d3214f-3cd1-41b7-4ece8b97-363712dd.dmp

通过在网上搜索资料,发现是impala的底层对CPU指令集有要求,客户当前服务器的CPU比较老,有很多指令集不支持
查看impala源码查找所需要的指令集:
impala源码-CPU指令集

得到需要的指令集,那么我们去对比当前服务器的指令集,看是否有指令集缺失:

grep -E "ssse3|sse4_2|avx2|sse4_1|avx|popcnt|pclmulqdq" /proc/cpuinfo

发现我们的服务器中缺少很多cpu指令集
服务器CPU缺失指令集

又在Impala官网中找到安装impala的必要条件:
Impala安装的必要条件1
在CDH官网上也有相应的要求:
Impala安装的必要条件2

发现当前服务器CPU缺少avx2等指令集,导致失败。在官网上找到解决办法:
Impala禁用指令集
这个办法其实使用ChatGPT找到的,这玩意是真的牛逼

目前通过设置set disable_codegen = true;暂时解决了这个问题,但是,设置了这个以后,在数据量大的情况下,Impala的执行效率会越来越低,根本解决办法是,替换更新一点的CPU

shell直接获取impala的执行结果

直接使用impyla包(类似impala-shell)

直接使用beeline或者beeline执行sql,返回结果都是含有|等表样式,要想去除这种格式有2种方式:

  1. 使用impala-shell,并指定-B --quiet
    tenantidNum=`impala-shell -i ddp3:21000 -d tbb_athena -B --quiet -q "select count(distinct tenantid) from esp_project_schedule"`
    echo $tenantidNum
  2. 使用beeline方式,指定--outputformat=csv2 --silent=true --showHeader=false
    beeline --outputformat=csv2 --silent=true --showHeader=false -d "com.cloudera.impala.jdbc41.Driver" -u "jdbc:impala://ddp3:21050" -n tbb_athena -e "select count(distinct tenantid) from tbb_athena.esp_project_schedule;"

python连接impala

  1. 使用pip3 安装impala包:
    pip3 install impyla
    报如下错误:
        copying bitarray/py.typed -> build/lib.linux-x86_64-3.6/bitarray
        copying bitarray/__init__.pyi -> build/lib.linux-x86_64-3.6/bitarray
        copying bitarray/util.pyi -> build/lib.linux-x86_64-3.6/bitarray
        running build_ext
        building 'bitarray._bitarray' extension
        creating build/temp.linux-x86_64-3.6
        creating build/temp.linux-x86_64-3.6/bitarray
        gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/python3.6m -c bitarray/_bitarray.c -o build/temp.linux-x86_64-3.6/bitarray/_bitarray.o
        bitarray/_bitarray.c:12:20: fatal error: Python.h: No such file or directory
         #include "Python.h"
                            ^
        compilation terminated.
        error: command 'gcc' failed with exit status 1
        
        ----------------------------------------
    Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-f0tu2_83/bitarray/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-kh7xdpue-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-f0tu2_83/bitarray/
    解决办法:
    yum install python3-devel
    ## 再次执行安装操作
    pip3 install impyla

    使用jdbc方式连接impala

  2. 安装JayDeBeApi
    pip3 install JayDeBeApi
  3. 准备必要的jar包
    -rw-r----- 1 root root    61829 Jun 26 14:57 ImpalaJDBC41-2.6.3.jar
  4. 编写代码:
    # -*- encoding: utf-8 -*-
    import jaydebeapi
    import sqlparse
    import time
    
    with open('esp_project_schedule_sql.sql', 'r') as file:
       sql_content = file.read()
    
    for sql in sql_content.split(";"):
        driver_path = ["/root/gujc/jars/ImpalaJDBC41-2.6.3.jar"]
        jdbc_url = "jdbc:impala://ddp2:21051/test;AuthMech=3;UID=root;PWD=;UseSasl=0"
        conn = jaydebeapi.connect("com.cloudera.impala.jdbc41.Driver", jdbc_url,[],driver_path)
        cursor = conn.cursor()
        print(sql)
        if 'insert overwrite' in sql:
            time.sleep(5)
        cursor.execute(sql + ";")
        cursor.close()
        conn.close()

Impala设置动态资源池不生效

通过CDH界面,配置Impala的动态资源池,但是执行sql并不会走原先设定的资源队列,而是走了root.user.xxx
通过调查,需要在CM上修改配置:
impala -> 配置 -> 用于资源管理的 YARN 服务: 修改为none
impala -> 配置 -> 用于 Llama HA 的 ZooKeeper 服务: 修改为none
服务器CPU缺失指令集